Unity 3D C#脚本基础

Unity 5.x 支持两种脚本语言:C#JavaScript。在 Unity 3D 内编程,首选 C# 来编写脚本。

C# 是微软公司开发的一种面向对象编程语言。由于有强大的 .NET 类库支持,以及由此衍生出的很多跨平台语言。C# 逐渐成为 Unity 3D 开发者推崇的程序语言。

变量

1) 变量定义

任何一个脚本中都缺不了变量,C# 脚本也不例外。

变量主要用于存储数据,在 Unity 3D 的脚本中,每个变量必须拥有唯一的名称,脚本在识读变量时采用的是字符串匹配方式,所以对变量名称大小写敏感。

一旦 Unity 3D 脚本挂到某个 Unity 3D 对象上,在 Unity 3D 的属性面板中就会显示出该脚本中的各个公共变量。开发人员也可以在属性面板中对公共变量的值进行设置,设置后的值将会影响脚本的运行,相当于在脚本中对该变量进行了赋值。

在 Unity 3D 中,定义 C# 变量的格式如下:

数据类型 变量名称

例如,下面定义了一个整型变量 age:
int age;

2) 变量赋值

可以通过对变量赋值来对其初始化,赋值时使用赋值运算符“=”。

赋值的格式有两种,一种是
int age;
age=5;
另一种是以字面形式初始化,形式如下:
int age=5;

3) 变量的数据类型

变量有 6 种数据类型。

整数类型

整数类型的变量取整数数值。C# 将整数分为 8 种类型,如下表所示。使用时,根据数值的可能大小,选择范围最小的类型,一般常用的类型为 short、int 和 long 3 种。例如:
byte classSize=23;
ushort student=2344;
类型 说 明 取值范围
sbyte 有符号 8 位整数 -128 〜127
byte 无符号 8 位整数 0 〜255
short 有符号 16 位整数 -32768〜32767
ushort 无符号 16 位整数 0〜65535
int 有符号 32 位整数 -2147489648〜2147483647
uint 无符号 32 位整数 0〜42994967295
long 有符号 64 位整数 -263 〜263
ulong 无符号 64 位整数 0 〜264
 

浮点类型

浮点类型变量主要用于处理含有小数的数值数据。根据小数位数不同,C# 提供了单精度浮点类型 float 和双精度浮点类型 double,例如:
float angles=36.5f;
double rate=0.253D;
C# 的浮点类型如下表所示。

类型 说 明 取值范围
float 32位单精度浮点类型 -2128〜2128
double 64位单精度浮点类型 一21024 〜21024
 

布尔类型

布尔(bool)类型表示真或假,布尔类型变量的值只能是 true 或 false,不能将其他的值赋给布尔类型。例如:
bool b=true;
在定义全局变量时,若没有特殊要求,不用对整数类型、浮点类型和布尔类型的变量进行初始化,整数类型和浮点类型的变量默认初始化为 0,布尔类型的变量默认初始化为 false。

字符类型

为保存单个字符,C# 支持字符(char)类型,字符类型的字面量是用单引号括起来的。一些特殊字符要用反斜线“\”后跟一个字符表示,称为转义字符,如下表所示。

Char x="X"

转义字符 含义 转义字符 含义
\' 单引号 \f 换页
\" 双引号 \n 换行
\\ 反斜线 \r 回车
\0 \t 水平制表符
\a 报警 \v 垂直制表符
\b 退格    

引用类型

引用类型是构建 C# 应用程序的主要数据类型,C# 的所有引用类型均派生自 System.Object。

引用类型可以派生出新的类型,也可以包含空(null)值。引用类型变量的赋值只复制对象的引用,而不复制对象本身。

枚举类型

枚举类型为定义一组可以赋给变量的命名整数常量提供了一种有效的方法。

编写日期相关的应用程序时,经常需要使用年、月、日、星期等数据。可以将这些数据组织成多个不同名称的枚举类型。

使用枚举类型可以增强程序的可读性,在 C# 中使用关键字 enum 类声明枚举类型的变量,格式如下:
enum枚举名称
{ 
常量1=值1;
常量2=值2;
?
常量n=值n
}

变量的声明

声明变量就是指定变量的名称和类型,未经声明的变量不能在程序中使用。

在 C# 中,声明一个变量由一个类型和跟在后面的一个或多个变量名组成,多个变量之间用逗号分开,声明变量以分号结束。例如:
int age=30;
float rate=20f;
string name="Tom";
在 C# 的变量声明之前还可以添加访问修饰符:
  • private(默认修饰符),只能在本类中访问。
  • protected,只能在类或派生类中访问。
  • internal,只能在本项目中访问。
如果想让脚本中定义的变量在 Unity 3D 中的 Inspector 面板上显示,必须用 public 修饰。

在声明变量时,要注意变量名的命名规则:
  • 变量名必须以字母开头;
  • 变量名只能由字母、数字和下画线组成,而不能包含空格、标点符号、运算符等其他符号;
  • 变量名不能与 C# 中的关键字名称相同;
  • 变量名不能与 C# 中的库函数名称相同。

