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

Unity中碰撞后更新分数/生命值并打印日志的问题求助

Unity碰撞检测逻辑修正方案

原代码核心问题

  • 逻辑混淆:玩家碰撞动物时错误减少score而非lives,生命值归0的判断条件也用错变量
  • 日志输出不全:仅打印分数,未按需求同步打印更新后的生命值
  • 数据不独立:每个挂载该脚本的动物都持有单独的score和lives,导致分数、生命值无法全局统一统计
  • 对象销毁逻辑错误:玩家生命值归0时才销毁玩家,原代码错误在score==0时触发销毁

修正后的代码实现

建议将分数和生命值放到全局单例的GameManager中,避免每个动物实例持有独立数据,同时修正碰撞逻辑:

using UnityEngine;

// 全局游戏管理单例,统一存储分数和生命值
public class GameManager : MonoBehaviour
{
    public static GameManager Instance;

    public int score = 0;
    public int lives = 3;

    private void Awake()
    {
        // 确保单例唯一
        if (Instance == null)
            Instance = this;
        else
            Destroy(gameObject);
    }
}

// 挂载在动物对象上的碰撞检测脚本
public class DetectCollision : MonoBehaviour
{
    private void OnTriggerEnter(Collider other)
    {
        // 食物碰撞动物:加分
        if (other.CompareTag("food"))
        {
            GameManager.Instance.score++;
            Debug.Log($"当前分数:{GameManager.Instance.score},当前生命值:{GameManager.Instance.lives}");
            Destroy(other.gameObject); // 销毁食物
            Destroy(gameObject); // 销毁当前动物
        }
        // 玩家碰撞动物:减生命值
        else if (other.CompareTag("Player"))
        {
            GameManager.Instance.lives--;
            Debug.Log($"当前分数:{GameManager.Instance.score},当前生命值:{GameManager.Instance.lives}");
            
            // 生命值归0时销毁玩家
            if (GameManager.Instance.lives <= 0)
            {
                Destroy(other.gameObject);
                Debug.Log("玩家生命值耗尽,已销毁");
            }
            Destroy(gameObject); // 销毁当前动物
        }
    }
}

额外注意事项

  • 确保所有碰撞对象(玩家、食物、动物)都添加Collider组件,并勾选Is Trigger
  • 玩家或动物对象需添加Rigidbody组件(静态物体除外),否则OnTriggerEnter不会触发
  • 在场景中创建空对象并挂载GameManager脚本,保证全局数据唯一

内容的提问来源于stack exchange,提问作者Pratik

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 15:39:20