Erro de unidade: Configurando o pai de uma transformação que reside em uma solução Prefab... (definida à força)

@[TOC](A definição do pai de uma transformação que reside em um Prefab Asset está desativada para evitar corrupção de dados (GameObject: 'New Game Object').)

Erro de unidade: Configurando o pai de uma transformação que reside em uma solução Prefab... (definida à força)

Tradução: definir nós pais em prefabs é proibido para evitar corrupção de dados

1. Quando ocorrerá a situação acima?

Quando queremos adicionar ou deletar diretamente objetos no prefab através do código, da seguinte forma:

string workDirectory = "Assets/Prefabs/TestPrefab.prefab";
GameObject go = AssetDatabase.LoadAssetAtPath(workDirectory, typeof(GameObject)) as GameObject;
GameObject newObj = new GameObject("newObj");
obj.transform.parent = go.transform;
AssetDatabase.SaveAssets();

Depois de executar este código, um erro é relatado:

Setting the parent of a transform which resides in a Prefab Asset is disabled to prevent data corruption (GameObject: 'newObj').

2. Solução 1

Você pode instanciar o prefab primeiro, da seguinte maneira:

string workDirectory = "Assets/Prefabs/TestPrefab.prefab";
GameObject go = AssetDatabase.LoadAssetAtPath(workDirectory, typeof(GameObject)) as GameObject;
GameObject targetObj = GameObject.Instantiate(go);
GameObject newObj = new GameObject("newObj");
newObj.transform.parent = targetObj .transform;

Isso pode atingir o objetivo de criar novos objetos, mas o prefab de destino será instanciado na cena e o prefab original precisa ser substituído manualmente, o que é muito problemático. A solução 2 pode ser feita em uma etapa

2. Solução 2

Opere o prefab diretamente e salve:

string workDirectory = "Assets/Prefabs/TestPrefab.prefab";
GameObject go = AssetDatabase.LoadAssetAtPath(workDirectory, typeof(GameObject)) as GameObject;
GameObject targetObj = PrefabUtility.InstantiatePrefab(go) as GameObject;
GameObject newObj = new GameObject("newObj");
newObj.transform.parent = targetObj .transform;
PrefabUtility.UnpackPrefabInstance(targetObj, PrefabUnpackMode.Completely, InteractionMode.AutomatedAction); // 删除原来的预制体
PrefabUtility.SaveAsPrefabAssetAndConnect(targetObj, workDirectory, InteractionMode.AutomatedAction); // 保存预制体到workDirectory
AssetDatabase.SaveAssets();

Isso conclui as operações de adicionar e salvar

おすすめ

転載: blog.csdn.net/qq_44858592/article/details/125682530