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的类的构造函数中写任何代码。