当前位置: 首页 > article >正文

Unity学习1:初接触,C#的一些基础,和相关报错

目录

1 C#基本语法格式

1.1 基础规则

1.2 以if为例子

2 一些写法

2.1 时间相关

2.2 对数写法

2.3 关于使用random

2.4 UnityEngine.Random.value

2.5 PerlinNoise  函数

PerlinNoise 函数本身的输出范围

3 各种报错

3.0 unity里对C#报错内容超级详细

3.1 error cs1001; identifier expected

3.2 error CS0103: The name 'Math' does not exist in the current context

3.3 error CS0266: Cannot implicitly convert type 'double' to 'float'. An explicit conversion exists (are you missing a cast?)

3.4 error CS0103: The name 'jointRecoil' does not exist in the current context

3.5 error CS1503: Argument 1: cannot convert from 'double' to 'float

3.6 error CS0103: The name 'someMethod' does not exist in the current context

3.7 error CS0117: 'Math' does not contain a definition for 'Norm'

3.8 error CS0246: The type or namespace name 'NextDouble' could not be found (are you missing a using directive or an assembly reference?)

3.9  随机相关的报错

error CS0104: 'Random' is an ambiguous reference between 'UnityEngine.Random' and 'System.Random'

3.10 error CS0029: Cannot implicitly convert type '(double newX1, double newY1)' to 'UnityEngine.Vector2'


1 C#基本语法格式

1.1 基础规则

  • 大小写敏感
  • 命名只能以字母或下划线开头
  • 注释语句 //   /* */
  • 强类型语言,每个变量,表达式,编译时必须先声明,明确的类型
  • 引用包,using System;  对比python用的是 import numpy

1.2 以if为例子

if ()

{

 语句;

}

else if ()

{

 语句;

}

else

{

 语句;

}

2 一些写法

2.1 时间相关

Time.deltaTime 在 Unity 游戏开发中是一个非常重要的属性,它表示从上一帧到当前帧的时间间隔。其单位是秒,但是在 Unity 内部,它被处理成了浮点数,所以它并不是精确到毫秒。

Time.deltaTime 的主要用途是用于计算每帧应该移动多远,或者是计算动画应该播放多少。如果你在更新函数(如 Update() 或 FixedUpdate())中使用 Time.deltaTime,它可以确保即使目标平台的性能差异巨大,你的游戏动画和物理更新仍然能正常运行。

单位是秒?

2.2 对数写法

  • 自然对数,
  • double naturalLog = Math.Log(number);
  • // 计算以10为底的对数
  • double log10 = Math.Log10(number)

有些其他地方写法是 log(number, e) log(number, 10) 这样的

2.3 关于使用random

  • using System;
  • Random random = new Random();
  • int randomInt = random.Next(0, int.MaxValue);

2.4 UnityEngine.Random.value

UnityEngine.Random.value 返回[0,1] 

编程小知识之 Random接口返回值_unityengine.random.value-CSDN博客文章浏览阅读1k次。本文简述了 Random 接口返回值的一些相关信息平日工作中,(伪)随机数的使用一定是避不开的,拿 C# 为例,System 命名空间下的 Random 类型一般都是我们生成(伪)随机数的第一选择:var rand = new System.Random();var val = rand.NextDouble();Unity 中也在 UnityEngine 命名空间下提供了自己的 R..._unityengine.random.valuehttps://blog.csdn.net/tkokof1/article/details/84328704

2.5 PerlinNoise  函数

PerlinNoise 函数本身的输出范围

在 Unity 中, Mathf.PerlinNoise 函数的返回值范围是在 [0, 1] 区间内。也就是说,对于单独调用 Mathf.PerlinNoise(x, y) (其中 x 和 y 为传入的坐标参数),它返回的结果最小是 0 ,最大是 1

currentJitter = new Vector2( Mathf.PerlinNoise(Time.time * 2, 0f) - 0.5f,Mathf.PerlinNoise(0f, Time.time * 2) - 0.5f ) * (2f * 0.1);

  • 原始 Perlin 噪声值范围:Mathf.PerlinNoise [0, 1] 
  • 减去 0.5 后范围:[-0.5, 0.5]
  • 乘以 0.2 后范围:[-0.1, 0.1]

3 各种报错

3.0 unity里对C#报错内容超级详细

unity里,会自动报错,很好用

比如 cross.cs(28,19):error cs1001; identifier expected

表示 

  • cross.cs 文件的
  • (line 28,19字符) 报错,
  • 错误类型cs1001
  • 错误内容 ; identifier expected

