Вы не можете запустить функцию сопрограммы из сценария, у которого деактивирован GameObject.
Функция StartCoroutine
является функцией класса MonoBehaviour
.Когда вам нужно запустить сопрограмму на деактивированном GameObject, вам нужна ссылка на MonoBehaviour
объект с активным GameObject.
Два способа сделать это :
1 .Используйте уже существующий GameObject, который вряд ли будет деактивирован.В моем случае я обычно использую камеру.Я получаю доступ к камере MonoBehaviour
, поскольку она, вероятно, будет активирована, а затем использую ее для запуска функции сопрограммы.
Я предлагаю вам использовать этот метод.
Замените код в вашей функции Start
на приведенный ниже:
//De-activate this GameObject
gameObject.SetActive(false);
//Get camera's MonoBehaviour
MonoBehaviour camMono = Camera.main.GetComponent<MonoBehaviour>();
//Use it to start your coroutine function
camMono.StartCoroutine(Load());
2 .Прикрепите скрипт к пустому GameObject, и скрипт на пустом GameObject будет контролировать или иметь возможность активировать / деактивировать другой GameObject.
Скрипт с функцией сопрограммы, которую вы ожидаете запустить на деактивированнойGameObject (прикрепите его к GameObject, который вы хотите деактивировать):
public class YourDeactivatableScript: MonoBehaviour
{
public IEnumerator Load()
{
yield return new WaitForSeconds(waitTime);
gameObject.SetActive(true);
}
}
Теперь предположим, что вы хотите деактивировать GameObject с именем "Cube" , который имеет YourDeactivatableScript
прикрепленный к нему сценарий, но все еще в состоянии запустить его функцию сопрограммы Load
, создать пустой GameObject с новым сценарием, а затем запустить из него функцию Load.
Создать пустой GameObject и затем присоединить этот сценарий кit:
public class LoadFuncCallerScript: MonoBehaviour
{
GameObject targetObject;
public void Start()
{
//Find the GameObject you want to de-activate
targetObject = GameObject.Find("Cube");
//De-activate it
targetObject.SetActive(false);
//Get it's component/script
YourDeactivatableScript script = targetObject.GetComponent<YourDeactivatableScript>();
//Start coroutine on the other script with this MonoBehaviour
StartCoroutine(script.Load());
}
}
Сопрограмма теперь запускается из другого скрипта с именем LoadFuncCallerScript
.