プレハブが見つからない [インデックス n の XX プレハブが見つかりません] および [コードを使用してシーン内のプレハブを検索する] のトラブルシューティング エクスペリエンス

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
}

おすすめ

転載: blog.csdn.net/dzj2021/article/details/132756797