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

Unity积分系统失效:碰撞后销毁物体并累加积分功能异常

问题分析与解决方案

你的核心问题在于碰撞逻辑的执行顺序、积分系统的触发方式错误,以及遗漏了目标物体的销毁操作,具体问题和修复方案如下:

现有代码的问题

  1. 子弹脚本未处理目标销毁:原代码只销毁了子弹本身,没有销毁碰撞到的目标物体,不符合需求。
  2. 积分触发逻辑完全错误:用Update循环检测子弹的points值,一旦子弹销毁,这个引用会直接失效(变成null),根本无法触发加分;就算子弹没销毁,只要points等于1,每帧都会执行加分,导致积分疯狂增长。
  3. 直接在子弹里加积分失效的可能原因:大概率是你没正确获取积分脚本的实例,或者先销毁了子弹再执行加分代码,导致加分逻辑被中断。

修复后的代码实现

第一步:重构积分脚本,提供明确的加分方法

把积分系统改成可被外部调用的形式,避免依赖状态检测:

public class PointCounter : MonoBehaviour
{
    public int pointcounter;

    // 公开的加分方法,供外部调用
    public void AddScore()
    {
        pointcounter++;
        // 可选:打印日志验证
        Debug.Log("当前积分:" + pointcounter);
    }
}

第二步:修正子弹的碰撞逻辑

确保碰撞时先处理目标销毁、积分加分,最后销毁子弹,同时正确引用积分系统:

public class Bullet : MonoBehaviour
{
    // 在Inspector面板中,把挂载了PointCounter的对象拖到这里
    public PointCounter scoreSystem;

    private void OnCollisionEnter2D(Collision2D collision)
    {
        // 用CompareTag比直接判断tag更高效,还能避免拼写错误
        if (collision.gameObject.CompareTag("Object"))
        {
            // 1. 销毁碰撞到的目标物体
            Destroy(collision.gameObject);
            // 2. 调用积分系统的加分方法
            scoreSystem.AddScore();
            // 3. 最后销毁子弹自己
            Destroy(gameObject);
        }
    }
}

额外注意事项

  • 碰撞条件检查:确保目标物体和子弹都有Collider2D组件,且至少其中一个物体带有Rigidbody2D(如果是静态目标,Rigidbody2D可以设置为Kinematic),否则OnCollisionEnter2D不会触发。
  • Tag命名正确:确认目标物体的Tag确实是Object,注意大小写一致。
  • 避免空引用:一定要在Inspector中给子弹的scoreSystem赋值,或者用FindObjectOfType<PointCounter>()在Start()方法中自动获取(后者适合场景中只有一个积分系统的情况)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 22:55:13