3.1 error cs1001; identifier expected

; identifier expected 表示,希望/需要这有;但是实际缺少标识符

一般是;

int = 10; // 这里缺少了变量名

Object obj = new(); // 这里缺少类名

3.2 error CS0103: The name 'Math' does not exist in the current context

  • 很多方法,都需要引用math下的方法,比如math.sin()
  • 但是,使用math包,和python一样,需要先导入
  • C#需要文件开头加一句,using System;

3.3 error CS0266: Cannot implicitly convert type 'double' to 'float'. An explicit conversion exists (are you missing a cast?)

error CS0266: Cannot implicitly convert type 'double' to 'float'. An explicit conversion exists (are you missing a cast?)

报错解释:

错误 CS0266 表示不能隐式地将 double 类型转换为 float 类型。由于 double 类型具有比 float 更大的有效数字范围和精度,因此不能直接将 double 值赋给需要 float 类型的变量。

解决方法:

使用显式转换:通过使用强制转换操作符将 double 值转换为 float 类型。例如,如果有一个 double 变量 d,你可以通过 (float)d 来得到它的 float 近似值。

 

double x = 123.456;
float f = (float) x;

因为C# 是严格声明的,强类型的语言

有些地方要求是 double类型的,但是在其他一些地方需要用float,所以需要转换,不能直接用

为什么不能直接用,比如 double 直接当成float 会丢失部分数据的

C# 错误 CS0266 表示你正在尝试将 double(双精度浮点数)赋值给 float(单精度浮点数)变量,而没有进行显式转换。这是因为 double 的精度(64 位)高于 float(32 位),从高精度类型隐式转换为低精度类型可能会导致数据丢失。

以下是修复此问题的方法,以及说明和最佳实践:

1. 显式转换:

最常见和最直接的解决方案是使用显式转换:

3.4 error CS0103: The name 'jointRecoil' does not exist in the current context

  • error CS0103: The name 'jointRecoil' does not exist in the current context
  • 报错解释:

    错误 CS0103 表示名为 'jointRecoil' 的标识符在当前上下文中不存在。这通常意味着你在代码中引用了一个变量、方法或类型,但是在你的当前作用域或者当前的命名空间中,编译器找不到这个名称的定义。

  • 变量 jointRecoil 没有先声明类型就直接使用了!不行,必须先声明类型

3.5 error CS1503: Argument 1: cannot convert from 'double' to 'float

error CS1503: Argument 1: cannot convert from 'double' to 'float

报错解释:

错误 CS1503 表示方法调用的参数类型不匹配。具体来说,是指方法期望的是一个 float 类型的参数,但是你提供的是一个 double 类型的参数。

需要转换数值类型

3.6 error CS0103: The name 'someMethod' does not exist in the current context

error CS0103: The name 'someMethod' does not exist in the current context

使用的 someMethod 这个方法,并没有先在代码中实现

3.7 error CS0117: 'Math' does not contain a definition for 'Norm'

error CS0117: 'Math' does not contain a definition for 'Norm'

C# 里并没有默认的 Math.norm()  生成正态分布的方法

错误解释:

错误 CS0117 表示您尝试调用的 Math 类中不存在名为 Norm 的方法或定义。这通常意味着您正在尝试使用不存在的成员来执行操作。

3.8 error CS0246: The type or namespace name 'NextDouble' could not be found (are you missing a using directive or an assembly reference?)

error CS0246: The type or namespace name 'NextDouble' could not be found (are you missing a using directive or an assembly reference?)


错误解释:

错误 CS0246 表示编译器无法在当前上下文中找到名为 'NextDouble' 的类型或命名空间。这通常意味着 'NextDouble' 没有正确引用或定义。

就是没有先进行声明,确定明确的类型

解决方法:

确保您已经引用了包含 'NextDouble' 方法的命名空间。对于 .NET 中的随机数生成,您需要引用 System 命名空间,因为 NextDouble 方法定义在 System 命名空间下的 Random 类中。

3.9  随机相关的报错

error CS0104: 'Random' is an ambiguous reference between 'UnityEngine.Random' and 'System.Random'

错误 CS0104:“Random”是不明确的引用,存在于“UnityEngine.Random”和“System.Random”之间。

这个错误通常发生在 Unity (一个游戏开发引擎) 中,因为 UnityEngineSystem 命名空间都包含一个名为 Random 的类。当你在代码中只使用 Random 时,编译器不知道你指的是哪一个。

以下是几种解决方法:

