Unity — Prefab не активируется после отключения

#unity3d

Вопрос:

Я просто пытаюсь срубить дерево и возродить его. Я делаю это просто с помощью таймеров, чтобы сделать сборку дерева неактивной, а затем активной.

Дерево станет неактивным через 1 секунду (1-й таймер ожидания), а затем активным через 2 (второй таймер ожидания).

Однако, как ни странно, второй таймер ожидания, похоже, не работает, как показано в журналах ниже. Любая помощь была бы отличной.

Это мой скрипт ChopTree:

 public class ChopTree : MonoBehaviour
{
    private bool touching;

    private void OnTriggerEnter(Collider other)
    {
        Debug.Log("Touching tree");
        touching = true;
        Debug.Log(touching);
    }

    private void OnTriggerExit(Collider other)
    {
        Debug.Log("Not Touching tree");
        touching = false;
        Debug.Log(touching);
    }

    private void Update()
    {
        if (Keyboard.current.enterKey.wasPressedThisFrame)
        {
            if (touching == true)
            {
                StartCoroutine(TreeSpawner.DeleteAndRespawn());
            }
        }
    }
}
 

И это сценарий создания дерева:

 public class TreeSpawner : MonoBehaviour
{

    // Assign tree prefab.
    [SerializeField]
    private GameObject tree;

    // Access-point for tree script.
    private static TreeSpawner instance;

    // Spawn the tree when the game Starts.
    void Start()
    {
        instance = this;
    }

    IEnumerator Respawn(float timeToDespawn, float timeToRespawn)
    {
        yield return new WaitForSeconds(timeToDespawn);
        Debug.Log("Deleting...");
        tree.SetActive(false);
        Debug.Log("Deleted...");
        Debug.Log("Respawning...");
        yield return new WaitForSeconds(timeToRespawn);
        Debug.Log("Respawn Timer done...");
        tree.SetActive(true);
        Debug.Log("Respawned...");
    }

    public static IEnumerator DeleteAndRespawn()
    {
        Debug.Log("Deleting and respawning tree");
        yield return instance.StartCoroutine(instance.Respawn(1f, 2f));
    }
}
 

Вот порядок журналов:

введите описание изображения здесь

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

Ответ №1:

Я предполагаю, что вы установили поле «дерево» в GameObject, куда вы поместили скрипт TreeSpawner. Когда игровой объект «дерево» деактивирован…

 tree.SetActive(false);
 

… после этого скрипты TreeSpawner также останавливаются.

Сопрограммы также останавливаются, когда игровой объект, к которому он привязан, отключен с помощью SetActive(false)

Комментарии:

1. Я могу неправильно понять ваши намерения, но я бы не стал использовать TreeSpawner как одноэлементный (статический). Я бы сохранил его как компонент и разместил на каждом дереве.