UnityEditor、動的コンポーネントエディターコンテンツ

Unityで自分のゲームに取り組んでいるときに、ゲームオブジェクトの動作を説明する同じタイプのスクリプトをたくさん作成しますが、作成できる場合は互いにわずかな違いがあり、それをコンポーネントとしてコンポーネントに追加すると、そのオブジェクト自体のタイプが選択されるだけで、エディター(別名インスペクター)には、選択したタイプに直接関連するプロパティとフィールドのみが表示されます。 また、スクリプト内の選択に応じて、1つまたは別の方法を使用できます。 UnityEditor名前空間とそのEditorクラスはこれを助けてくれました。





アップデート1

出版物に関するコメントを受け取ったため、警告するよう求められました。 さまざまな問題を解決するための上記の方法は魅力的ですが、それを悪用せずに、慎重かつ合理的に使用してください。 コードをオブジェクト指向からポリッジに変えないでください。



最初に出会ったのは、エディターでドロップダウンリストを実装する方法でした。 インターネット上のフォーラムで最初のトピックを見つけたので、それほど簡単ではないように見えましたが、忍耐により通常の列挙を使用することになりました。



using UnityEngine; public class TestComponent : MonoBehaviour { //     . //    ,     . public enum ComponentType {First = 1, Second = 2}; public ComponentType component; }
      
      







結果



次。 たとえば、テキストを含む文字列型のフィールドを格納するコンポーネントが必要です。 また、2つの整数変数が必要です。最初の変数には最初のオプションに関連付けられた値があり、2番目の変数には2番目のオプションが関連付けられています。



結果のTestComponent.csファイル:



 using UnityEngine; public class TestComponent : MonoBehaviour { public enum ComponentType {First = 1, Second = 2}; public ComponentType component; public string componentName; public int variableComponentFirst; public int variableComponentSecond; }
      
      







それは判明したが、これは私たちが必要とするものではない



エディターで最初のオプションを選択すると、最初の変数のみを編集するフィールドが表示され、2番目の変数は非表示になります。 2番目のオプションが選択されている場合-反対。 これらの変数は0から100までの値を持つことができ、スライダー(スライダー)としてエディターに表示されます。 また、テキストフィールドも選択したオプションによって異なります。



これをすべて実装するために、 UnityEditor名前空間とEditorクラスからの継承を利用しました。この場合、コードから直接望むようにエディターウィンドウを再描画できます。 コンポーネントエディターを変更するために記述されたコードは、記述されたコンポーネントの機能が記述されているのと同じスクリプトに記述しないでください。 これを行うには、 Assetsフォルダーに特別なエディターフォルダーを作成し、コンポーネントのエディタービューを変更するように設計されたすべてのスクリプトを保存する必要があります。 このフォルダに含まれるスクリプトは、使用可能なスクリプトのリストをインスペクターで追加するときに干渉しません。



コメント付きの対応するTestComponentEditor.csスクリプト:



 //      using UnityEditor; using UnityEngine; //        [CustomEditor( typeof(TestComponent) )] [CanEditMultipleObjects] public class TestComponentEditor : Editor { TestComponent subject; SerializedProperty compType; SerializedProperty compName; SerializedProperty varCompFirst; SerializedProperty varCompSecond; //         void OnEnable () { subject = target as TestComponent; compType = serializedObject.FindProperty("component"); compName = serializedObject.FindProperty ("componentName"); varCompFirst = serializedObject.FindProperty ("variableComponentFirst"); varCompSecond = serializedObject.FindProperty ("variableComponentSecond"); } //    public override void OnInspectorGUI() { //   .        //      . serializedObject.Update (); //     EditorGUILayout.PropertyField(compType); //     EditorGUILayout.PropertyField(compName); //    compName.stringValue = "None"; //     , if(subject.component == TestComponent.ComponentType.First) { //    EditorGUILayout.IntSlider (varCompFirst, 0, 100, new GUIContent ("Variable First")); compName.stringValue = "First"; } else if(subject.component == TestComponent.ComponentType.Second) { EditorGUILayout.IntSlider (varCompSecond, 0, 100, new GUIContent ("Variable Second")); compName.stringValue = "Second"; } //    serializedObject.ApplyModifiedProperties (); } }
      
      







最初に選択されたオプション





オプション2を選択



ところで、標準エディターを消去してから完全に再描画する必要はありません。 標準のコンポーネントエディターで小さな変更を行う場合は、 DrawDefaultInspector()メソッドを使用して、コンポーネントエディターを再描画せずに補足することができます。 OnInspectorGUI()エディターレンダリングイベントの最初にメソッドを作成しています。 TestComponentEditorスクリプトで作成されたエディターフィールドは、エディター内のTestComponentスクリプトのパブリックフィールドを置き換えませんが、以下に追加されることに注意してください。 この場合、両方とも同じ変数で機能します。 エディターにフィールドの新しいバージョンを残すには、 TestComponentスクリプトで、対応するパブリック変数の前に[HideInInspector]属性を追加します。



さらに、さらに深くすることもできます。 他のタイプの変数とその編集方法を試してください。 編集用の曲線と、値を表示する進行状況バーのように。 EditorGUILayotクラスと隣接するクラスは、このような可能性を提供します。 また、選択に応じていくつかの方法で作業することもできますが、他の方法では作業できない場合もあります。 しかし、私はこれらすべてをあなた自身の想像力によって制限されたあなた自身のアイデアを実装するためにあなたに任せます 何ができるかをお見せしました。



Unityドキュメントのエディタークラス。



All Articles