游戏对象间的逻辑关系需要通过脚本实现,游戏关卡的设计、各类角色的运动、场景的资源管理等,其背后都是脚本在驱动。最新的Unity5支持两种编程语言,C#和JavaScript,其中JavaScript语言更容易上手,C#是面向对象的编程语言,语法与C++、Java较为接近,在编程思想上更符合Unity引擎的原理。
定义变量: 类型 变量名 /*=初始值*/
不加public、protected、private默认为private。
如果声明public变量,并且把脚本绑定到物体上,则会在物体的Inspector视图上显示,并且可以修改值,若不想显示,可为变量加上[HideInInspector];如果希望在Inspector上限定取值范围,可以使用RangeAttribute实现。
数组的声明和使用: 类型[] 变量 /*=初始值*/
二维数组:
函数的声明和使用:
返回类型 函数名(参数列表)
{ 函数体
}
C++参数传递方式有传值、传址、传引用三种;而C#中只有传值和传引用两种,其中传引用可由关键字ref和out完成,ref需要实参初始化,而out不需要初始化,输出参数。
语句、表达式和运算符:
语句:
运算符:
不常见的:
在Unity中,协程的概念类似于线程,它是一种特殊的函数,能中断(通过yield语句)执行当前的代码,直到中断指令(YieldInstruction)结束后再接着之前的代码继续执行。以下是一个协程的例子:
上面的协程表示等待五秒钟后输出当前的时间。
在C#脚本中创建协程需遵循一下规则:
(1)协程的返回值必须是IEnumerator。
(2)协程的参数不能加关键字ref或out。
(3)在C#脚本中,必须通过StartCoroutine来启动协程。
(4)yield语句要用yield return来替代。
(5)在函数Update和FixedUpdate中不能使用yield语句,但可以启动协程。
在协程函数中,yield语句就像是一个红绿灯,在碰到yield语句前是绿灯,协程函数顺序执行,碰到yield语句时表示前方红灯亮,协程函数立即停下等待,当中断指令结束后红灯熄灭,绿灯变量,协程函数继续顺序执行余下的代码。
在Unity中,绝大部分协程相关的类都继承自基类YieldInsturction。唯一例外的类是WWW,它不继承自YieldInstruction,但可以用在yield return语句中。
yield语句在协程中的典型用法如下。值得注意的是,WaitForSeconds()受Time.timeScale影响,当Time.timeScale为0时,yield return new WaitForSecond(n)将失效。
在C#脚本中,MonoBehaviour类中的成员函数StartCoroutine用于启动协程,该函数的声明为:
StartCoroutine只能用于MonoBehaviour或其子类中。
StartCoroutine接收协程名称(字符串)或IEnumerator实例作为参数。
使用字符串作为参数启动协程时可以在StartCoroutine的第二个参数中为协程指定参数,但最多只能传递一个参数,而使用IEnumerator作为参数则没有这个限制。
在Unity中,可以使用函数StopCoroutine来终止一个协程,但这种方法只适合用于使用协程名称作为参数启动的协程。使用StopAllCoroutines可以终止该MonoBehaviour中所有能终止的协程。还有一种不常用的方法终止协程,即将协程所在游戏对象的active属性设为false,但是当再次将active属性设为true时,协程不会自动启动。
下面是使用协程的一些实例:
最后,书写yield语句时需要注意一下几点:
(1)yield return语句不能位于try-catch语句块中,但可以位于try-finally中的try语句块中。
(2)yield return语句不能放在匿名方法中。
(3)yield return语句不能放在unsafe语句块中。
Unity中提供的类绝大部分都是通过UnityEngine.dll和UnityEditor.dll这两个程序集暴露出来的,其提供的接口也都在UnityEngine和UnityEditor两个命名空间中。在unity编辑器中新建的脚本都会默认添加如下两个命名空间的引用:
using UnityEngine;
using System.Collection;
从Unity4.6以后,Uinty团队更新了UI部分的设计,新的UI相关的类都放在了UnityEngine.UI.dll中。
最新的Unity5已经支持用户自定义命名空间。在实际开发中,随着代码量不断增加,可以将相同功能的代码模块放在同一个命名空间,以便于进行代码管理。
在Unity中,任何要绑定到GameObject上的脚本都必须继承自MonoBehaviour。若一个类不继承自MonoBehaviour,在拖动到GameObject上会报以下错。
常用类的关系:
Debug.log
第一种方法实际是第二种方法的封装,其底层实现基于第二种方法。需要注意的是,在任意C#脚本中都可以采用Debug类的Log系列方法输出,但prinf函数只适用于MonoBehaviour的派生类。
在Unity脚本中,各事件函数的功能和大体的执行顺序如下:
1、Awake:Awake用于脚本唤醒。此方法为系统执行的第一个方法,用于脚本的初始化,在脚本的生命周期中只执行一次。
2、Start:在Awake之后执行,在脚本生命周期只执行一次。和Awake常用于初始化成员变量。
3、FixedUpdate:用于固定频率更新。默认每秒50次。通常情况下,FixedUpdate()会比Update()更频繁地调用。
4、Update:用于正常更新,即用于帧更新后同步场景状态。此方法每帧都会由系统自动调用一次。在使用Update()时,对于一些变量,如速度、移动距离等通常需要乘以Time.deltaTime来抵消帧率带来的影响,使物体状态的改变看起来比较均匀、正常。而在FixedUpdate中,由于其更新频率固定,所以不需要采用Time.deltaTime来修正状态改变频率。
5、LateUpdate:用于延迟更新,此方法在Update()之后执行,每一帧调用一次。
6、OnGUI:OnGUI用于绘制用户交互界面,每一帧会调用多次。其中,与布局和重绘相关的事件会被优先处理,然后是键盘和鼠标事件。
7、OnDestory:在当前脚本销毁时调用。若在脚本中动态分配了内存,可以在OnDestory()中进行释放。