You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 11:52:34