Unity 4 3D开发实战详解
上QQ阅读APP看书,第一时间看更新

3.3 使用C#脚本的注意事项

除了语法规则之外,使用C#脚本与JavaScript脚本编写程序还有一些不同的地方,需要特别注意。

1.继承自MonoBehaviour

所有的行为脚本必须从MonoBehaviour继承(直接的或间接的)。在JavaScript中这个是自动完成的,但是在C#中,必须显示注明。如果你通过Asset→Create→C # Script创建脚本,系统模板已经包含了必要的定义。

public class NewBehaviourScript : MonoBehaviour {...} // C#脚本

2.使用Awake或Start函数初始化

JavaScript中放在函数之外的代码,在C#中必须置于Awake或Start函数里。Awake和Start的不同之处在于,Awake是在加载场景时运行,Start是在第一次调用Update或FixedUpdate函数之前被调用,Awake函数运行在所有Start函数之前。

3.类名字必须匹配文件名

JavaScript中类名被隐式地设置为脚本的文件名(不包含文件扩展名),但是,在C#脚本中必须手工编写,而且类名还必须和文件名相同,否则在控制台会报错。

4.C#中协同程序有不同的句法规则

协同程序(Coroutines)必须是 IEnumerator返回类型,并且 yield用yield return替代。具体可以使用如下的C#代码片段来实现。

1 using System.Collections;

2 using UnityEngine;          //导入系统包

3 public class NewBehaviourScript : MonoBehaviour {  //声明类

4                // C# 协同程序

5  IEnumerator SomeCoroutine () {      //声明函数

6   yield return 0;         // 等待一帧

7   yield return new WaitForSeconds (2);    //等待2s

8  }}

5.只有满足特定情况变量才能显示在属性查看器中

只有序列化的成员变量才能显示在属性查看器中,而private和protected类型的成员变量只能在专家模式中显示,并且,其属性不被序列化或显示在属性查看器。

6.尽量避免使用构造函数

不要在构造函数中初始化任何变量,要用Awake或Start 函数来实现。即便是在编辑模式, Unity 仍会自动调用构造函数,这通常是在一个脚本编译之后,因为需要调用脚本的构造函数来取回脚本的默认值。无法预计何时调用构造函数,它或许会被预置件或未激活的游戏对象所调用。

单一模式使用构造函数可能会导致严重后果,会带来类似随机的空引用异常。因此,如果想实现单一模式不要用构造函数,要用Awake函数。事实上,没必要在继承自MonoBehaviour的类的构造函数中写任何代码。