Ред на изпълнение в рамките на метода на цикъл 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