Unity报错:Setting the parent of a transform which resides in a Prefab......解决方案(强行设置)

@[TOC](Setting the parent of a transform which resides in a Prefab Asset is disabled to prevent data corruption (GameObject: ‘New Game Object’).)

Unity报错:Setting the parent of a transform which resides in a Prefab…解决方案(强行设置)

翻译:在预制体中设置父节点是禁止的,以防止数据损坏

1.什么时候会出现上述情况?

当我们想通过代码直接在预制体中添加或删除对象时,如下:

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();

这段代码运行后,报错:

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

2.解决方案1

可以先把预制体实例化出来,如下:

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;

这样做可以达到创建新对象的目的,但会将目标预制体实例化到场景里,还需要自己手动替换原来的预制体,很麻烦,解决方案2可以一步到位

2.解决方案2

直接操作预制体,并保存:

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();

这样就完成了增加和保存操作

猜你喜欢

转载自blog.csdn.net/qq_44858592/article/details/125682530