Почему transform.hasChanged всегда верен?(т.е. для кого задано значение hasChanged в false?) - PullRequest
1 голос
/ 07 мая 2019

Я явно не понимаю 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!");
        }
    }
}

Ответы [ 2 ]

1 голос
/ 08 мая 2019

Я думаю, что это в документах, никакие изменения встроенного метода не изменились на false, это ваша работа.С положительной стороны, это очень дешево (бит всегда установлен, без разветвления), с другой стороны, проблематично иметь несколько компонентов, наблюдающих одно и то же преобразование - если первый сбрасывает его, второй увидит false.Пока вы помните об этом, вы можете «потреблять» изменения, внесенные вашим MonoBehaviour.

Надеюсь, это поможет

0 голосов
/ 08 мая 2019

Я полагаю, что теперь я понимаю, как Transform.hasChanged работает и как это было предназначено для использования.

Моя первоначальная ошибка заключалась в том, что Transform.hasChanged полностью управлялась Unity (т.е. Unity автоматически: a)устанавливает hasTransform=true каждый раз, когда изменяется преобразование (duh) И b) сбрасывается на false в конце каждого кадра. ).Таким образом, вы можете вызвать hasChanged для любого преобразования и ожидать, что оно будет отражать изменения, сделанные в этом кадре .Но это, кажется, 1/2 неправильно (б).

Теперь я считаю, что поле Transform.hasTransform является неуправляемым «грязным битом» удобства, который должен управляться приложением . КакОжидается, что Unity установит hasChanged=true при внесении изменений в Transform.Но это все.Ваша задача (приложение) - управлять этим кадр за кадром самостоятельно (то есть устанавливать hasChanged=false каждый кадр после того, как вы закончите проверять его).

Пожалуйста, исправьте меня, если я ошибаюсь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...