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
相关产品推荐
相关产品推荐

