Unityについての質問です。
自作クラスを普通に[SeriarizeField]にするだけでは、インスペクタにおいて自作クラスの子スラスを格納・編集することができないので、
TextAssetから自作クラス又はその子クラスを取得し、その中のシリアライズ項目をインスペクタ表示・編集を行うというエディタ拡張を作ろうとしています。
そこで自作クラスのインスタンスからSeriarizedObjectをnewしようとしましたが、
ArgumentException: Object at index 0 is null
の例外が出てしまい、インスペクタ表示ができません。
ソースコード
自作クラスの例
C#
1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5[System.Serializable] 6public class RootClass{ 7 [SerializeField] protected string exampleValue = "Over."; 8 public string ExampleValue => exampleValue; 9 public virtual void Act() { 10 Debug.Log("This is RootClass." + exampleValue); 11 } 12} 13
当該スクリプト
C#
1using System; 2using UnityEngine; 3#if UNITY_EDITOR 4using UnityEditor; 5#endif 6 7[System.Serializable] 8[CreateAssetMenu(fileName = "parent", menuName = "CreateParent")] 9public class DataClass : ScriptableObject { 10 [SerializeField, HideInInspector] string className = null; 11 public string ClassName => className; 12 [SerializeField, HideInInspector] RootClass rootClassData = null; 13 public RootClass RootClassData => rootClassData; 14 15 virtual public void Act(GameObject target) { 16 rootClassData.Act(); 17 } 18 19 public void SetClassName(string className) { 20 this.className = className; 21 rootClassData = null; 22 } 23 public void SetParentClass(RootClass parentClass) { 24 this.rootClassData = parentClass; 25 } 26} 27#if UNITY_EDITOR 28[CustomEditor(typeof(DataClass))] 29public class DataClassEditor : Editor { 30 /* 31 private void OnEnable() { 32 } 33 */ 34 DataClass targetDC => ((DataClass)target); 35 public override void OnInspectorGUI() { 36 serializedObject.Update(); 37 TextAsset behaviourScript; 38 39 string className; 40 behaviourScript = EditorGUILayout.ObjectField("BehaviourScript", null, typeof(TextAsset), false) as TextAsset; 41 if (behaviourScript != null) { 42 className = behaviourScript.name; 43 } else { 44 className = targetDC.ClassName; 45 } 46 47 if (className == null) { 48 EditorGUILayout.HelpBox("ClassName is null.", MessageType.Error); 49 } else { 50 if (className == "") { 51 EditorGUILayout.HelpBox("ClassName is blank.", MessageType.Error); 52 } else { 53 Type type = Type.GetType(className); 54 if (behaviourScript != null) 55 targetDC.SetClassName(behaviourScript.name); 56 EditorGUILayout.HelpBox("Attached: " + className, MessageType.Info); 57 58 var instance = Activator.CreateInstance(type); 59 60 //↓ここでArgumentException 61 var serObj = new SerializedObject(instance as UnityEngine.Object); 62 63 SerializedProperty prop = serObj.GetIterator(); 64 65 while (prop.Next(true)) { 66 EditorGUILayout.PropertyField(prop); 67 } 68 } 69 70 } 71 } 72} 73#endif
自作クラスの親クラスをUnityEngine.Object型にすることも試しましたが、同様のエラーが発生しました。
###やりたいことのイメージ
回答2件
あなたの回答
tips
プレビュー