如何从已销毁的外部游戏对象执行协程

How to execute Coroutine from external GameObject which has been destroyed

我想从另一个脚本启动协程。 Coroutine 位于 PlayerControl 脚本内部,EnemyControl 脚本包含触发 Coroutine 的行。问题是协程没有被执行,因为持有 EnemyControl 脚本的游戏对象被销毁了。

现在我的问题是:即使游戏对象被销毁,你如何启动协程?我只是问,因为我听说当游戏对象被销毁时协程停止工作。

调用协程的 EnemyControl 脚本:

int achieveResult2 = PlayerPrefsManager.GetAchievement("achieveFirstKill_Key");

        if (achieveResult2 == 0) {
            PlayerPrefsManager.SetAchievement ("achieveFirstKill_Key", 1);

            playerShip.GetComponent<PlayerControl>().achievements.Add("First Kill");
            playerShip.GetComponent<PlayerControl>().achieveCntr = playerShip.GetComponent<PlayerControl>().achievements.Count;

            StartCoroutine(ShowAchievements());
        }

PlayerControl 脚本中的协程:

public IEnumerator ShowAchievements () {
    yield return new WaitForSeconds(0.5f);

    for (int i = 0; i < achieveCntr; i++) {

        achievementText.GetComponent<AchievementTxt> ().ShowAchieveText (achievements [i]);
        achievementText.GetComponent<AchievementTxt> ().achieveTxtTimerRunning = true;

        achievements.Remove(achievements [i]);

        yield return new WaitForSeconds(2f);
    }
}

只需将您调用的方法添加到本地启动协程的播放器即可。

你可以安全地销毁敌方对象,因为它不再负责启动协程:

玩家控制

public void ShowAchievements()
{
    StartCoroutine (ShowAchievementsRoutine ());
}

private IEnumerator ShowAchievementsRoutine () 
{
    yield return new WaitForSeconds(0.5f);

    for (int i = 0; i < achieveCntr; i++) 
    {

        achievementText.GetComponent<AchievementTxt> ().ShowAchieveText (achievements [i]);
        achievementText.GetComponent<AchievementTxt> ().achieveTxtTimerRunning = true;

        achievements.Remove(achievements [i]);

        yield return new WaitForSeconds(2f);
    }
}

并将其作为敌人的普通方法调用:

 playerShip.GetComponent<PlayerControl>().ShowAchievements();