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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 17:15:03