Unity 2D俯视游戏如何实现敌人在玩家范围内攻击及解决NullReferenceException报错
空引用报错修复
错误出在Attack方法的组件调用、以及Inspector未赋值两个场景,按以下步骤排查修改:
- 首先删除代码第一行的乱码
enemy attausing,保留正确的命名空间引用开头 - 打开Unity Inspector面板,选中挂载
EnemyCombat的敌人对象,确认animator、AttackPoint两个公开变量已经挂载了对应组件,为空就拖对应对象进去赋值 - 你当前的
LayerMask命名为enemyLayers逻辑错误,敌人攻击需要检测的是玩家所在层,建议重命名为playerLayers,并在Inspector中勾选玩家对象所在的层,不要勾选敌人自身所在层,避免检测到无对应受伤组件的对象 - 给
GetComponent调用加空校验,避免检测到非目标层物体时抛出异常 - 补充:如果你的玩家对象上挂载的受伤脚本不叫
Enemy,需要把GetComponent<Enemy>()替换为你实际的玩家受伤脚本名,这也是空引用报错的常见原因
持续攻击循环修复
当前Update逻辑没有判断玩家是否在攻击范围,只要到冷却时间就自动触发攻击,需要先加范围检测逻辑,玩家在范围内才执行攻击:
- 攻击前先调用
Physics2D.OverlapCircle检测范围内是否存在玩家,存在才触发攻击逻辑 - 把范围检测逻辑提前到
Update里,减少不必要的性能消耗
修改后的完整代码
using System.Collections; using System.Collections.Generic; using UnityEngine; public class EnemyCombat : MonoBehaviour { public Animator animator; public Transform AttackPoint; public float attackRange = 0.5f; // 改名为playerLayers避免逻辑混淆 public LayerMask playerLayers; public int attackDamage = 5; public float attackRate = 2f; float nextAttackTime = 0f; void Update() { if (Time.time >= nextAttackTime) { // 先检测范围内是否有玩家,有再攻击 bool playerInRange = Physics2D.OverlapCircle(AttackPoint.position, attackRange, playerLayers); if (playerInRange) { Attack(); nextAttackTime = Time.time + 1f / attackRate; } } } void Attack() { animator.SetTrigger("Attack"); Collider2D[] hitPlayers = Physics2D.OverlapCircleAll(AttackPoint.position, attackRange, playerLayers); foreach (Collider2D player in hitPlayers) { // 加空校验避免报错 Enemy playerComp = player.GetComponent<Enemy>(); if (playerComp != null) { playerComp.TakeDamage(attackDamage); } } } void OnDrawGizmosSelected() { if (AttackPoint == null) return; Gizmos.DrawWireSphere(AttackPoint.position, attackRange); } }
内容的提问来源于stack exchange,提问作者ItsDamu
相关产品推荐
相关产品推荐

