如何从已销毁的外部游戏对象执行协程
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();
我想从另一个脚本启动协程。 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();