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

Unity添加含Destroy的OnCollisionEnter后子弹无法初始化问题

问题成因
  • 核心原因是子弹生成瞬间与发射方(玩家/武器自身)的碰撞体重叠触发碰撞:启用OnCollisionEnter逻辑后,子弹刚完成实例化就立刻触发碰撞、执行Destroy(gameObject),还没完成飞行初始化就被销毁,视觉上表现为按空格键完全无法生成子弹。
  • 额外的子弹残留问题:没有碰撞销毁逻辑时,子弹飞出有效场景范围后不会自动销毁,因此会累积大量Bullet (Clone)对象占用资源。
  • 可通过在OnCollisionEnter中添加Debug.Log(collision.gameObject.name)验证,运行发射后如果控制台打印出发射方的对象名称,即可确认是自毁问题。
解决方案

1. 碰撞层过滤(最优方案)

  • 给发射方(玩家/武器)和子弹分别设置独立Layer,例如命名为Player和Bullet
  • 打开Unity编辑器Edit > Project Settings > Physics,找到碰撞矩阵,取消勾选Player层和Bullet层的碰撞交互,彻底屏蔽子弹和发射方的碰撞判定。

2. 增加碰撞对象过滤逻辑

修改OnCollisionEnter代码,通过Tag排除发射方,避免自毁:

private void OnCollisionEnter(Collision collision)
{
    // 提前将发射方的Tag设置为Player,仅碰撞到非玩家对象时销毁
    if (!collision.gameObject.CompareTag("Player"))
    {
        Destroy(gameObject);
    }
}

3. 调整子弹生成点位

修改发射逻辑中子弹的生成坐标,让子弹在枪口前方偏移0.2~0.5m的位置生成,避免和玩家自身碰撞体重叠,从根源避免生成瞬间触发碰撞。

4. 新增超时自动销毁逻辑

为避免子弹飞出场景后永久残留,给子弹增加超时销毁机制,修改后的完整Bullet脚本参考:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Bullet : MonoBehaviour
{
    Rigidbody rigidbody;
    void Awake()
    {
        rigidbody = GetComponent<Rigidbody>();
    }

    public void InitializeBullet(Vector3 originalDirection)
    {
        transform.forward = originalDirection;
        rigidbody.velocity = transform.forward * 18f; 
        // 2秒后自动销毁,时长可根据游戏需求调整
        Invoke(nameof(DestroyBullet), 2f);
    }

    private void DestroyBullet()
    {
        if(gameObject != null) Destroy(gameObject);
    }

    private void OnCollisionEnter(Collision collision)
    {
        // 碰撞后销毁,同时取消超时调用避免空引用报错
        CancelInvoke(nameof(DestroyBullet));
        Destroy(gameObject);
    }
}

5. 检查预制体参数配置

确认子弹预制体的组件参数符合要求:

  • Rigidbody组件不要勾选Is Kinematic,否则刚体不会触发碰撞事件
  • 如果子弹飞行速度较快,可将Collision Detection设置为Continuous Dynamic,避免高速移动时出现穿墙漏判问题
  • Collider组件不要勾选Is Trigger,如果需要使用触发器逻辑,需要将碰撞回调函数替换为OnTriggerEnter(Collider other)

内容的提问来源于stack exchange,提问作者David Sowemimo-Henry

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 00:15:04