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

У меня два 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 ответа

Решение

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.

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

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

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

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;
        }
    }
}
Другие вопросы по тегам