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
相关产品推荐
相关产品推荐

