Как ожидать, что экземпляр 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;
}
}
}