https://docs.unity3d.com/ScriptReference
脚本都是继承自MonoBehaviour,它定义了基本的脚本行为。
所有继承MonoBehaviour的类是不可以实例化的,会自动创建实例。
必然事件也是从MonoBehaviour继承而来。除了必然事件,MonoBehaviour还定义了碰撞、鼠标移动等的响应函数,这些函数都是以On开头。
其他的重要方法:
StartCoroutine 开始协同程序
StopCoroutine 停止名为methodName的所有协同程序
StopAllCoroutines 停止所有协同程序
Instantiate
Destroy
OnTriggerEnter 当Collider(碰撞体)进入trigger(触发器)时调用OnTriggerEnter
OnTriggerExit Collider(碰撞体)停止碰触trigger(触发器)时调用OnTriggerExit
OnTriggerStay 当碰撞体接触触发器时,OnTriggerStay将在每一帧被调用
OnCollisionEnter 当collider/rigidbody碰触另一个rigidbody/collider时调用
OnCollisionExit 当collider/rigidbody停止碰触另一个rigidbody/collider时调用
OnCollisionStay 当collider/rigidbody碰触另一个rigidbody/collider时,OnCollisionStay将会在每一帧被调用
OnMouseEnter
OnMouseOver
OnMouseExit
OnMouseDown
OnMouseUp
MonoBehaviour里面有两个内置的延时方法
void Invoke(string methodName, float time);
第一个参数是方法名,第二个是延时多少秒,只执行一次。
void InvokeRepeating(string methodName, float time, float repeatRate);
InvokeRepeating第二个参数是延时多少秒后开始,第三个参数是每次执行间隔的秒数。
还有两个方法:
IsInvoking:用来判断某方法是否被延时,即将执行
CancelInvoke:取消该脚本上的所有延时方法
普通类
在Unity中可以继续使用C#普通类(这个类不继承于MonoBehaviour),使用方法同C#,这个脚本不需要添加到场景中的GameObject上。
GameObject上挂载的脚本类名同文件名必须一致,但是对于普通类就没有这个限制,和C#一样,直接查找类名,并且一个文件也可以包含多个类。
MonoBehaviour类中必然事件的执行顺序 (精简):
Awake()->OnEnable()->Start()->FixedUpdate()->Update()-> LateUpdate()->OnGUI()->OnDisable()-> OnDestroy()
最先执行的方法是Awake,这是生命周期的开始,用于进行激活时的初始化代码。在脚本的生命周期只执行一次。
如果当前脚本处于可用状态,则正常的执行顺序是继续向下执行OnEnable。
再向下执行,会进行一个判断,如果Start方法还没有被执行,则会被执行一次,如果已经被执行了,则不会再被执行。在脚本的生命周期只执行一次。
继续向后执行,就是FixedUpdate(固定频率更新,通常情况下,比Update调用频繁,每一帧可能会调用多次)了,然后是Update(每帧自动调用一次),再然后是LateUpdate(延迟更新,每一帧调用一次)。Update中的代码自带循环。
在使用Update时,对于一些变量,例如速度、移动距离等,通常要乘以Time.deltaTime来抵消帧率带来的影响,使状态改变看起来均匀正常。
再向后执行,就进入了渲染模块(Rendering),非常重要的一个方法就是OnGUI(每一帧调用多次),用于绘制图形界面。
再向后,就是卸载模块(TearDown),这里主要有两个方法OnDisable与OnDestroy。
Update和FixedUpdate的区别:
update跟当前平台的帧数有关,而FixedUpdate是真实时间,所以处理物理逻辑的时候要把代码放在FixedUpdate而不是Update。
Update是在每次渲染新的一帧的时候才会调用,也就是说,这个函数的更新频率和设备的性能有关以及被渲染的物体有关,这会导致同一个游戏在不同的机器上效果不一致,有的快有的慢。
而FixedUpdate,是在固定的时间间隔(可以更改,Edit->ProjectSetting->time 找到Fixedtimestep)执行,不受游戏帧率的影响。有点像Tick。所以处理Rigidbody的时候需要用FixedUpdate代替Update。例如:给刚体加一个作用力时,应该应用作用力在FixedUpdate。
LateUpdate是晚于所有Update执行的。例如游戏中有2个脚本,脚本1含有Update和LateUpdate,脚本2含有Update,那么当游戏执行时,每一帧都是把2个脚本中的Update执行完后才执行LateUpdate 。虽然是在同一帧中执行的,但是Update会先执行,LateUpdate会晚执行。
OnDisable和OnEnable这两个方法是在gameObject被设置为active true和 false的时候调用的。
如何编写脚本程序来验证脚本函数的生命周期?