1. 症状の説明
(1) [Main Scene] から [Certain Scene] にジャンプするとエラーが報告されます – prefab is missing [prefab is missing]
(2) エディターでシーンを個別に起動した場合、エラーは報告されません
2. 症状の追跡可能性
シーン内にプレハブ インスタンスがありますが、プレハブ リソースを削除しました。
3. 解決プロセス
- (1) プレハブを手動で確認する
シーン内のすべてのゲームオブジェクトを手動で確認しましたが、青いプレハブはありませんでした。しかし、エラーは残ります。 - (2) プレハブのコード検索
手動検査では見落とされたと思い、シーン内のプレハブを検索するエディタ スクリプトを作成しましたが、見つかりませんでした。(ソースコードについては付録を参照してください) - (3) 真犯人を発見する
現場内の物体を手でぶらぶら確認していると、突然[地形]オブジェクトを発見しました。私はショックを受けました。おそらく、中のツリーが空であると報告したのでしょう。
それをクリックすると、特定の木が本当になくなっていることがわかります。
- (4) ハンドルが欠品している
4. 付録のソース コード - コードを使用してシーン内のプレハブを検索 - エディター スクリプト
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
}