【问题标题】:Why is transform.hasChanged always true? (i.e. who's job is it to set hasChanged to false?)为什么 transform.hasChanged 总是正确的? (即,将 hasChanged 设置为 false 的工作是谁?)
【发布时间】:2019-09-25 13:31:00
【问题描述】:

我显然不懂Transform.hasChanged并创建了一个简单的测试:

我创建了一个默认场景,创建了一个球体,并在球体上创建了一个脚本,它只检查更新的每一帧 transform.hasChanged

为什么每帧都返回 TRUE?

FWIW:我假设 Unity 在检测到变换更改时将值设置为 TRUE,并在帧完成后重置为 FALSE。但这似乎没有发生。 我到底错过了什么?

using UnityEngine;
public class TestHasChanged : MonoBehaviour
{
    void Start() { }

    void Update()
    {
        if (transform.hasChanged) Debug.Log("Sphere hasChanged = TRUE!");
        else Debug.Log("Sphere hasChanged = FALSE!");
    }
}

接下来,我添加了一个侦听器脚本,该脚本仅在更新的每一帧中检查球体上的hasChanged。毫不奇怪,每一帧都是如此。

public class HasChangedListener : MonoBehaviour
{
    public GameObject target;   // the Sphere GO

    void Start() {}

    void Update()
    {
        if (target.transform.hasChanged) {
            Debug.Log("HasChangedListener::Update: hasChanged = TRUE!");
        } else {
            Debug.Log("HasChangedListener::Update: hasChanged = FALSE!");
        }
    }
}

【问题讨论】:

    标签: c# unity3d transform


    【解决方案1】:

    我相信我现在了解Transform.hasChanged 的工作原理以及它的用途。

    我最初的错误是认为 Transform.hasChanged 完全由 Unity 管理(即 Unity 自动:a)在 Transform 更改时设置 hasTransform=true(duh)并且 b)将重置为 false at每一帧的结尾。)。 IOW 您可以在任何 Transform 上调用 hasChanged 并期望它反映 此框架所做的更改。但这似乎是错误的 1/2 (b)。

    我现在相信Transform.hasTransform 字段是一个非托管的便利“脏位”,由应用程序管理。 正如预期的那样,当对 Transform 进行更改时,Unity 将设置 hasChanged=true .但是,就是这样。您的工作(应用程序)是自己逐帧管理此帧(即在完成检查后设置 hasChanged=false 每一帧)。

    如果我有这个错误,请纠正我。

    【讨论】:

      【解决方案2】:

      我认为这是在文档中,没有内置方法更改已更改回 false,这是您的工作。从好的方面来说,它非常便宜(该位始终设置,没有分支),在不利方面,有多个组件观看相同的转换是有问题的 - 如果第一个重置它,第二个将看到错误。只要牢记这一点,就可以安全地使用 MonoBehaviour 来“使用”hasChanged。

      希望对你有帮助

      【讨论】:

      • 谢谢。我在文档中找不到任何解释这一点的东西。正如您所提到的,如果您有 >1 个侦听器,您就会遇到问题(但可以解决,但前提是您可以访问每个侦听器,例如设置一个信号量)。唯一可能有意义的另一件事是,如果 Unity 确保实际游戏对象的 Update 方法最后执行)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-23
      • 1970-01-01
      • 2015-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-09
      相关资源
      最近更新 更多