カスタムエディターを派生する基本クラス。これを使用して独自のインスペクターとオブジェクト用のエディターを作成します。
鎧や、ダメージ、銃の GameObject へ参照する変数のスクリプト MyPlayer があるとします。
using UnityEngine; using System.Collections;
// This is not an editor script. public class MyPlayer : MonoBehaviour { public int armor = 75; public int damage = 25; public GameObject gun;
void Update() { // Update logic here... } }
カスタムエディターを使用して、インスペクター上のスクリプトの表示を例えば次のように変更することができます。
Custom editor in the Inspector.
エディターをカスタムのコンポーネントにアタッチするために CustomEditor 属性を使用できます。
There are multiple ways to design custom Editors.
If you want the Editor to support multi-object editing, you can use the CanEditMultipleObjects attribute.
Instead of modifying script variables directly, it's advantageous to use the SerializedObject and SerializedProperty
system to edit them, since this automatically handles multi-object editing, undo, and prefab overrides. If this approach is used a user can select multiple assets in the hierarchy window and change the values for all of them at once.
using UnityEditor; using UnityEngine; using System.Collections;
// Custom Editor using SerializedProperties. // Automatic handling of multi-object editing, undo, and prefab overrides. [CustomEditor(typeof(MyPlayer))] [CanEditMultipleObjects] public class MyPlayerEditor : Editor { SerializedProperty damageProp; SerializedProperty armorProp; SerializedProperty gunProp;
void OnEnable() { // Setup the SerializedProperties. damageProp = serializedObject.FindProperty ("damage"); armorProp = serializedObject.FindProperty ("armor"); gunProp = serializedObject.FindProperty ("gun"); }
public override void OnInspectorGUI() { // Update the serializedProperty - always do this in the beginning of OnInspectorGUI. serializedObject.Update ();
// Show the custom GUI controls. EditorGUILayout.IntSlider (damageProp, 0, 100, new GUIContent ("Damage"));
// Only show the damage progress bar if all the objects have the same damage value: if (!damageProp.hasMultipleDifferentValues) ProgressBar (damageProp.intValue / 100.0f, "Damage");
EditorGUILayout.IntSlider (armorProp, 0, 100, new GUIContent ("Armor"));
// Only show the armor progress bar if all the objects have the same armor value: if (!armorProp.hasMultipleDifferentValues) ProgressBar (armorProp.intValue / 100.0f, "Armor");
EditorGUILayout.PropertyField (gunProp, new GUIContent ("Gun Object"));
// Apply changes to the serializedProperty - always do this in the end of OnInspectorGUI. serializedObject.ApplyModifiedProperties (); }
// Custom GUILayout progress bar. void ProgressBar (float value, string label) { // Get a rect for the progress bar using the same margins as a textfield: Rect rect = GUILayoutUtility.GetRect (18, 18, "TextField"); EditorGUI.ProgressBar (rect, value, label); EditorGUILayout.Space (); } }
代わりに、もしマルチオブジェクト編集のハンドリングや取り消し、 プレハブの上書きを必要としない場合、スクリプト変数は SerializedObject や SerializedProperty を使用せずに 次のサンプルのようにエディター上で直接編集できます。
using UnityEditor; using UnityEngine; using System.Collections;
// Example script with properties. public class MyPlayerAlternative : MonoBehaviour { public int damage; public int armor; public GameObject gun;
// ...other code... }
// Custom Editor the "old" way by modifying the script variables directly. // No handling of multi-object editing, undo, and prefab overrides! [CustomEditor (typeof(MyPlayerAlternative))] public class MyPlayerEditorAlternative : Editor {
public override void OnInspectorGUI() { MyPlayerAlternative mp = (MyPlayerAlternative)target;
mp.damage = EditorGUILayout.IntSlider ("Damage", mp.damage, 0, 100); ProgressBar (mp.damage / 100.0f, "Damage");
mp.armor = EditorGUILayout.IntSlider ("Armor", mp.armor, 0, 100); ProgressBar (mp.armor / 100.0f, "Armor");
bool allowSceneObjects = !EditorUtility.IsPersistent (target); mp.gun = (GameObject)EditorGUILayout.ObjectField ("Gun Object", mp.gun, typeof(GameObject), allowSceneObjects); }
// Custom GUILayout progress bar. void ProgressBar (float value, string label) { // Get a rect for the progress bar using the same margins as a textfield: Rect rect = GUILayoutUtility.GetRect (18, 18, "TextField"); EditorGUI.ProgressBar (rect, value, label); EditorGUILayout.Space (); } }
serializedObject | object や objects の SerializedObject |
target | ターゲットとなるオブジェクト |
targets | 複数選択された場合のターゲットとなるオブジェクト群 |
DrawDefaultInspector | デフォルトのインスペクターを描画します |
DrawHeader | Editor のヘッダーを描画するためにはこの関数を呼び出します。 |
DrawPreview | プレビュー描画するための最初のエントリーポイントです。 |
GetInfoString | プレビューにアセットの情報を表示するにはこのメソッドを使用します。 |
GetPreviewTitle | プレビューのタイトルを変更したい場合はこのメソッドをオーバーライドします。 |
HasPreviewGUI | OnPreviewGUI を実装する場合は、サブクラスでこのメソッドをオーバーライドします。 |
OnInspectorGUI | カスタムインスペクターを作成するためにこの関数を実装します |
OnInteractivePreviewGUI | 自身のカスタムのインタラクティブなプレビューを作成するために実装します。カスタムのインタラクティブなプレビューはインスペクター上のプレビューエリアとオブジェクト選択ツールで使用されます |
OnPreviewGUI | 自身のカスタムのプレビューをインスペクター上のプレビューエリア、プライマリ Editor ヘッダーとオブジェクト選択ツールで作成するために実装します。 |
OnPreviewSettings | プレビューのヘッダーを自由にカスタマイズしたい場合にオーバーライドして使用します。 |
RenderStaticPreview | Override this method if you want to render a static preview. |
Repaint | この Editor を表示しているインスペクターを再描画させます。 |
RequiresConstantRepaint | この編集結果は現在の状態で常に再描画される必要があるかどうか。 |
UseDefaultMargins | デフォルトのマージンを取らせたくない場合、Editor を継承したクラスでメソッドをオーバーライドし、false を返すようにします |
ShouldHideOpenButton | Returns the visibility setting of the "open" button in the Inspector. |
CreateCachedEditor | previousEditor は targetObject か targetObjects のためのエディターです。エディターがすでにオブジェクトを追跡しているか previousEditor を破棄して新しいのを作成する場合に関数はどちらかを返します。 |
CreateCachedEditorWithContext | Creates a cached editor using a context object. |
CreateEditor | targetObject や複数の targetObjects のためのカスタムエディターを作成します。 |
CreateEditorWithContext | Make a custom editor for targetObject or targetObjects with a context object. |
OnSceneGUI | エディターでシーンビューのイベントの処理が可能となります。 |
finishedDefaultHeaderGUI | An event raised while drawing the header of the Inspector window, after the default header items have been drawn. |
hideFlags | Should the object be hidden, saved with the Scene or modifiable by the user? |
name | オブジェクト名 |
GetInstanceID | オブジェクトのインスタンス ID を返します |
ToString | Returns the name of the GameObject. |
Destroy | ゲームオブジェクトやコンポーネント、アセットを削除します |
DestroyImmediate | Destroys the object obj immediately. You are strongly recommended to use Destroy instead. |
DontDestroyOnLoad | Do not destroy the target Object when loading a new Scene. |
FindObjectOfType | タイプ type から最初に見つけたアクティブのオブジェクトを返します |
FindObjectsOfType | タイプから見つけたすべてのアクティブのオブジェクト配列を返します |
Instantiate | original のオブジェクトをクローンします |
CreateInstance | ScriptableObject のインスタンスを作成します。 |
bool | オブジェクトが存在するかどうか |
operator != | 二つのオブジェクトが異なるオブジェクトを参照しているか比較します |
operator == | 2つのオブジェクト参照が同じオブジェクトを参照しているか比較します。 |