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

Unity预制体实例引用问题:生成无人机时旧实例丢失引用报错

问题分析与解决方案

核心问题拆解

你的代码中保存生成无人机引用时出现旧实例销毁、scope列表引用丢失的问题,根源不在局部变量newDrone本身(局部变量不会影响旧实例的生命周期),大概率是以下几个环节出了问题:


1. 排查旧实例被销毁的原因

首先打开Unity Hierarchy面板,观察新无人机生成后旧对象是否真的消失:

  • 检查无人机预制体或父对象enemies上是否有自动销毁逻辑(比如TimedDestructor组件、碰撞触发销毁的脚本)
  • 检查Drone脚本的其他生命周期方法(如Update、OnCollisionEnter)是否存在误触发销毁的代码
  • 确认生成位置transform.position + new Vector3(0,0,5)是否处于场景中的死亡区域(比如触发了边界销毁逻辑)

2. 修复scope列表的引用丢失问题

你的Drone基类Start方法会将自身加入CollManager的scope列表,但引用丢失通常和单例实现或未清理无效引用有关:

(1)确保CollManager单例正确实现

如果单例逻辑错误,每次获取Instance都会生成新对象,旧的scope列表自然会失效。修正单例代码:

public class CollManager : MonoBehaviour
{
    private static CollManager _instance;
    public static CollManager Instance
    {
        get
        {
            if (_instance == null)
            {
                _instance = FindObjectOfType<CollManager>();
                // 若场景中没有CollManager实例,可动态创建(可选)
                if (_instance == null)
                {
                    GameObject managerObj = new GameObject("CollManager");
                    _instance = managerObj.AddComponent<CollManager>();
                }
            }
            return _instance;
        }
    }

    public List<GameObject> scope = new List<GameObject>();
}

(2)添加无效引用清理逻辑

无人机被销毁后,需从scope列表中移除自身,避免残留无效引用。在Drone基类中添加:

protected virtual void OnDestroy()
{
    if (CollManager.Instance != null && CollManager.Instance.scope.Contains(gameObject))
    {
        CollManager.Instance.scope.Remove(gameObject);
    }
}

3. 修正无人机生成代码

调整Instantiate的调用方式,明确位置与父对象的设置顺序,避免父对象变换影响生成位置:

void SpawnDrone()
{
    Vector3 spawnPos = transform.position + new Vector3(0, 0, 5);
    // 使用完整重载:先设置世界位置,再指定父对象
    GameObject newDrone = Instantiate(drone, spawnPos, Quaternion.identity, enemies.transform);

    // 这里可以直接使用newDrone做后续操作(比如获取Drone组件)
    Drone droneComp = newDrone.GetComponent<Drone>();
    if (droneComp != null)
    {
        // 执行自定义初始化逻辑,比如设置血量、速度等
    }

    Invoke(nameof(SpawnDrone), coolDown);
}

4. 额外检查点

  • 确认drone预制体上的CollisionBox组件存在,避免GetComponent<CollisionBox>()返回null后触发其他错误逻辑
  • 检查coolDown变量是否为正数,避免无限递归调用SpawnDrone导致性能问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 20:05:38