Unity Engine生命值系统异常:流星触地仅首次扣除生命值
Unity生命值系统异常问题排查
我在Unity Engine中实现生命值系统,设定逻辑:
- 流星触地时,玩家扣除1点生命值
- 流星碰撞玩家时,玩家直接失去全部生命值
但出现异常:流星首次触地会扣血,后续触地不再扣除生命值,怀疑问题出在GM脚本与流星脚本的生命值扣除逻辑中,相关代码如下:
GM脚本
public int PlayerLife = 3; [SerializeField] List<Image> List_Heart; public void ShowHeart() { if(PlayerLife == 2) { List_Heart[2].gameObject.SetActive(false); } if(PlayerLife == 1) { List_Heart[2].gameObject.SetActive(false); List_Heart[1].gameObject.SetActive(false); } if(PlayerLife == 0) { List_Heart[2].gameObject.SetActive(false); List_Heart[1].gameObject.SetActive(false); List_Heart[0].gameObject.SetActive(false); } }
流星脚本
private void OnTriggerEnter2D(Collider2D collision) { if (collision.CompareTag("Player")) { collision.gameObject.SetActive(false); GameManager.instance.PlayerLife = 0; GameManager.instance.ShowHeart(); } if (collision.CompareTag("Floor")) { collision.gameObject.SetActive(false); GameManager.instance.PlayerLife--; GameManager.instance.ShowHeart(); } }
问题根源
流星脚本的Floor碰撞分支里,错误执行了collision.gameObject.SetActive(false);——这里的collision是Floor对象,首次触地后Floor被禁用,后续流星无法触发Floor的碰撞器,自然不会再执行扣血逻辑。
修复方案
修正流星触地后的对象禁用逻辑:
将流星脚本中Floor分支的collision.gameObject.SetActive(false);改为gameObject.SetActive(false);,禁用流星自身而非Floor:if (collision.CompareTag("Floor")) { gameObject.SetActive(false); // 禁用当前流星对象 GameManager.instance.PlayerLife--; GameManager.instance.ShowHeart(); }优化GM的ShowHeart方法:
原方法重复代码过多,改用循环简化逻辑,同时适配生命值数量变化:public void ShowHeart() { for(int i = 0; i < List_Heart.Count; i++) { // 索引小于当前生命值的爱心保持激活,否则隐藏 List_Heart[i].gameObject.SetActive(i < PlayerLife); } }额外优化:
流星碰撞玩家时,建议同时禁用流星自身,避免重复触发碰撞:if (collision.CompareTag("Player")) { collision.gameObject.SetActive(false); gameObject.SetActive(false); // 禁用当前流星 GameManager.instance.PlayerLife = 0; GameManager.instance.ShowHeart(); }
内容的提问来源于stack exchange,提问作者malove
相关产品推荐
相关产品推荐

