Unity3D提供了许多每帧回调,最常用的是Update
。还有一些较少使用的内容,例如OnWillRenderObject
,OnRenderObject
和OnPostRender
。关于调用这些回调的顺序,何时Time.frameCount
递增?
我试图同步帧抓取我在渲染完成后捕获从该帧中其他回调记录的对象属性。我发现当OnPostRender
被调用时,Time.frameCount
已经增加,因此被通知的帧I实际上是前一帧。出于这个原因,我想知道在帧计数增加后调用其他回调。
答案 0 :(得分:3)
我编写了这个脚本,以便在Time.frameCount
更改时进行捕获:
using UnityEngine;
public class OnFrameCounterDetector : MonoBehaviour {
int frameNumber = 0;
string prevMethod;
private void Awake() {
Time.fixedDeltaTime = 1 / 60;
prevMethod = System.Reflection.MethodBase.GetCurrentMethod().Name;
CheckFrameCount(System.Reflection.MethodBase.GetCurrentMethod().Name);
}
private void OnEnable() {
CheckFrameCount(System.Reflection.MethodBase.GetCurrentMethod().Name);
}
private void Start () {
CheckFrameCount(System.Reflection.MethodBase.GetCurrentMethod().Name);
}
private void FixedUpdate() {
CheckFrameCount(System.Reflection.MethodBase.GetCurrentMethod().Name);
}
private void Update () {
CheckFrameCount(System.Reflection.MethodBase.GetCurrentMethod().Name);
}
private void LateUpdate() {
CheckFrameCount(System.Reflection.MethodBase.GetCurrentMethod().Name);
}
private void OnWillRenderObject() {
CheckFrameCount(System.Reflection.MethodBase.GetCurrentMethod().Name);
}
private void OnPreCull() {
CheckFrameCount(System.Reflection.MethodBase.GetCurrentMethod().Name);
}
private void OnBecameVisible() {
CheckFrameCount(System.Reflection.MethodBase.GetCurrentMethod().Name);
}
private void OnBecameInvisible() {
CheckFrameCount(System.Reflection.MethodBase.GetCurrentMethod().Name);
}
private void OnPreRender() {
CheckFrameCount(System.Reflection.MethodBase.GetCurrentMethod().Name);
}
private void OnRenderObject() {
CheckFrameCount(System.Reflection.MethodBase.GetCurrentMethod().Name);
}
private void OnPostRender() {
CheckFrameCount(System.Reflection.MethodBase.GetCurrentMethod().Name);
}
private void OnRenderImage(RenderTexture source, RenderTexture destination) {
CheckFrameCount(System.Reflection.MethodBase.GetCurrentMethod().Name);
}
private void OnDrawGizmos() {
CheckFrameCount(System.Reflection.MethodBase.GetCurrentMethod().Name);
}
private void OnGUI() {
CheckFrameCount(System.Reflection.MethodBase.GetCurrentMethod().Name);
}
private void OnApplicationPause(bool pause) {
CheckFrameCount(System.Reflection.MethodBase.GetCurrentMethod().Name);
}
private void OnDisable() {
CheckFrameCount(System.Reflection.MethodBase.GetCurrentMethod().Name);
}
private void CheckFrameCount(string callback) {
if (Time.frameCount > frameNumber) {
Debug.LogFormat("frameCount changed between {0} and {1}", prevMethod, callback);
frameNumber = Time.frameCount;
}
prevMethod = callback;
}
}
在编辑器中,我在OnGUI
或OnRenderObject
和FixedUpdate
之间进行了更改,但场景几乎为空,只有一个摄像头和一个带{{{的游戏对象1}}就可以了。
不同之处在于,如果我选择了游戏对象或者层次结构中的相机,如果选择了GO,则会发出Sprite Renderer
信号,如果没有(即:保持相机在层次结构中选中),{ {1}}。
您可以在更详细的场景中使用此脚本,因为在一个简单的场景中根本不会调用大多数回调,对结果感到好奇。
顺便说一句,我没有费心去添加各种产量的协同程序,它们可以很容易地添加,以便在游戏循环中捕获更多“时刻”,比如Update和LateUpdate之间的等等。答案 1 :(得分:-1)
根据Execution Order or MonoBehaviour messages,我认为我们可以假设在Time.frameCount
递增后调用以下函数,因为Time.frameCount
表示呈现的帧的数量:
OnPostRender
OnRenderImage
yield WaitForEndOfFrame
OnApplicationPause
OnDisable
(如果在框架期间禁用了脚本)