@[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();
这样就完成了增加和保存操作