Unity MonoBehavior类部分函数解析
Posted tamentaoyanwo
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unity MonoBehavior类部分函数解析相关的知识,希望对你有一定的参考价值。
Unity MonoBehavior类部分函数解析
本文来源于Unity官方文档,仅做翻译和部分修改
Awake()
加载脚本实例时将调用Awake。
在游戏开始之前,Awake用于初始化任何变量或游戏状态。在脚本实例的生存期内仅会调用一次Awake。在初始化所有对象之后,将调用Awake,我们可安全地访问其他对象,例如对GameObject使用GameObject.GetComponent< Rigidbody>()进行初始化。每个GameObject的Awake均以对象之间的随机顺序进行调用。 因此,您应该在Awake中设置脚本之间引用,并使用Start来回传递任何信息。始终在任何启动功能之前调用Awake来初始化你的脚本。
综上所述,我们应该使用Awake是充当构造函数初始化的功能。
Start()
如果脚本的状态是enabled的,那么Start会在Update调用之前调用。
像Awake函数一样,在脚本的生存期内仅调用一次Start。但是,无论脚本是否启用,初始化脚本对象时都会调用Awake。 如果初始化时未启用脚本,则可能不会在同一帧上调用Start。
当场景中的所有对象上调用Awake之后才会调用Start。所以,如果我们在对象A的初始化代码需要依赖于对象B已经被初始化的情况下,那么B的初始化应在Awake中完成,而A的初始化应在Start中完成。
Update()
在MonoBehavior中,Update会逐帧调用。用于实现执行脚本,更新数据。
FixedUpdate()
区别于Update的帧速率,FixedUpdate用于物理计算。
FixedUpdate具有物理系统的频率; 它被称为每固定帧率帧。基于物理系统计算,FixedUpdate的更新频率为50FPS(0.02s)。在代码中通过Time.fixedDeltaTime访问此值。通过在脚本中将其设置为您的首选值来对其进行更改,或者导航至Edit > Project Settings > Time > Fixed Timestep进行设置。FixedUpdate频率大于或小于Update。如果应用程序以每秒25帧(fps)的速度运行,则Unity每帧调用FixedUpdate约2次。如果100fps,那么Unity每两帧调用FixedUpdate约1次。
在FixedUpdate中给刚体施加一个Force(力)的时候,刚体能够在一个固定的帧率上运作。
以下是官方的实例代码:
using System.Collections;
using UnityEngine;
public class FixedUpdate_Update : MonoBehaviour {
private float updateCount = 0;
private float fixedUpdateCount = 0;
private float updateUpdateCountPerSecond;
private float updateFixedUpdateCountPerSecond;
void Awake() {
Application.targetFrameRate = 25;
StartCoroutine(Loop());
}
void Update() {
updateCount += 1;
}
void FixedUpdate() {
fixedUpdateCount += 1;
}
void OnGUI() {
GUIStyle fontSize = new GUIStyle(GUI.skin.GetStyle("label"));
fontSize.fontSize = 24;
GUI.Label(new Rect(100, 100, 200, 50), "Update: " + updateUpdateCountPerSecond.ToString(), fontSize);
GUI.Label(new Rect(100, 150, 200, 50), "FixedUpdate: " + updateFixedUpdateCountPerSecond.ToString(), fontSize);
}
IEnumerator Loop() {
while (true) {
yield return new WaitForSeconds(1);
updateUpdateCountPerSecond = updateCount;
updateFixedUpdateCountPerSecond = fixedUpdateCount;
updateCount = 0;
fixedUpdateCount = 0;
}
}
}
OnTriggerEnter(Collider)
当GameObject与另一个GameObject发生碰撞后调用。
触发条件
主物体:Collider、Rigidbody
次物体:Collider,并且Collider.IsTrigger为true
OnCollisionEnter(Collision)
当碰撞体/刚体与另一个刚体/碰撞体发生接触之后调用。
与OnTriggerEnter不同,OnCollisionEnter传递的是Collision。Collision具有接触点(Contract)、相对速度(relativeVelocity)、Rigidbody等。
注意:①如果两个物体的Collider.isTrigger都为true,将不会发生碰撞;②如果其中一个的Rigidbody.isKinematic为true,将不会发生碰撞
以上是关于Unity MonoBehavior类部分函数解析的主要内容,如果未能解决你的问题,请参考以下文章
Unity脚本类为啥要尽量避免继承MonoBehaviour类