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类

MonoBehavior的调用优化

unity3d使用协程应该注意啥

Unity3D脚本中Start和Awake的区别

关于一个Unity的问题,AddComponent<>和GetComponent<>有啥区别?

UGUI源码解析——UIBehaviour