Unity中如何在持续碰撞时维持协程运行以保持血条可见?
解决血条持续击中时保持可见的问题
你现在遇到的核心问题是:每次玩家被击中都会启动一个新的EnableAndDisableHealthBar协程,而之前启动的协程仍会按原逻辑执行关闭血条的操作——这就导致即使玩家还在持续被击中,旧协程到时间后还是会把血条关掉。咱们可以通过跟踪当前运行的协程实例+重置显示计时器的方式来解决这个问题。
具体修改步骤
1. 添加协程跟踪变量
先在你的脚本类里定义一个变量,用来保存当前正在运行的血条协程:
private Coroutine _activeHealthBarCoroutine;
2. 调整OnTriggerEnter的协程启动逻辑
每次被击中时,如果已有协程在运行,先停止它,再启动新的协程。这样就能重置血条的显示时长,避免旧协程触发不必要的关闭操作:
public void OnTriggerEnter(Collider obj) { if (obj.tag == "EnemyBullets") { Debug.Log("Player Plane hit by Enemy Bullet"); planeCurrentLife--; // 停止当前正在运行的血条协程(如果存在) if (_activeHealthBarCoroutine != null) { StopCoroutine(_activeHealthBarCoroutine); } // 启动新协程并保存引用 _activeHealthBarCoroutine = StartCoroutine(EnableAndDisableHealthBar()); if (planeCurrentLife <= 0) { Destroy(obj.gameObject); Explode(); } } }
3. 优化协程逻辑(可选,让代码更清晰)
把生命值更新和血条显示时长控制拆分,让协程专注处理显示计时,血量变化单独用方法维护:
private void UpdateHealthBarVisual() { fillAmt -= 0.05f; // 根据当前血量设置血条颜色 if (fillAmt >= 0.6f) { HealthBarFiller.color = Color.green; } else if (fillAmt >= 0.3f) { HealthBarFiller.color = Color.yellow; } else { HealthBarFiller.color = Color.red; } } IEnumerator EnableAndDisableHealthBar() { isHealthBarVisible = true; showIsHealthBarVisible = true; UpdateHealthBarVisual(); // 调用血量更新方法 // 循环计时,直到时长耗尽 float remainingTime = healthBarVisibilityTime; while (remainingTime > 0) { remainingTime -= Time.deltaTime; yield return null; } showIsHealthBarVisible = false; isHealthBarVisible = false; // 协程结束后清空引用 _activeHealthBarCoroutine = null; }
这样修改后,只要玩家持续被击中,旧的协程就会被终止,新协程会重新开始计时,血条就能一直保持可见;直到最后一次击中后,等待healthBarVisibilityTime时长才会自动关闭。
内容的提问来源于stack exchange,提问作者Aisha D.S.
相关产品推荐
相关产品推荐

