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发生碰撞后调用。
触发条件
物体1:Collider、Rigidbody,并且Collider.IsTrigger为true
物体2:Collider

OnCollisionEnter(Collision)

当碰撞体/刚体与另一个刚体/碰撞体发生接触之后调用。
与OnTriggerEnter不同,OnCollisionEnter传递的是Collision。Collision具有接触点(Contract)、相对速度(relativeVelocity)、Rigidbody等。
注意:①如果两个物体中的一个的Collider.isTrigger都为true,将不会发生碰撞;②如果其中一个的Rigidbody.isKinematic为true,将不会发生碰撞

posted @ 2020-05-01 23:00  他们讨厌我  阅读(592)  评论(0)    收藏  举报