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

Unity C#敌人AI脚本中FindGameObjectWithTag失效,触发空引用异常

解决Unity AI Chase状态的NullReferenceException问题

可能的错误点及修复方案

1. Animator未初始化

代码中仅声明了Animator animator但从未赋值,在Update方法中调用animator.SetFloat必然触发空引用异常。修复方式:
在Enter方法中初始化Animator,可从agent对象或当前状态所在GameObject获取:

public void Enter(AiAgent agent)
{
    // 初始化playerTransform
    if (playerTransform == null)
    {
        playerTransform = GameObject.FindGameObjectWithTag("Player").transform;
    }
    // 初始化Animator
    animator = agent.GetComponent<Animator>();
    // 若Animator在状态脚本所在对象上,也可使用:
    // animator = GetComponent<Animator>();
}

2. PlayerTransform未正确赋值

即使已设置Player标签,仍可能存在以下问题:

  • 状态的Enter方法未被调用:检查AiStateMachine是否在切换到ChasePlayer状态时正确调用了Enter方法。如果状态机直接进入Update而跳过Enter,playerTransform会保持null。
  • 标签拼写错误:确保玩家对象的标签是精确的"Player"(区分大小写,无空格),且对象处于激活状态。
  • 增加空值检查容错:在获取Player对象时添加判断,避免后续代码崩溃:
public void Enter(AiAgent agent)
{
    if (playerTransform == null)
    {
        GameObject playerObj = GameObject.FindGameObjectWithTag("Player");
        if (playerObj != null)
        {
            playerTransform = playerObj.transform;
        }
        else
        {
            Debug.LogError("找不到带Player标签的对象!");
        }
    }
}

同时在Update方法开头增加全局空值检查,提前终止错误逻辑:

public void Update(AiAgent agent)
{
    if (playerTransform == null || animator == null || agent.navMeshAgent == null || agent.config == null)
    {
        Debug.LogWarning("必要组件未初始化,跳过Update逻辑");
        return;
    }

    timer -= Time.deltaTime;
    if (timer < 0.0f)
    {
        float sqDistance = (playerTransform.position - agent.navMeshAgent.destination).sqrMagnitude;
        if (sqDistance > agent.config.maxDistance * agent.config.maxDistance)
        {
            agent.navMeshAgent.destination = playerTransform.position;
        }
        timer = agent.config.maxTime;
    }
    agent.navMeshAgent.destination = playerTransform.position;
    animator.SetFloat("Speed", agent.navMeshAgent.velocity.magnitude);
}

3. Agent组件未正确赋值

确保AiAgent脚本中的navMeshAgent和config已通过Inspector赋值或在Awake/Start中初始化:

// 在AiAgent脚本中
public NavMeshAgent navMeshAgent;
public AiConfig config; // 假设AiConfig是你的配置类

private void Awake()
{
    if (navMeshAgent == null)
    {
        navMeshAgent = GetComponent<NavMeshAgent>();
    }
    if (config == null)
    {
        Debug.LogError("AiAgent的config未赋值!");
    }
}

额外排查步骤

  • 定位错误行:根据报错信息,异常发生在AiChasePlayerState.cs:36,对应代码中playerTransform.position或animator.SetFloat的概率最高,通过空值检查可以快速确认。
  • 启用Debug日志:在关键位置添加Debug.Log,打印playerTransform、animator等对象的状态,确认是否为null。

内容的提问来源于stack exchange,提问作者FalseAlias

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 18:53:29