一、症状描述
(1)从【主场景】跳转【某场景】时,报错——预制体丢失[prefab is missing]
(2)在编辑器单独启动该场景,没有报错
二、症状溯源
场景里面有预制体实例,但是我把预制体的资源删除了。
三、解决过程
- (1)手工检查预制体
纯手工把场景里的gameobjects都过了一遍,没有蓝色的预制体。但是报错依旧。 - (2)代码查找预制体
以为是手工检查漏了,于是写了个编辑器脚本,查找场景中预制体,始终没有找到。(源码见附录) - (3)发现真凶
手工漫无目的查看场景中的物体,突然发现有一个[地形]对象。心中一惊,莫非是里面的Tree报空。
点开一看,某个tree真的是missing
- (4)处理missing
四、附录源码——用代码查找场景中的预制体——编辑器脚本
using UnityEngine;#if UNITY_EDITOR
using UnityEditor;
#endif
/// <summary>
/// 查找场景中的预制体
/// </summary>
public class FindPrefabs : MonoBehaviour
{
#if UNITY_EDITORvoid SearchPrefabs(){GameObject[] objects = FindObjectsOfType<GameObject>();foreach (GameObject go in objects){// 检查是否是预制体实例if (PrefabUtility.GetPrefabInstanceHandle(go) != null){Debug.Log(go.name + " is a prefab instance");}else{//Debug.Log(go.name + "不是预制体");}// 获取预制体根对象 GameObject prefabRoot = PrefabUtility.GetNearestPrefabInstanceRoot(go);if (prefabRoot){Debug.Log(go.name + " is part of prefab " + prefabRoot.name);}}}[ContextMenu("查找预制体")]void Test(){SearchPrefabs();}
#endif
}