一、症状描述
(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_EDITOR
void 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
}