Version: 2019.1

Editor

class in UnityEditor

/

継承:ScriptableObject

マニュアルに切り替える

説明

Derive from this base class to create a custom inspector or editor for your custom object.

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... } }

For example, use a custom editor to change the appearance of the script 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.

You can either use UIElements to build your custom UI or you can use IMGUI. To create a custom inspector using UIElements, you have to override the Editor.Editor on the Editor class. To create a custom inspector using IMGUI, you have to override the Editor.OnInspectorGUI on the Editor class. If you use UIElements and have Editor.Editor overwritten, any existing IMGUI implementation using Editor.OnInspectorGUI on the same Editor will be ignored.

Here's an example of a custom inspector:


Custom editor in the Inspector.

using UnityEditor;
using UnityEditor.UIElements;
using UnityEngine;
using UnityEngine.UIElements;
[CustomEditor(typeof(MyPlayer))]
public class MyPlayerEditor : Editor
{
    const string resourceFilename = "custom-editor-uie";
    public override VisualElement CreateInspectorGUI()
    {
        VisualElement customInspector = new VisualElement();
        var visualTree = Resources.Load(resourceFilename) as VisualTreeAsset;
        visualTree.CloneTree(customInspector);
        customInspector.styleSheets.Add(Resources.Load($"{resourceFilename}-style") as StyleSheet);
        return customInspector;
    }
}

The following example defines the layout of a custom inspector in uxml. The definition loads as a resource and the VisualTreeAsset.CloneTree method puts the hierarchy in a VisualElement object.

The InspectorWindow will instantiate an InspectorElement containing the custom inspector. The InspectorElement will call Bind on the custom inspector binding it to the MyPlayer object.

<UXML xmlns:ui="UnityEngine.Experimental.UIElements" xmlns:uie="UnityEditor.UIElements">
    <ui:VisualElement class="player-property">
        <ui:VisualElement class="slider-row">
            <ui:Label class="player-property-label" text="Damage"/>
            <ui:VisualElement class="input-container">
                <ui:SliderInt class="player-slider" name="damage-slider" high-value="100" direction="Horizontal" binding-path="damage"/>
                <uie:IntegerField class="player-int-field" binding-path="damage"/>
            </ui:VisualElement>
        </ui:VisualElement>
        <uie:ProgressBar class="player-property-progress-bar" name="damage-progress" binding-path="damage" title="Damage"/>
    </ui:VisualElement>

<ui:VisualElement class="player-property"> <ui:VisualElement class="slider-row"> <ui:Label class="player-property-label" text="Armor"/> <ui:VisualElement class="input-container"> <ui:SliderInt class="player-slider" name="armor-slider" high-value="100" direction="Horizontal" binding-path="armor"/> <uie:IntegerField class="player-int-field" binding-path="armor"/> </ui:VisualElement> </ui:VisualElement> <uie:ProgressBar class="player-property-progress-bar" name="armor-progress" binding-path="armor" title="Armor"/> </ui:VisualElement>

<uie:PropertyField class="gun-field" binding-path="gun" label="Gun Object"/> </UXML>

UIElements automatically updates the UI when data changes and vice-versa. To bind data and automatically update data and UI, set values for the "binding-path" attributes.

Styling of the inspector is done in uss.

.slider-row {
    flex-direction: row;
    justify-content: space-between;
    margin-top: 4;
}
.input-container {
    flex-direction: row;
    flex-grow: .6;
    margin-right: 4;
}
.player-property {
    margin-bottom: 4;
}
.player-property-label {
    flex:1;
    margin-left: 16;
}
.player-slider {
    flex:3;
    margin-right: 4;
}
.player-property-progress-bar {
    margin-left: 16;
    margin-right: 4;
}
.player-int-field {
    min-width: 48
}
.gun-field {
    justify-content: space-between;
    margin-left: 16;
    margin-right: 4;
    margin-top: 6;
    flex-grow: .6;
}

Here's an example of a custom inspector using IMGUI and multi-selection:

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 (); } }

