写在前面
Unity3D虽然是个非常方便的游戏引擎,但还是有一些地方会产生一些让人莫名其妙的问题,而且debug半天也不知道到底哪里错了。往往在经过了大量的log之后,也许我们才顿悟,原来Unity内部是这样做的啊。这里旨在总结这些容易被忽略、但是又经常会给开发造成麻烦的问题,欢迎补充。
随时更新。
备忘录
1. StartCoroutine和StopCoroutine
Coroutine,即协同程序,如果使用的语言是C#,那么我们必须使用StartCoroutine去指明开启一个协同程序。StartCoroutine有两个版本:一种是StartCoroutine(routine: IEnumerator): Coroutine;,另一种是StartCoroutine(methodName: string, value: object = null): Coroutine;。
如果你仔细看官方文档,只有第二种,即以string为参数的StartCoroutine才可以使用public void StopCoroutine(string methodName);来终止该协同程序。
根据网友@Oo幻想oO (多谢!)的提醒,实际上所有的Coroutine都可以用public void StopCoroutine(IEnumerator routine);这种传参方式停止。
2. Awake、Start、Update、LateUpdate、FixedUpdate
上述函数都是MonoBehavior几个最常见的基本函数。但很少有人真正知道它们具体的调用顺序。
首先是Awake。当该脚本实例被加载时,Unity会调用它的Awake函数,在该脚本实例的整个生命周期中,它只会被调用一次。具体来说,Unity首先会加载场景中的所有对象,完成后,去扫描这些对象上的MonoBehavior,然后调用它的Awake函数。因此,我们通常使用Awake来初始化各种变量,在其中使用FindWithTag等函数也是没有问题的。Awake函数将早于任何Start函数被调用,但是Awake本身的调用顺序是不定的。
然后是