1、MonoBehaviour类(UnityEngine命名空间中定义):
Awake:最开始调用,做一些初始化工作。建议少用,此刻物体可能还没有实例化出来,会影响程序执行顺序。
Start:不是很紧急的初始化,一般放在Start里面来做。仅在Update函数第一次被调用前调用。
Reset:用户点击检视面板的Reset按钮或者首次添加该组件时被调用。此函数只在编辑模式下被调用。Reset最常用于在检视面板中给定一个最常用的默认值。
Update:每一帧调用一次,帧间隔时间有可能改变。
FixedUpdate:以相同时间间隔调用,用在力学更新效果中。执行在Update之前。
LateUpdate:在Update和FixedUpdate调用之后调用。一般人物的移动放在Update中,而摄像机的跟进变化放到FixedUpdate中。确保两个独立,一前一后,不产生错误。
On开头的方法,是由其他事件触发调用的。
OnDestory:物体被删除时调用。
OnEnable:物体启用时被调用。
OnDisable:物体被禁用时调用。
OnGUI:这个函数会每帧调用好几次(每个事件一次),GUI显示函数只能在OnGUI中调用。
下图是单个脚本内部方法的调用顺序:
private static ModelLocator instance;
public static ModelLocator getInstance{
get{
if(instance==null){
instance=new ModelLocator();
}
return instance;
}
}
所有的C#对象都是继承于object类,包括int、float这些函数类型,当然也包括Monobehaviour、GameObject这些类。
static function Instantiate(original: Object, position: Vector3, rotation: Quaternion): Object;
public GameObject Spawn()
{
/* 生成prefab的实例化,因为默认是object类型,所以需要强转为GameObject */
return GameObject.Instantiate(prefab, transform.position, transform.rotation) as GameObject;
}
11、其他方法:GameObject.GetComponent:通过游戏物体获取其组件CharacterController cc = this.GetComponent
12、协同(协程):一般用来在脚本中增加延时效果。因为在Start()或者Update()中是不能直接延时的(WaitForSecond())等待某个操作结束之后再执行代码字符串做为参数:
void Start ()
{
StartCoroutine("DoSomething", 2.0);
yield WaitForSeconds (1);//可以在任意位置使用yield语句。yield的返回值控制何时恢复协同程序向下执行。这里等待1s之后才会接着执行下面的语句。
StopCoroutine("DoSomething");
}
void DoSomething (float someParameter)
{
while (true)
{
print("DoSomething Loop");
// 停止协同程序的执行并返回到主循环直到下一帧.
yield;
}
}
IEnumerator做为参数:
IEnumerator Start()
{
StartCoroutine("DoSomething", 2.0F); //StartCoroutine(DoSomething(2.0F)); 使用IEnumerator做参数不能用StopCoroutine停用。
yield return new WaitForSeconds(1);
StopCoroutine("DoSomething"); //请注意只有StartCoroutine使用一个字符串方法名时才能用StopCoroutine停用之。
}
IEnumerator DoSomething(float someParameter)
{
while (true) {
print("DoSomething Loop");
yield return null;
}
}
开启协同:
StartCoroutine(string methodName):字符串作为参数可以开启线程并在协程结束前终止线程;开启协程时最多只能传递一个参数,并且性能消耗会更大一点将协同程序所在gameobject的active属性设置为false,当再次设置active为ture时,协同程序并不会再开启。
13、yiled:和协同密切相关的一个概念,一个协同程序在执行过程中,可以在任意位置使用yield语句。yield的返回值控制何时恢复协同程序向下执行。
yield不可单独使用
需要与return配合使用,例如:
1 yield return 0; //等0帧
2 yield return 1; //等1帧
3 yield return WaitForSeconds(3.0); //等待3秒
4 yield return null;//立即返回调用点
所有使用yield的函数必须将返回值类型设置为IEnumerator类型,例如:
IEnumerator DoSomeThingInDelay() {...}
当然,你也可以把Start()返回值定义为IEnumerator类型,那么在Start里面也可以使用yield延时返回,但不推荐这样做:
IEnumerator Start()
{
StartCoroutine("DoSomething", 2.0F); //StartCoroutine(DoSomething(2.0F)); 使用IEnumerator做参数不能用StopCoroutine停用。
yield return new WaitForSeconds(1);
StopCoroutine("DoSomething"); //请注意只有StartCoroutine使用一个字符串方法名时才能用StopCoroutine停用之。
}
你也可以把StartCoroutine和yiled return结合起来使用,保证函数执行顺序,这样调用能保证,init1,init2,init3一个一个的执行,不至于出现后面执行的代码引用一个前面未初始化的变量:
IEnumerator Init()
{
yield return StartCoroutine(init1());
Debug.Log("init1 finish");
yield return StartCoroutine(init2());
Debug.Log("init2 finish");
yield return StartCoroutine(init3());
Debug.Log("init3 finish");
}
IEnumerator init1()
{
// 模拟初始化
yield return new WaitForSeconds(2);//
}
IEnumerator init2()
{
// do somthing..
yield return new WaitForSeconds(2);//
}
IEnumerator init2()
{
// do somthing..
yield return new WaitForSeconds(2);//
}
好了,就先介绍这些。