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

Unity中使用RayCast攻击时游戏崩溃,求无投射物解决方案

RayCast射击崩溃修复方案

崩溃原因

你的HitEnemy脚本在射线命中后,错误地尝试获取当前挂载脚本物体的EnemyHealth组件,而非射线击中的敌人对象的组件。如果该脚本未挂在敌人身上,GetComponent会返回null,调用TakeDamage时触发空引用异常导致崩溃。

修改后的HitEnemy脚本

public class HitEnemy : MonoBehaviour
{
    [SerializeField] Camera cam;
    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            Ray ray = cam.ViewportPointToRay(new Vector3(0.5f, 0.5f));
            if (Physics.Raycast(ray, out RaycastHit hit))
            {
                // 从命中的敌人对象获取EnemyHealth组件
                EnemyHealth enemyHealth = hit.collider.GetComponent<EnemyHealth>();
                // 先检查组件是否存在,避免空引用
                if (enemyHealth != null)
                {
                    enemyHealth.TakeDamage(10);
                }
            }
        }
    }     
}

Enemy对象需要添加的组件

  • Collider组件:给Enemy对象添加合适的碰撞体(如BoxCollider、SphereCollider),确保未勾选Is Trigger(若需检测触发碰撞,需在Physics.Raycast中设置includeTriggers: true)。
  • 已挂载的EnemyHealth脚本保持不变,确保maxHealth参数在Inspector中正常设置。

额外优化建议

  • 在Inspector中正确赋值cam变量,拖入你的主相机对象。
  • 若敌人在特定Layer,可添加层掩码限制射线检测范围,避免误触其他物体:
    [SerializeField] LayerMask enemyLayer;
    
    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            Ray ray = cam.ViewportPointToRay(new Vector3(0.5f, 0.5f));
            // 使用层掩码只检测敌人层
            if (Physics.Raycast(ray, out RaycastHit hit, Mathf.Infinity, enemyLayer))
            {
                EnemyHealth enemyHealth = hit.collider.GetComponent<EnemyHealth>();
                if (enemyHealth != null)
                {
                    enemyHealth.TakeDamage(10);
                }
            }
        }
    }
    

内容的提问来源于stack exchange,提问作者Leila Woźniak

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 07:10:31