Порядок выполнения в методе цикла Update() в Unity3D

Я пытаюсь найти подходящие слова для описания проблемы, с которой я столкнулся, надеюсь, это объяснит проблему.

У меня есть два метода Update() в двух разных классах, и некоторые функции одного из них зависят от данных из другого. Код A зависит от данных кода B, используя Debug.Log(). Я обнаружил, что Update() кода B выполняется после Update()< кода A. /сильный>.

Мой вопрос: существует ли готовый метод для управления стеком вызовов метода обновления? Если есть как это делается? Если нет, есть ли у кого-нибудь техника, которую я мог бы использовать для решения проблемы. Я понимаю, что мог бы просто создать методы в коде B, которые можно было бы вызывать из кода A в обновлении, чтобы решить проблему, но мне любопытно посмотреть, есть ли другой способ решить проблему.


person Peter Grant Bue    schedule 04.04.2014    source источник


Ответы (3)


Из справочного руководства Unity:

По умолчанию функции Awake, OnEnable и Update различных скриптов вызываются в порядке загрузки скриптов (что является произвольным). Однако этот порядок можно изменить с помощью настроек порядка выполнения скриптов.

Это должно решить вашу проблему.

person Arttu Peltonen    schedule 04.04.2014

Базовый механизм может быть представлен замками.

В качестве примера предположим, что блок A зависит от блока B. Вы можете контролировать «зависимость» следующим образом:

//B script:
var BLogicPerformed = false;

//...
//Code on which A depends:
function Update(){
    if (BLogicPerformed == false){
        //your operations...
        BLogicPerformed = true;
    }
}

//------------------------------------------------
//A script:

//...
//Code that depends on B:
 function Update(){
    if (this.GetComponent("B").BLogicPerformed == true){
        //Perform logic that depends on B
        this.GetComponent("B").BLogicPerformed = false;
    }
 }

(уродливые сравнения с логическими значениями сделаны просто для того, чтобы сделать код максимально понятным :-))

Я программирую на Unityscript, и, поскольку ваш вопрос помечен как unityscript и c#, надеюсь, это достаточно для вас.

person Andrea    schedule 04.04.2014
comment
Даже если вы предположили, что порядок выполнения Update был одинаковым для A и B для каждого кадра (я не уверен, можно ли это предположить), A не будет выполняться в первом кадре, если только B не окажется первым. Если A и B могут выполняться в другом порядке в последующих кадрах, вы можете попасть внутрь if-операторов только через каждые два кадра. Кроме того, вы делаете различие между блокировками и простыми логическими значениями. - person Arttu Peltonen; 04.04.2014
comment
Спасибо Андреа! Это рисует хорошую картину для меня. Я начал внедрять это в свой код, и теперь он отлично работает. Иногда я забываю, что могу использовать булеву логику для решения подобных ситуаций. Кроме того, мой проект написан на C# Unity Script, так что вы правильно поняли, и я ценю это. В будущем постараюсь уточнить свой вопрос. Благодаря тонну. - person Peter Grant Bue; 08.04.2014
comment
@PeterGrantBue: я рад, что мое решение соответствует вашим потребностям. :-) Пожалуйста, примите мой ответ, если он действительно вам помог. Удачи вам в игре! ;-) - person Andrea; 08.04.2014

если это единственный способ, вы можете использовать LateUpdate() вместо Update() в одном из скриптов

person Tom    schedule 05.04.2014