1. 明确指定命名空间(推荐):

最常见也是最推荐的解决方案是在声明或使用 Random 类时指定完整的命名空间

UnityEngine.Random.Range(0, 10); // 生成一个介于 0(包含)和 10(不包含)之间的随机整数
float randomFloat = UnityEngine.Random.value; // 生成一个介于 0.0f 和 1.0f(包含)之间的随机浮点数

3.10 error CS0029: Cannot implicitly convert type '(double newX1, double newY1)' to 'UnityEngine.Vector2'

错误 CS0029:“无法将类型‘(double newX1, double newY1)’隐式转换为‘UnityEngine.Vector2’”表示你正尝试将类型为 (double newX1, double newY1)(一个包含两个 double 值的元组)的值直接赋给类型为 UnityEngine.Vector2 的变量。C# 不会自动将元组转换为 Vector2

以下是如何修复此问题以及每种解决方案的原理:

1. 显式创建 Vector2

这是最常见和推荐的解决方案。使用元组的值作为 x 和 y 分量创建一个新的 Vector2 对象。

using UnityEngine;

// ... 其他代码 ... (double newX1, double newY1) myTuple = (5.0, 3.2); // 示例元组

Vector2 myVector = new Vector2((float)myTuple.newX1, (float)myTuple.newY1);

// 或者使用解构语法,更简洁

(C# 7.0 及更高版本):

(double x, double y) = myTuple; Vector2 myVector2 = new Vector2((float)x, (float)y);

        spearRadius=0.1*Math.Log(bulletsNumInCd*5);

        double randomFloat = UnityEngine.Random.value;

        angle1 = UnityEngine.Random.value * 360 ;

        radius1 =UnityEngine.Random.value * spearRadius ;

        newX1=radius1* Math.Cos(angle1*Math.PI/180);

        newY1=radius1* Math.Sin(angle1*Math.PI/180);

        //newPos1 = newX1 , newY1 ;

        Vector2 newPos1 = new Vector2((float)newX1, (float)newY1);

不能这么写

newPos1 = (newX1, newY1);

newPos1 = ((float)newX1, (float)newY1);

必须

最常见的错误是尝试用逗号来创建一个类似“元组”的东西。C# 中没有内置的用逗号直接创建坐标或点的语法。你需要使用合适的类型,例如 PointPointFVector2 或自定义的结构体。

根据你的项目类型和需求选择合适的方法。如果是在 Windows 窗体或 WPF 应用程序中处理图形,PointPointF 通常就足够了。如果需要向量运算,则使用 Vector2。如果需要更复杂的表示,则创建自定义的结构体。

请记住进行必要的类型转换,因为 Math.CosMath.Sin 返回 double,而 Point 使用 intPointFVector2 使用 float

必须用下面这种结构体才能生成

Vector2 newPos1 = new Vector2((float)newX1, (float)newY1);


http://www.kler.cn/a/453298.html

相关文章:

  • ubuntu停止.netcore正在运行程序的方法
  • 企业销售人员培训系统|Java|SSM|VUE| 前后端分离
  • 变频器在电动机的节能原理是什么?
  • AI无人直播详解
  • docker 搭建集群
  • 使用驱动器光盘需格式化:深度解析与数据恢复全攻略
  • 前端(八)js介绍(1)
  • 使用Docker启动Linux Riscv版
  • 什么是公网对讲机?公网对讲机有哪些好的品牌
  • 游戏引擎学习第59天
  • Database.NET——一款轻量级多数据库客户端工具
  • 微软 CEO 萨提亚・纳德拉:回顾过去十年,展望 AI 时代的战略布局
  • 网络安全研究中的网络攻击
  • #渗透测试#漏洞利用#红蓝攻防#信息泄露漏洞#Swagger信息泄露漏洞的利用
  • 5G -- 网络安全
  • PDF书籍《手写调用链监控APM系统-Java版》第4章 SPI服务模块化系统
  • 在 DevOps 中,如何应对技术债务和系统复杂性,以确保可持续的研发效能和创新?
  • 视频字幕生成工具(类似 MemoAI)简介
  • #!/bin/bash^M 坏的解释器:没有哪个文件或者目录
  • C语言基础:指针(数组指针与指针数组)
  • sentinel笔记10- 限流规则持久化(下)
  • TypeScript 与后端开发Node.js
  • 实时、准实时、离线事件
  • uniapp中的条件编译
  • 【自动驾驶】3 激光雷达②
  • OpenLayers实现渐变透明填充和光效边界