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

Unity3d 如何通过编辑器脚本将文本资源分配给场景游戏对象?,unity3d,unity3d-editor,unity-editor,Unity3d,Unity3d Editor,Unity Editor,我有一个有关卡的场景。此场景有1000个级别。它的级别有一个TextAsset。我希望运行EditorScript并通过脚本分配这些TextAssets,而不是将1.000 TextAssets拖放到场景中。然后自动保存场景 scenemainsecene=SceneManager.GetSceneByName(“Main”); GameObject[]gameObjects=mainScene.GetRootGameObjects(); GameManager GameManager=game

我有一个有关卡的场景。此场景有1000个级别。它的级别有一个TextAsset。我希望运行EditorScript并通过脚本分配这些TextAssets,而不是将1.000 TextAssets拖放到场景中。然后自动保存场景

scenemainsecene=SceneManager.GetSceneByName(“Main”);
GameObject[]gameObjects=mainScene.GetRootGameObjects();
GameManager GameManager=gameObjects[0]。GetComponent();
List languageCategories=新列表();
LanguageCategoryPackInfo l1=新的LanguageCategoryPackInfo();
l1.displayName=“t1”;
LanguageCategoryPackInfo l2=新的LanguageCategoryPackInfo();
l2.displayName=“t2”;
语言类别。添加(l1);
语言类别。添加(l2);
gameManager.LanguageCategoryPackInfos=语言类别;
//再次做同样的作业,但运气不好
mainScene.GetRootGameObjects()[0].GetComponent().LanguageCategoryPackInfos=languageCategories;
EditorSceneManager.SaveScene(主场景);

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

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

您可以使用手动执行此操作。正如上面提到的,你应该总是把它和first也叫结合起来

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

scenemainsecene=SceneManager.GetSceneByName(“Main”);
GameObject[]gameObjects=mainScene.GetRootGameObjects();
GameManager GameManager=gameObjects[0]。GetComponent();
List languageCategories=新列表();
LanguageCategoryPackInfo l1=新的LanguageCategoryPackInfo();
l1.displayName=“t1”;
LanguageCategoryPackInfo l2=新的LanguageCategoryPackInfo();
l2.displayName=“t2”;
语言类别。添加(l1);
语言类别。添加(l2);
//记录撤消点
撤销.RecordObject(游戏管理器,“添加语言”);
gameManager.LanguageCategoryPackInfos=语言类别;
//将对象标记为脏,以便将其保存
SetDirty(游戏管理器);
//或者直接
EditorSceneManager.markscenedity();
EditorSceneManager.SaveScene(主场景);

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

scenemainsecene=SceneManager.GetSceneByName(“Main”);
GameObject[]gameObjects=mainScene.GetRootGameObjects();
GameManager GameManager=gameObjects[0]。GetComponent();
SerializedObject SerializedObject=新的SerializedObject(gameManager);
SerializedProperty languageCategories=serializedObject.FindProperty(“LanguageCategoryPackageInfos”);
//将当前实值加载到serializedObject中
serializedObject.Update();
languageCategories.arraySize=2;
SerializedProperty l1=语言类别。GetArrayElementIndex(0);
l1.FindPropertyRelative(“displayName”).stringValue=“t1”;
SerializedProperty l2=languageCategories.GetArrayElementIndex(1);
l2.FindPropertyRelative(“displayName”).stringValue=“t2”;
//将bakc更改写入实际属性,并将其标记为脏等
serializedObject.ApplyModifiedProperties();
EditorSceneManager.SaveScene(主场景);

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