表达式和运算符

1) 表达式

表达式是由运算符和操作数组成的。

运算符设置对操作数进行什么样的运算,例如,加、减、乘、除都是运算符。

操作数是计算机指令的组成部分,它指出了指令执行的操作所需要的数据来源。

操作数包括文本、常量、变量和表达式等。例如:
int i=256;
i=256/2+125;
int j=2;
j=j*j-2;

2) 运算符

运算符用于执行表达式运算,会针对一个以上操作数进行运算。例如 2+3,操作数是 2 和 3,而运算符是“+”。

运算符的种类很多,包括算术运算符、简单赋值运算符、关系运算符、位逻辑运算符、位移运算符以及特殊算术运算符等,与 JavaScript 类似,在此不再赘述。

语句

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) 选择分支语句

在日常生活中,并非所有的事情都能按部就班地进行,程序也一样。为了实现一定的目标,经常需要改变程序语句执行的顺序。

在程序中,有时需要在满足某种条件时再执行某一语句。为了达到目标而进行选择的语句就是选择分支语句。

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
{当上面的条件都不为真时执行的语句}

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) 循环语句

do…while 循环

do…while 循环是在循环的尾部检查条件。do…while 循环与 while 循环类似,但是 do…while 循环至少会确保一次循环。

C# 中的 do…while 循环语法如下:

do{
语句
}while(条件);

注意,条件表达式出现在循环的尾部,所以循环中的语句会在条件被测试之前至少执行一次。如果条件为真,控制流会转回上面的 do,重新执行循环中的语句。这个过程会不断重复,直到给定条件变为假为止。

while循环

在 C# 中 while 循环是常用的一种循环语句,while 循环的特点是直到条件为假时才跳出循环。C# 中的 while 循环的语法如下:

while(条件)
{语句}

在这里,语句可以是一个语句,也可以是几个语句组成的代码块。条件可以是任意的表达式,当为任意非零值时都为真。当条件为真时执行循环;当条件为假时,程序流将继续执行紧接着循环的下一条语句。

while 循环的关键点是循环可能一次都不会执行。当条件测试的结果为假时,会跳过循环主体,直接执行 while 循环的下一条语句。

for 循环

for 循环适合指定循环次数的应用,在使用时,需初始化一个作为计数器的变量值。例如:
for(int i=1;i<=10;i++){
    Console.WriteLine("{0}, i");
}
上面的 for 语句声明了计数器变量后,使用分号分开,接着给出条件判断的表达式 i2=10,再使用分号分开,最后给出对计算器变量的操作 i++。如果把 i++ 放在循环体内也是可以的。

函数

在 Unity 3D 中,C# 脚本需要预先载入类库,代码示例如下:
using UnityEngine;
using System.Collections;
public class NewBehaviourScript:MonoBehaviour{
}
其中,NewBehaviourScript 是脚本的名称,它必须和脚本文件的名称一致(如果不同,脚本无法在物体上被执行)。

所有游戏执行语句都包含在这个继承自 MonoBehaviour 类的自创脚本中。

Unity 3D脚本中的常用函数如下:

1) Update()

正常更新,创建 JavaScript 脚本时默认添加这个方法,每一帧都会由系统调用一次该方法。

2) LateUpdate()

推迟更新,此方法在 Update() 方法执行完后调用,每一帧都调用一次。

3) FixedUpdate()

置于这个函数中的代码每隔一定时间执行一次。

4) Awake()

脚本唤醒,用于脚本的初始化,在脚本生命周期中执行一次。

5) Start()

在 Update() 之前、Awake() 之后执行。Start() 函数和 Awake() 函数的不同点在于 Start() 函数仅在脚本启用时执行。

6) OnDestroy()

当前脚本销毁时调用。

7) OnGUI()

绘制游戏界面的函数,因为每一帧要执行多次,所以一些时间相关的函数要尽量避免直接在该函数内部使用。

8) OnCollisionEnter()

当一个游戏对象与另外的游戏对象碰撞时执行这个函数。

9) OnMouseDown()

当鼠标在一个载有 GUI 元素(GUI Element)或碰撞器(Collider)的游戏对象上按下时执行该函数。

10) OnMouseOver()

当鼠标在一个载有 GUI 元素或碰撞器的游戏对象上经过时执行该函数。

11) OnMouseEnter()

鼠标进入物体范围时执行该函数。和 OnMouseOver() 不同,OnMouseEnter() 函数只执行一次。

12) OnMouseExit()

鼠标离开物体范围时执行该函数。

13) OnMouseUp()

当鼠标释放时执行该函数。

14) OnMouseDrag()

按住鼠标拖动对象时执行该函数。

编程帮,一个分享编程知识的公众号。跟着站长一起学习,每天都有进步。

通俗易懂,深入浅出,一篇文章只讲一个知识点。

文章不深奥,不需要钻研,在公交、在地铁、在厕所都可以阅读,随时随地涨姿势。

文章不涉及代码,不烧脑细胞,人人都可以学习。

当你决定关注「编程帮」,你已然超越了90%的程序员!

编程帮二维码
微信扫描二维码关注