主にいくつかの問題が発生しました
- 最初は ScriptObject で辞書を使っていましたが、unity ScriptObject は辞書をサポートしていないらしく、データが生成されるたびに消えてしまうので、後から
List を使うように修正します。
- 最初は対象オブジェクトを直接取得してデータ表示用の対象オブジェクトに変換しているため、インスペクターパネル上で変更してもデータが保存されず、コードで変更したデータも保存されないのですが、後から判明したのですが、unityエディターの拡張機能では自動保存や手動保存をトリガーする前にSerializedProperty属性の値を変更する必要があるようです。
ソリューション
- 他のデータは通常、ターゲットによって変換されたオブジェクトを使用して表示され、SerializedProperty の値の変更を制御する変数がシリアル化されたオブジェクトに特別に設定されるため、Unity の自動保存と手動保存をトリガーできます。
インスペクター拡張コード
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;
[CustomEditor( typeof( GameManagerConfig ) )]
public class GameManagerConfigInspector : Editor
{
private GameManagerConfig config=> target as GameManagerConfig;
private ChannelManagerConfig curChannelConfig => config.GetChannelManagerConfig( config.curChannel );
private SerializedProperty changeCount;
void OnEnable()
{
changeCount = serializedObject.FindProperty( "changeCount" );
}
public override void OnInspectorGUI()
{
EditorGUILayout.BeginHorizontal();
if ( GUILayout.Button("更新管理类配置信息") )
{
config.GenerateGameManagerConfig();
ApplyModify();
}
if ( GUILayout.Button("清除管理类配置信息") )
{
config.Clear();
ApplyModify();
}
EditorGUILayout.EndHorizontal();
if ( config.channelManagerConfigList.Count ==0)
{
return;
}
EditorGUI.BeginChangeCheck();
config.curChannel = ( ChannelEnum ) EditorGUILayout.EnumPopup( "当前平台 :" , config.curChannel );
foreach ( ManagerClassInfo managerClass in curChannelConfig.managerClassList)
{
if ( managerClass.implementClassList.Count >0 )
{
EditorGUILayout.BeginHorizontal( GUI.skin.label );
EditorGUILayout.LabelField( managerClass.sampleMangerName );
managerClass.useIndex = EditorGUILayout.Popup( managerClass.useIndex , managerClass.sampleImplementClassName);
EditorGUILayout.EndHorizontal();
}
}
if ( EditorGUI.EndChangeCheck() )
{
ApplyModify();
}
}
private void ApplyModify()
{
serializedObject.Update();
changeCount.intValue++;
serializedObject.ApplyModifiedProperties();
}
}