Unity C # StartCoroutine () в разрушенном объекте - PullRequest
0 голосов
/ 22 января 2019

У меня этот скрипт в Unity с C # и время Coroutine не работает, вторая строка с forwardForce = 10f не была вызвана :

using UnityEngine;
using System.Collections;

public class SlowPickup : MonoBehaviour
{
  public float waitTime = 2f;

  private IEnumerator DecreaseSpeed ()
  {
     GameObject.Find("Player").GetComponent<PlayerMovement>().forwardForce = 1f;
     yield return new WaitForSeconds(waitTime);
     GameObject.Find("Player").GetComponent<PlayerMovement>().forwardForce = 10f;
  }

  void OnTriggerEnter ()
  {
    Destroy(gameObject);
    StartCoroutine(DecreaseSpeed());
  }

}

Ответы [ 2 ]

0 голосов
/ 22 января 2019

Вероятно, это не самый чистый способ, но если вы действительно хотите уничтожить этот игровой объект, это не так просто:

private IEnumerator DecreaseSpeed ()
{
    GameObject.Find("Player").GetComponent<PlayerMovement>().forwardForce = 1f;
    Thread.Sleep(2000);
    GameObject.Find("Player").GetComponent<PlayerMovement>().forwardForce = 10f;
}

Но лучший способ - ввести calss в SlowPickup, который обрабатывает эту сопрограмму

private TimeClass ts;

void Start ()
{
    ts = ...; //Inject
}

void OnTriggerEnter ()
{
    ts.RunCoroutine(); //Implement logic in TimeClass
    Destroy(gameObject);
}

Это должно работать.

0 голосов
/ 22 января 2019

Вы уничтожаете GameObject, в котором размещена сопрограмма, которая уничтожит сопрограмму, заставляя ее не завершать работу. Вы захотите уничтожить GameObject в конце сопрограммы или использовать статический менеджер сопрограмм.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...