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

目录

1 C#基本语法格式

[1.1 基础规则](#1.1 基础规则)

[1.2 以if为例子](#1.2 以if为例子)

[2 一些写法](#2 一些写法)

[2.1 时间相关](#2.1 时间相关)

[2.2 对数写法](#2.2 对数写法)

[2.3 关于使用random](#2.3 关于使用random)

[2.4 UnityEngine.Random.value](#2.4 UnityEngine.Random.value)

[2.5 PerlinNoise 函数](#2.5 PerlinNoise 函数)

[PerlinNoise 函数本身的输出范围](#PerlinNoise 函数本身的输出范围)

[3 各种报错](#3 各种报错)

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

[3.1 error cs1001; identifier expected](#3.1 error cs1001; identifier expected)

[3.2 error CS0103: The name 'Math' does not exist in the current context](#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.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.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.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.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.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.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 随机相关的报错](#3.9 随机相关的报错)

[error CS0104: 'Random' is an ambiguous reference between 'UnityEngine.Random' and 'System.Random'](#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'](#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) (其中 xy 为传入的坐标参数),它返回的结果最小是 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);

相关推荐
Godlovesea19 分钟前
ubuntu控制器多网口配置
开发语言·php
web1368856587141 分钟前
rust教程 第一章 —— 初识rust
开发语言·后端·rust
songroom42 分钟前
Rust : tokio中select!
开发语言·后端·rust
dubochao_xinxi44 分钟前
QT5 在某些系统出现qt.qpa.xcb: could not connect
开发语言·qt
blueman88881 小时前
QWidget应用封装为qt插件,供其他qt应用调用
开发语言·qt
qincjun1 小时前
Qt仿音乐播放器:设置窗口、部件属性
开发语言·qt
编码小哥1 小时前
C++线程同步和互斥
开发语言·c++
qincjun1 小时前
Qt仿音乐播放器:动画类
开发语言·qt
L.S.V.1 小时前
Java 溯本求源之基础(三十)——封装,继承与多态
java·开发语言
游客5201 小时前
设计模式-创建型-工厂方法模式
开发语言·python·设计模式·工厂方法模式