十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Unity C# 脚本学习笔记:变量、数据类型与类型转换

Unity C# 脚本学习笔记:变量、数据类型与类型转换 一、先搞清楚值类型和引用类型C# 是强类型语言每个变量在声明时就要确定类型之后不能随便改成别的类型。不同数据类型决定了变量存的是什么、占多少内存、能做什么操作。在 Unity 脚本里我们常接触的数据类型可以分成两大类值类型直接存数据本身。比如int、float、bool、char、struct、enum。它们通常分配在栈上读写快。引用类型存的是数据在内存中的地址实际数据在堆上。比如string、class、数组、委托。赋值时拷贝的是引用两个变量可能指向同一个对象。这个区别很重要尤其是当你把一个对象赋值给另一个变量时改动一个可能会影响另一个而值类型就不会。后面讲类和对象时还会再提到。二、常用内置数据类型下面是我在 Unity 里最常用到的几种类型每种都结合具体场景说一下。1. 整型类型描述范围int32 位有符号整数约 -21 亿 ~ 21 亿long64 位有符号整数很大一般用不到short16 位有符号整数-32768 ~ 32767byte8 位无符号整数0 ~ 255Unity 中最常用的就是int比如分数、索引、层级、数量等。其他几个类型很少直接用到了解即可。intscore100;intenemyCount5;需要注意int是有符号的如果确认数值不会为负可以考虑用uint无符号 int但 Unity 内部很多 API 还是用int所以保持一致就好。2. 浮点型类型描述精度float32 位单精度浮点数约 7 位有效数字double64 位双精度浮点数约 15-16 位decimal128 位高精度小数金融计算Unity 里几乎所有的位置、速度、时间都用float。写float变量时一定要记得加后缀f否则编译器会当成double然后报错。floatspeed5.5f;doublepreciseValue3.14159265358979;// 很少用Unity API 大多只接受 floatdouble在 Unity 中偶尔用于需要高精度的计算但大多数 API 接收float所以最终还是要转。decimal基本不会在游戏逻辑里出现。3. 布尔类型bool只有两个值true和false用来做条件判断、开关状态。boolisGroundedtrue;boolhasKeyfalse;在if语句里直接写变量名就行不用写 true。4. 字符与字符串char单个 Unicode 字符用单引号。string一串字符用双引号。它是引用类型但使用起来像值类型内容不可变修改时会创建新字符串。chargradeA;stringplayerNameUnityLearner;字符串在游戏中常用但要注意频繁拼接字符串会产生 GC 垃圾后面讲性能优化时会再提。5. 枚举类型枚举是一种自定义值类型用来定义一组有名字的常量让代码读起来更直观。publicenumGameState{MainMenu,Playing,Paused,GameOver}GameStatecurrentStateGameState.Playing;相比直接用int表示状态0主菜单1游戏中…枚举可读性高得多也避免魔法数字。6. 结构体struct结构体是值类型适合表示轻量级的数据集合比如坐标、颜色、玩家属性等。Unity 内置的Vector3、Quaternion都是结构体。publicstructPlayerData{publicstringname;publicintlevel;publicfloathealth;}结构体和类的区别在于结构体赋值时是复制整个值类是复制引用。所以结构体适合小数据且不需要继承的场景。三、变量的声明与初始化声明变量很简单类型 变量名 初始值;。初始值可以不写但使用前必须赋值否则编译报错。inthealth;// 声明暂时没值health100;// 赋值floatmana50.0f;// 声明并直接初始化C# 还支持var关键字让编译器自动推断类型。但要注意var只是语法糖类型在编译时就确定了不是动态类型。vardamage25;// 推断为 intvarplayerNameTom;// 推断为 string我的建议如果类型很明显比如var x 10;用var没问题但如果类型不那么一目了然最好还是写出具体类型提高代码可读性。在 Unity 里我通常直接写明确类型因为一些组件类型很长用var反而省事但也要看上下文。四、常量与只读字段const编译时常量声明时必须赋值之后不能改。适合放一些固定值比如最大生命值、重力常数。readonly运行时常量可以在声明时或构造函数里赋值之后也不能改。适合需要在不同实例中可能不同的值。publicconstintMaxHealth100;publicreadonlyfloatgravity9.81f;在 Unity 中要注意const字段不会显示在 Inspector 面板上也就是说如果你想让策划在 Inspector 里调整数值就不能用const。readonly也不会序列化。所以如果想暴露给 Inspector 调整用public普通字段或[SerializeField] private。五、类型转换不同类型之间经常需要转换C# 里分为隐式转换和显式转换两种。1. 隐式转换自动的当目标类型能安全容纳源类型且不会丢失精度时编译器会自动转换。intintValue100;longlongValueintValue;// int 转 long安全floatfloatValueintValue;// int 转 float安全但可能丢失精度大数时int到float虽然不用写转换但float只有约 7 位有效数字太大的int转过去会丢失精度。一般游戏里数值不大问题不大。2. 显式转换强制转换当转换可能丢失数据或精度时需要手动写(目标类型)。floatfloatValue3.14f;intintValue(int)floatValue;// 结果是 3直接截断小数部分不是四舍五入doubledoubleValue123.456;inttruncated(int)doubleValue;// 123注意强制转换可能溢出或精度损失使用时要想清楚。比如float转int会把小数全部舍去如果希望四舍五入要用Mathf.RoundToInt。3. 使用 Convert 类System.Convert提供了一些转换方法如果转换失败会抛异常。stringnumberStr123;intnumberConvert.ToInt32(numberStr);// 123stringfloatStr3.14;floatpiConvert.ToSingle(floatStr);// 3.14f但在 Unity 中更常用的是Parse或TryParse因为Convert遇到非法输入会直接抛异常影响游戏稳定性。4. 字符串转数值Parse 和 TryParseParse字符串格式错误时抛异常。TryParse安全转换返回bool表示是否成功推荐使用。stringinput42;intresult;if(int.TryParse(input,outresult)){Debug.Log(转换成功result);}else{Debug.Log(转换失败可能不是数字);}在游戏里用户输入或外部数据往往不可靠一定要用TryParse避免游戏崩溃。除非你百分百确定字符串一定合法否则不要用Parse或Convert。5. 装箱与拆箱值类型转为object类型叫装箱反向叫拆箱。这个操作会带来性能开销因为要在堆上分配内存。intvalue10;objectboxedvalue;// 装箱intunboxed(int)boxed;// 拆箱在Update等频繁调用的地方尽量避免装箱拆箱否则容易产生 GC 垃圾导致卡顿。例如不要把值类型塞进ArrayList旧的非泛型集合改用Listint这样的泛型集合。六、总结变量和数据类型是 C# 最基础的部分但很多坑都藏在这里float不加f、字符串转换用错方法、值类型和引用类型搞混等等。建议刚开始学的时候多动手试把各种类型转换跑一跑看看输出结果比只看概念记得牢。
返回列表