gpt4 book ai didi

unity3d - Time.frameCount什么时候增加?

转载 作者:行者123 更新时间:2023-12-02 01:10:55 24 4
gpt4 key购买 nike

Unity3D提供许多每帧回调,最常用的是Update。还有一些使用较少的类,例如OnWillRenderObjectOnRenderObjectOnPostRender。关于这些回调的调用顺序,Time.frameCount什么时候增加?

我正在尝试使渲染完成后捕获的帧抓取与该帧中其他回调记录的对象属性同步。我发现调用OnPostRender时,Time.frameCount已经增加,因此,通知我的帧实际上是前一帧。出于这个原因,我想知道在增加帧数之后还要调用什么其他回调。

最佳答案

我编写此脚本是为了捕获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;
}
}

在编辑器内部,我在 OnGUIOnRenderObjectFixedUpdate之间进行了更改,但是场景几乎是空的,只有一个摄像头和一个带有 Sprite Renderer的游戏对象。

区别在于,如果我选择了游戏对象或层次结构中的摄像头,如果选择了GO,则将发出 OnRenderObject信号,否则(如果保持层次结构中的摄像头处于选中状态) OnGUI

您可以在更详细的场景中使用此脚本,因为大多数回调在一个简单的场景中根本没有被调用,因此对结果感到好奇。

顺便说一句,我没有费心去添加带有各种产量的协程,尽管可以很容易地添加协程以捕捉游戏循环中的更多“时刻”,例如Update和LateUpdate之间的时刻等。

关于unity3d - Time.frameCount什么时候增加?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45215963/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com