Unity中FireBreathing协程无法重复运行问题求助
问题根源
你遇到的核心问题是复用了已完成的IEnumerator迭代器实例。IEnumerator本质是一次性迭代器,当协程执行完所有逻辑(包括yield return后的收尾代码),这个实例就会进入终止状态,无法再通过StartCoroutine启动。你在Start()里只创建了一次FireBreathing()实例,后续重复调用它自然无效。
解决方案
需要每次启动协程时创建新的FireBreathing()实例,同时维护当前运行的协程引用,确保能准确停止它。修改后的逻辑如下:
- 移除
Start()中对协程实例的初始化 - 在
StrawbiliPowerUp()中先停止当前可能运行的协程(如果存在) - 创建新的协程实例并启动,同时保存引用
修改后的完整代码
public class StrawbiliEffect : MonoBehaviour { [SerializeField] float strawbiliMoveSpeed = 5f; [SerializeField] float strawbiliJumpForce = 12f; [SerializeField] float strawbiliDuration = 3f; public bool isStrawbiliBoy; IEnumerator activeCoroutine; // 保存当前活跃的协程引用 AltPlayerController playerController; Animator animator; void Start() { playerController = GetComponent<AltPlayerController>(); // 移除原有的协程初始化代码 } public void StrawbiliPowerUp() { Debug.Log("Function Called"); // 先停止当前可能运行的协程 if (activeCoroutine != null) { StopCoroutine(activeCoroutine); Debug.Log("Coroutine stopped"); } // 创建新的协程实例并启动 activeCoroutine = FireBreathing(); StartCoroutine(activeCoroutine); } IEnumerator FireBreathing() { Debug.Log("Coroutine has started"); isStrawbiliBoy = true; playerController.isNormalGerm = false; playerController.moveSpeed = strawbiliMoveSpeed; playerController.jumpForce = strawbiliJumpForce; //animator.SetBool ("isStrawbiliBoy", true); yield return new WaitForSeconds (strawbiliDuration); //animator.SetBool ("isStrawbiliBoy", false); playerController.isNormalGerm = true; playerController.moveSpeed = playerController.normalMoveSpeed; playerController.jumpForce = playerController.normalJumpForce; isStrawbiliBoy = false; activeCoroutine = null; // 协程结束后清空引用 Debug.Log("Coroutine has finished"); } }
关键改动说明
- 将原
coroutine变量重命名为activeCoroutine,明确其作用是追踪当前运行的协程 - 每次触发增益时,先终止已有协程再创建新实例,彻底避免复用终止的迭代器
- 协程执行完毕后清空
activeCoroutine引用,确保状态同步
内容的提问来源于stack exchange,提问作者Lordvanan
相关产品推荐
相关产品推荐

