3.2 C#脚本基础
Unity 5.x支持两种脚本语言:C#和JavaScript。在Unity 3D内编程,首选C#来编写脚本。C#是微软公司开发的一种面向对象编程语言。由于有强大的.NET类库支持,以及由此衍生出的很多跨平台语言。C#逐渐成为Unity 3D开发者推崇的程序语言。
3.2.1 变量
1. 变量定义
任何一个脚本中都缺不了变量,C#脚本也不例外。变量主要用于存储数据,在Unity 3D的脚本中,每个变量必须拥有唯一的名称,脚本在识读变量时采用的是字符串匹配方式,所以对变量名称大小写敏感。一旦Unity 3D脚本挂到某个Unity 3D对象上,在Unity 3D的属性面板中就会显示出该脚本中的各个公共变量(参见图3.6)。开发人员也可以在属性面板中对公共变量的值进行设置,设置后的值将会影响脚本的运行,相当于在脚本中对该变量进行了赋值。
在Unity 3D中,定义C#变量的格式如下:
数据类型 变量名称
例如,下面定义了一个整型变量age:
int age;
2. 变量赋值
可以通过对变量赋值来对其初始化,赋值时使用赋值运算符“=”。赋值的格式有两种,一种是
int age; age=5;
另一种是以字面形式初始化,形式如下:
int age=5;
3. 变量的数据类型
变量有6种数据类型。
1)整数类型
整数类型的变量取整数数值。C#将整数分为8种类型,如表3.3所示。使用时,根据数值的可能大小,选择范围最小的类型,一般常用的类型为short、int和long 3种。例如:
byte classSize=23; ushort student=2344;
表3.3 C#中内置的整数类型
2)浮点类型
浮点类型变量主要用于处理含有小数的数值数据。根据小数位数不同,C#提供了单精度浮点类型float和双精度浮点类型double,例如:
float angles=36.5f; double rate=0.253D;
C#的浮点类型如表3.4所示。
表3.4 C#的浮点类型
3)布尔类型
布尔(bool)类型表示真或假,布尔类型变量的值只能是true或false,不能将其他的值赋给布尔类型。例如:
bool b=true;
在定义全局变量时,若没有特殊要求,不用对整数类型、浮点类型和布尔类型的变量进行初始化,整数类型和浮点类型的变量默认初始化为0,布尔类型的变量默认初始化为false。
4)字符类型
为保存单个字符,C#支持字符(char)类型,字符类型的字面量是用单引号括起来的。一些特殊字符要用反斜线“\”后跟一个字符表示,称为转义字符,如表3.5所示。
Char x="X"
表3.5 转义字符
5)引用类型
引用类型是构建C#应用程序的主要数据类型,C#的所有引用类型均派生自System.Object。引用类型可以派生出新的类型,也可以包含空(null)值。引用类型变量的赋值只复制对象的引用,而不复制对象本身。
6)枚举类型
枚举类型为定义一组可以赋给变量的命名整数常量提供了一种有效的方法。编写日期相关的应用程序时,经常需要使用年、月、日、星期等数据。可以将这些数据组织成多个不同名称的枚举类型。使用枚举类型可以增强程序的可读性,在C#中使用关键字enum类声明枚举类型的变量,格式如下:
enum枚举名称 { 常量1=值1; 常量2=值2; ? 常量n=值n }
4. 变量的声明
声明变量就是指定变量的名称和类型,未经声明的变量不能在程序中使用。在C#中,声明一个变量由一个类型和跟在后面的一个或多个变量名组成,多个变量之间用逗号分开,声明变量以分号结束。例如:
int age=30; float rate=20f; string name="Tom";
在C#的变量声明之前还可以添加访问修饰符:
- private(默认修饰符),只能在本类中访问。
- protected,只能在类或派生类中访问。
- internal,只能在本项目中访问。
如果想让脚本中定义的变量在Unity 3D中的Inspector面板上显示,必须用public修饰。在声明变量时,要注意变量名的命名规则。首先,变量名必须以字母开头;其次,变量名只能由字母、数字和下画线组成,而不能包含空格、标点符号、运算符等其他符号;再次,变量名不能与C#中的关键字名称相同;最后,变量名不能与C#中的库函数名称相同。
3.2.2 表达式和运算符
1. 表达式
表达式是由运算符和操作数组成的。运算符设置对操作数进行什么样的运算,例如,加、减、乘、除都是运算符。操作数是计算机指令的组成部分,它指出了指令执行的操作所需要的数据来源。操作数包括文本、常量、变量和表达式等。例如:
int i=256; i=256/2+125; int j=2; j=j*j-2;
2. 运算符
运算符用于执行表达式运算,会针对一个以上操作数进行运算。例如2+3,操作数是2和3,而运算符是“+”。运算符的种类很多,包括算术运算符、简单赋值运算符、关系运算符、位逻辑运算符、位移运算符以及特殊算术运算符等,与JavaScript类似,在此不再赘述。
3.2.3 语句
C#的常用语句有顺序执行语句、选择分支语句和循环语句3种。
1. 顺序执行语句
当表达式中有多个运算符时,需要考虑运算符的执行顺序,也就是运算符的优先级。例如,要对一本书的信息进行记录,书名为《程序设计语言》,价格为36.5元,书的编号为243434。在代码中定义3个变量bookName、Price、bookID分别用来保存书名、价格以及编号,并分别对这3个变量进行赋值和输出,代码如下:
class Program {static void Main(string[]args) {string bookName="程序设计语言"; Console.WriteLine("书名"+bookName); float Price=36.5f; Console.WriteLine("价格"+Price); string bookID="243434"; Console.WriteLine("编号"+bookID);} }
在该实例中,首先定义变量,为其赋值,然后输出变量的值,程序是自上而下地一行一行顺序执行。
2. 选择分支语句
在日常生活中,并非所有的事情都能按部就班地进行,程序也一样。为了实现一定的目标,经常需要改变程序语句执行的顺序。在程序中,有时需要在满足某种条件时再执行某一语句。为了达到目标而进行选择的语句就是选择分支语句。
1)if语句
一个if语句后可跟一个可选的else语句,else语句在布尔表达式为假时执行。C#中if…else语句的语法如下:
if(布尔表达式) {如果布尔表达式为真执行的语句 } else {如果布尔表达式为假执行的语句 }
如果布尔表达式为true,则执行if块内的代码;如果布尔表达式为false,则执行else块内的代码。
一个if语句后可跟一个可选的else if…else语句,这种形式可用于测试多种条件。C#中if…else if…else语句的语法如下:
if(布尔表达式1) {当布尔表达式1为真时执行的语句} else if(布尔表达式2) {当布尔表达式2为真时执行的语句} else if(布尔表达式3) {当布尔表达式3为真时执行的语句} else {当上面的条件都不为真时执行的语句}
2)switch语句
当程序做条件判断时,可以用if…else语句,但是当条件很多时,如果还用if…else语句是很麻烦的。为了解决这个问题,C#设置了分支语句switch。其语法格式如下:
switch(值) {case值1:语句1; break; case值2:语句2; break; · · · case值n:语句n; break; }
当switch后面的值取某一值时,就执行相应case后面的语句。例如,当值是值1时,执行语句1;当值是值2时,执行语句2……当值是n时,执行语句n。
3. 循环语句
1)do…while循环
do…while循环是在循环的尾部检查条件。do…while循环与while循环类似,但是do…while循环至少会确保一次循环。C#中的do…while循环语法如下:
do{ 语句 }while(条件);
注意,条件表达式出现在循环的尾部,所以循环中的语句会在条件被测试之前至少执行一次。如果条件为真,控制流会转回上面的do,重新执行循环中的语句。这个过程会不断重复,直到给定条件变为假为止。
2)while循环
在C#中while循环是常用的一种循环语句,while循环的特点是直到条件为假时才跳出循环。C#中的while循环的语法如下:
while(条件) {语句}
在这里,语句可以是一个语句,也可以是几个语句组成的代码块。条件可以是任意的表达式,当为任意非零值时都为真。当条件为真时执行循环;当条件为假时,程序流将继续执行紧接着循环的下一条语句。while循环的关键点是循环可能一次都不会执行。当条件测试的结果为假时,会跳过循环主体,直接执行while循环的下一条语句。
3)for循环
for循环适合指定循环次数的应用,在使用时,需初始化一个作为计数器的变量值。例如:
for(int i=1;i<=10;i++) { Console.WriteLine("{0}, i"); }
上面的for语句声明了计数器变量后,使用分号分开,接着给出条件判断的表达式i2=10,再使用分号分开,最后给出对计算器变量的操作i++。如果把i++放在循环体内也是可以的。
3.2.4 函数
在Unity 3D中,C#脚本需要预先载入类库,代码示例如下:
using UnityEngine; using System.Collections; public class NewBehaviourScript:MonoBehaviour{ }
其中,NewBehaviourScript是脚本的名称,它必须和脚本文件的名称一致(如果不同,脚本无法在物体上被执行)。所有游戏执行语句都包含在这个继承自MonoBehaviour类的自创脚本中。Unity 3D脚本中的常用函数如下:
Update(),正常更新,创建JavaScript脚本时默认添加这个方法,每一帧都会由系统调用一次该方法。
LateUpdate(),推迟更新,此方法在Update()方法执行完后调用,每一帧都调用一次。
FixedUpdate(),置于这个函数中的代码每隔一定时间执行一次。
Awake(),脚本唤醒,用于脚本的初始化,在脚本生命周期中执行一次。
Start(),在Update()之前、Awake()之后执行。Start()函数和Awake()函数的不同点在于Start()函数仅在脚本启用时执行。
OnDestroy(),当前脚本销毁时调用。
OnGUI(),绘制游戏界面的函数,因为每一帧要执行多次,所以一些时间相关的函数要尽量避免直接在该函数内部使用。
OnCollisionEnter(),当一个游戏对象与另外的游戏对象碰撞时执行这个函数。
OnMouseDown(),当鼠标在一个载有GUI元素(GUI Element)或碰撞器(Collider)的游戏对象上按下时执行该函数。
OnMouseOver(),当鼠标在一个载有GUI元素或碰撞器的游戏对象上经过时执行该函数。
OnMouseEnter(),鼠标进入物体范围时执行该函数。和OnMouseOver()不同,OnMouseEnter()函数只执行一次。
OnMouseExit(),鼠标离开物体范围时执行该函数。
OnMouseUp(),当鼠标释放时执行该函数。
OnMouseDrag(),按住鼠标拖动对象时执行该函数。