Unityのエディタ拡張についての質問です。
Editor拡張初心者です。Unityのバージョンは2021.1.1f1です。
実現したいことは、ScriptableObjectで設定したパラメータのリストを、アタッチしたクラス(CharaController)でプルダウン化して、使いたいパラメータを簡単に指定できるようにすることです。
以下のスクリプトでは、Editorクラス内で、拡張するインスペクタのクラス(CharaController)を指定し処理のためScriptableObjectのクラスを読み込むということができず詰まっています。
Editor拡張では、拡張するクラス(CharaController)以外のクラス(ScriptableObject)の変数を参照するために読み込むことはできるのでしょうか?
ScriptableObject
1using System.Collections.Generic; 2using System.Linq; 3using UnityEngine; 4 5/// <summary> 6/// ScriptableObject 7/// </summary> 8[CreateAssetMenu(fileName = "CharaSettings", menuName = "CharaData/Parameter")] 9public class Testsc : ScriptableObject 10{ 11 [Header("====================Player===================\n")] 12 13 public PlayerDynamicStutas playerDynamicStutas = new PlayerDynamicStutas(); 14 15 public List<PlayerStaticStutas> playerStaticStutas = new List<PlayerStaticStutas>(); 16 17 [Header("====================Chara====================\n")] 18 19 public List<CharaStutas> _stutasList = new List<CharaStutas>(); 20 21 public List<CharaStutas> stutasList => _stutasList; 22 23 24 [SerializeField, HideInInspector] 25 public List<string> stutasNameList = new List<string>(); 26 27 [SerializeField, HideInInspector] 28 public string selectedStutasName; 29 30 [SerializeField, HideInInspector] 31 public int selectedStutasIndex; 32 33 private void OnValidate() 34 { 35 if (stutasList != null) CreateStutasNameList(); 36 } 37 38 /// <summary> 39 /// ステータスの名前リストを作成する 40 /// </summary> 41 private void CreateStutasNameList() 42 { 43 stutasNameList.Clear(); 44 45 foreach (var stutas in stutasList) 46 { 47 if (!stutasNameList.Contains(stutas.name)) stutasNameList.Add(stutas.name); 48 } 49 } 50 51 52 53 54 [System.Serializable] 55 public class PlayerDynamicStutas 56 { 57 public float health; 58 public float hungry; 59 public float stamina; 60 public float speed; 61 } 62 63 [System.Serializable] 64 public class PlayerStaticStutas 65 { 66 public string level; 67 public float power; 68 public float defense; 69 public float flightSpeedScale; 70 } 71 72 73 74 [System.Serializable] 75 public class CharaStutas 76 { 77 public string name; 78 [Header("Speed")] 79 public float MIN_SPEED; 80 public float MAX_SPEED; 81 public float START_SPEED; 82 public float speedScale; 83 84 [Header("Acceleration and Attenuation")] 85 public float DownAcceleration; 86 public float UpAttenuation; 87 public float GlideAttenuation; 88 public float rotationAttenuation; 89 90 [Header("Search")] 91 public float targetDistance; 92 public float searchAngle; 93 } 94} 95
Editor
1using UnityEditor; 2using System.Collections.Generic; 3 4/// <summary> 5/// キャラコントローラーのInspectorを拡張 6/// </summary> 7[CustomEditor(typeof(CharaController))] 8public class TestEditor : Editor 9{ 10 /// <summary> 11 /// 設定 12 /// </summary> 13 private Testsc _settings; 14 15 private CharaController _targetInspector; 16 17 /// <summary> 18 /// 選択したステータスのインデックス 19 /// </summary> 20 private static int _selectedStutasIndex; 21 22 private List<string> _stutasList = new List<string>(); 23 24 25 void OnEnable() 26 { 27 //_settings = (Testsc) target; 28 29 _targetInspector = (CharaController) target; 30 } 31 32 public override void OnInspectorGUI() 33 { 34 base.OnInspectorGUI(); 35 36 //変更があったときだけ 37 if (EditorGUI.EndChangeCheck()) 38 { 39 serializedObject.Update(); 40 41 42 //リストが空の時、エラーを吐くのでここで拾う 43 if (_settings.stutasList == null || _settings.stutasNameList.Count == 0) 44 { 45 EditorGUILayout.HelpBox("ステータスを設定してください", MessageType.Error); 46 return; 47 } 48 49 //リストの設定漏れは一番若い数字に 50 if (_settings.stutasNameList.Count <= _selectedStutasIndex) _settings.selectedStutasIndex = 0; 51 52 _selectedStutasIndex = EditorGUILayout.Popup("使用するステータス", _settings.selectedStutasIndex, _settings.stutasNameList.ToArray()); 53 54 //変更した値を設定側で保持 55 _settings.selectedStutasName = _settings.stutasNameList[_selectedStutasIndex]; 56 _settings.selectedStutasIndex = _selectedStutasIndex; 57 58 Undo.RecordObject(_targetInspector, "Settings Undo"); 59 EditorUtility.SetDirty(_targetInspector); 60 } 61 } 62}
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/07/08 03:10