If automatic handling of multi-object editing, undo, and Prefab overrides is not needed, the script variables can be modified directly by the editor without using the SerializedObject and SerializedProperty system, as in the IMGUI example below.

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 (); } }

変数

serializedObjectobject や objects の SerializedObject
targetターゲットとなるオブジェクト
targets複数選択された場合のターゲットとなるオブジェクト群

Public 関数

DrawDefaultInspectorDraws the built-in inspector.
DrawHeaderRedraw any inspectors that shows this editor.
DrawPreviewプレビュー描画するための最初のエントリーポイントです。
GetInfoStringプレビューにアセットの情報を表示するにはこのメソッドを使用します。
GetPreviewTitleプレビューのタイトルを変更したい場合はこのメソッドをオーバーライドします。
HasPreviewGUI OnPreviewGUI を実装する場合は、サブクラスでこのメソッドをオーバーライドします。
OnInspectorGUIカスタムインスペクターを作成するためにこの関数を実装します
OnInteractivePreviewGUI自身のカスタムのインタラクティブなプレビューを作成するために実装します。カスタムのインタラクティブなプレビューはインスペクター上のプレビューエリアとオブジェクト選択ツールで使用されます
OnPreviewGUI自身のカスタムのプレビューをインスペクター上のプレビューエリア、プライマリ Editor ヘッダーとオブジェクト選択ツールで作成するために実装します。
OnPreviewSettingsプレビューのヘッダーを自由にカスタマイズしたい場合にオーバーライドして使用します。
RenderStaticPreviewOverride this method if you want to render a static preview.
Repaintこの Editor を表示しているインスペクターを再描画させます。
RequiresConstantRepaintこの編集結果は現在の状態で常に再描画される必要があるかどうか。
UseDefaultMarginsデフォルトのマージンを取らせたくない場合、Editor を継承したクラスでメソッドをオーバーライドし、false を返すようにします

Protected 関数

ShouldHideOpenButtonReturns the visibility setting of the "open" button in the Inspector.

Static 関数

CreateCachedEditorOn return previousEditor is an editor for targetObject or targetObjects. The function either returns if the editor is already tracking the objects, or destroys the previous editor and creates a new one.
CreateCachedEditorWithContextCreates a cached editor using a context object.
CreateEditor targetObject や複数の targetObjects のためのカスタムエディターを作成します。
CreateEditorWithContextMake a custom editor for targetObject or targetObjects with a context object.

メッセージ

OnSceneGUIEnables the Editor to handle an event in the Scene view.

Events

finishedDefaultHeaderGUIAn event raised while drawing the header of the Inspector window, after the default header items have been drawn.

継承メンバー

変数

hideFlagsShould the object be hidden, saved with the Scene or modifiable by the user?
nameオブジェクト名

Public 関数

GetInstanceIDオブジェクトのインスタンス ID を返します
ToStringReturns the name of the GameObject.

Static 関数

Destroyゲームオブジェクトやコンポーネント、アセットを削除します
DestroyImmediateDestroys the object obj immediately. You are strongly recommended to use Destroy instead.
DontDestroyOnLoadDo not destroy the target Object when loading a new Scene.
FindObjectOfTypeタイプ type から最初に見つけたアクティブのオブジェクトを返します
FindObjectsOfTypeタイプから見つけたすべてのアクティブのオブジェクト配列を返します
Instantiateoriginal のオブジェクトをクローンします
CreateInstanceScriptableObject のインスタンスを作成します。

Operator

boolオブジェクトが存在するかどうか
operator !=二つのオブジェクトが異なるオブジェクトを参照しているか比較します
operator ==2つのオブジェクト参照が同じオブジェクトを参照しているか比較します。

メッセージ

Awake ScriptableObject スクリプトを開始するとき、この関数は呼び出されます。
OnDestroyScriptableObject が破棄されるとき、この関数は呼び出されます。
OnDisableScriptableObject クラスのオブジェクトがスコープを外れるとき、この関数は呼び出されます。
OnEnableオブジェクトがロードされたとき、この関数は呼び出されます。