Как ожидать, что экземпляр GameObject завершил собственный запуск из другого экземпляра GameObject, запущенного с Unity? - PullRequest
0 голосов
/ 15 сентября 2018

У меня есть два GameObject как:

public class GOA : MonoBehaviour
{
    void Start()
    {
     ... do something ...
    }
}

и еще один объект, который зависит от первого таким образом:

public class GOB : MonoBehaviour
{
    void Start()
    { 
     // wait GOA has terminated own "Start" life cycle
     ... then do something ... 
    }
}

Как я могу заставить GOB:Start() ждать, пока GOA:Start() не прекратится?

Ответы [ 3 ]

0 голосов
/ 15 сентября 2018

Мне кажется, что вы ищете Порядок выполнения скриптов (https://docs.unity3d.com/Manual/class-MonoManager.html). Редактировать-> Настройки проекта -> Порядок выполнения скриптов. Используйте '+' для добавления скриптов.

Установить GOAдо -100 и GOB до +100. Этот wat GOA будет вызывать свой метод запуска перед методом запуска GOB.

0 голосов
/ 15 сентября 2018

Start метод может быть сопрограммой.
Вы можете написать что-то вроде этого:

public class GOA : MonoBehaviour
{
    public bool IsInitialized { get; private set;}

    void Start()
    {
        ... do something ...
        IsInitialized = true;
    }
}

А вот ваш сценарий GOB:

public class GOB : MonoBehaviour
{
    public GOA aInstance;
    IEnumerator Start()
    { 
     // wait GOA has terminated own "Start" life cycle
     yield return new WaitUntil(() => aInstance.IsInitialized);
     ... then do something ... 
    }
}

Также не забудьте включить using System.Collections.Generic; в скрипт GOB.

0 голосов
/ 15 сентября 2018

Мне уже приходилось делать эту вещь, каскадную инициализацию. Вот трюк, который я нашел:

public class GOA : MonoBehaviour
{
    public bool isInitialized = false;

    void Start()
    {
        // ... do something ...
        isInitialized = true;
    }
}

И затем, в классе B, я инициализирую в Update() методе. Я использую логическое значение, чтобы убедиться, что инициализация произойдет только один раз

public class GOB : MonoBehaviour
{
    public bool isInitialized = false;
    var a = GameObject.Find("A");

    void Update() //Update ! Not Start()
    {
        if (!isInitialized  && a.GetComponent<GOA>().isInitialized)
        {
            // initialize B...
            isInitialized = true;
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...