如何通过编辑器脚本将文本资源分配给场景游戏对象



我有一个有关卡的场景。这个场景有 1.000 个级别。它的级别有一个文本资产。我想运行一个编辑器脚本并通过脚本分配这些文本资产,而不是通过将 1.000 个文本资产拖放到场景中。然后自动保存场景。

Scene mainScene = SceneManager.GetSceneByName("Main");
GameObject[] gameObjects = mainScene.GetRootGameObjects();
GameManager gameManager = gameObjects[0].GetComponent<GameManager>();
List<LanguageCategory> languageCategories = new List<LanguageCategory>();
LanguageCategoryPackInfo l1 = new LanguageCategoryPackInfo();
l1.displayName = "t1";
LanguageCategoryPackInfo l2 = new LanguageCategoryPackInfo();
l2.displayName = "t2";
languageCategories.Add(l1);
languageCategories.Add(l2);
gameManager.LanguageCategoryPackInfos = languageCategories;
//do the same assignment again, but with no luck
mainScene.GetRootGameObjects()[0].GetComponent<GameManager>().LanguageCategoryPackInfos = languageCategories;
EditorSceneManager.SaveScene(mainScene);

运行上述代码后,场景似乎没有改变。

直接在组件中进行某些更改的问题不会将其标记为,因此不会保存更改!(另请参阅下面的SerializedObject和解决方案中的解释。

您可以使用 EditorUtility.SetDirty 手动执行此操作。如前所述,您应该始终将其与首先调用Undo.RecordObject结合使用。

如果您不关心撤消/重做功能,也可以简单地使用EditorSceneManager.MarkSceneDirty

Scene mainScene = SceneManager.GetSceneByName("Main");
GameObject[] gameObjects = mainScene.GetRootGameObjects();
GameManager gameManager = gameObjects[0].GetComponent<GameManager>();
List<LanguageCategory> languageCategories = new List<LanguageCategory>();
LanguageCategoryPackInfo l1 = new LanguageCategoryPackInfo();
l1.displayName = "t1";
LanguageCategoryPackInfo l2 = new LanguageCategoryPackInfo();
l2.displayName = "t2";
languageCategories.Add(l1);
languageCategories.Add(l2);
// record an undo point
Undo.RecordObject(gameManager, "languages added");
gameManager.LanguageCategoryPackInfos = languageCategories;
// mark the object dirty so it will be saved
EditorUtility.SetDirty(gameManager);
// or simply directly
EditorSceneManager.MarkSceneDirty();
EditorSceneManager.SaveScene(mainScene);

作为替代方案,尽管它更复杂,但始终建议改为通过自动处理所有标记污和撤消/重做功能的SerializedObjectSerializedProperty

Scene mainScene = SceneManager.GetSceneByName("Main");
GameObject[] gameObjects = mainScene.GetRootGameObjects();
GameManager gameManager = gameObjects[0].GetComponent<GameManager>();
SerializedObject serializedObject = new SerializedObject(gameManager);
SerializedProperty languageCategories = serializedObject.FindProperty("LanguageCategoryPackInfos");
// load the current real values into the serializedObject
serializedObject.Update();
languageCategories.arraySize = 2;
SerializedProperty l1 = languageCategories.GetArrayElementAtIndex(0);
l1.FindPropertyRelative("displayName").stringValue = "t1";
SerializedProperty l2 = languageCategories.GetArrayElementAtIndex(1);
l2.FindPropertyRelative("displayName").stringValue= "t2";
// writes the changes bakc to the actual properties and marks them as dirty etc
serializedObject.ApplyModifiedProperties();
EditorSceneManager.SaveScene(mainScene);

注意:在智能手机上输入,所以没有警告,但我希望这个想法变得清晰

最新更新