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

Unity2D:解决未实例化对象在Start()中触发空引用异常问题

解决Unity Enemy脚本空引用异常的方案

方案一:先判断对象存在性再赋值

直接链式调用GameObject.FindGameObjectWithTag("heroK").GetComponent<Transform>()会在目标不存在时报错——因为FindGameObjectWithTag返回null后,调用GetComponent会触发空引用。修改代码,先捕获查找结果,再进行后续操作:

private Transform newtarget;
void Start()
{
    GameObject heroObj = GameObject.FindGameObjectWithTag("heroK");
    // 先判断目标对象是否存在
    if (heroObj != null)
    {
        newtarget = heroObj.GetComponent<Transform>();
    }
}

方案二:延迟检测目标(适合简单场景)

如果目标是在Enemy生成后才实例化的,可以在Update中仅当目标为空时进行查找,找到后停止检测,减少性能消耗:

private Transform newtarget;
void Update()
{
    // 仅当目标未找到时才执行查找
    if (newtarget == null)
    {
        GameObject heroObj = GameObject.FindGameObjectWithTag("heroK");
        if (heroObj != null)
        {
            newtarget = heroObj.GetComponent<Transform>();
        }
    }
}

方案三:事件通知(高效推荐)

通过事件系统让目标实例化时主动通知Enemy脚本,避免频繁查找。

  1. 在目标生成脚本中定义静态事件:
public class HeroSpawner : MonoBehaviour
{
    // 定义静态事件,传递生成的英雄Transform
    public static event System.Action<Transform> OnHeroSpawned;
    public GameObject heroPrefab;

    public void SpawnHero()
    {
        GameObject hero = Instantiate(heroPrefab);
        hero.tag = "heroK";
        // 触发事件,传递英雄的Transform
        OnHeroSpawned?.Invoke(hero.transform);
    }
}
  1. 修改Enemy脚本订阅事件:
private Transform newtarget;

void OnEnable()
{
    // 订阅英雄生成事件
    HeroSpawner.OnHeroSpawned += SetTarget;
}

void OnDisable()
{
    // 取消订阅,避免内存泄漏
    HeroSpawner.OnHeroSpawned -= SetTarget;
}

// 接收事件传递的目标Transform
void SetTarget(Transform heroTransform)
{
    newtarget = heroTransform;
}

这种方式无需主动查找,目标生成时直接传递引用,是性能最优的解决方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 10:39:34