強火で進め

このブログではプログラム関連の記事を中心に書いてます。

Inspector を SerializedProperty を活用して拡張

JavaScriptで実装する場合

以下のデータをInspectorで編集する時にスライダーで編集する様に拡張します。
【MyPlayer.js】

#pragma strict

var armor : int = 75;
var damage : int = 25;
var gun : GameObject;

拡張する為のプログラムは以下となります。この時、ファイルは Editor というフォルダを作成し、そこに保存する。そして、ファイル名は拡張元の「ファイル名+Editor」という名称として下さい。

【MyPlayerEditor.js】

#pragma strict
@CustomEditor(MyPlayer)
@CanEditMultipleObjects // 複数のオブジェクトを選択した状態での編集に対応している場合にはこの記述を行う
class MyPlayerEditor extends Editor {
    var damageProp : SerializedProperty;
    var armorProp : SerializedProperty;
    var gunProp : SerializedProperty;

    function OnEnable () {
        // SerializedPropertyの値を取得
        damageProp = serializedObject.FindProperty ("damage");
        armorProp = serializedObject.FindProperty ("armor");
        gunProp = serializedObject.FindProperty ("gun");
    }

    function OnInspectorGUI() {
        // serializedPropertyの更新開始
        serializedObject.Update ();

        // int型のデータ向けのスライダー(その他にfloat型向けの Slider も有ります)
        EditorGUILayout.IntSlider (damageProp, 0, 100, new GUIContent ("Damage"));
        // 複数選択時に選択したものの値が全て同じ場合にはプログレスバーを表示
        if (!damageProp.hasMultipleDifferentValues)
            ProgressBar (damageProp.intValue / 100.0, "Damage");

        EditorGUILayout.IntSlider (armorProp, 0, 100, new GUIContent ("Armor"));
        if (!armorProp.hasMultipleDifferentValues)
            ProgressBar (armorProp.intValue / 100.0, "Armor");

        EditorGUILayout.PropertyField (gunProp, new GUIContent ("Gun Object"));

        // serializedPropertyの更新を適用
        serializedObject.ApplyModifiedProperties ();
    }

    // プログレスバーの描画
    function ProgressBar (value : float, label : String) {
        // Get a rect for the progress bar using the same margins as a textfield:
        var rect : Rect = GUILayoutUtility.GetRect (18, 18, "TextField");
        EditorGUI.ProgressBar (rect, value, label);
        EditorGUILayout.Space ();
    }
}

C#で実装する場合

データ用のプログラム。
【MyPlayer2.cs】

using UnityEngine;
using System.Collections;

public class MyPlayer2 : MonoBehaviour {
	public int armor = 75;
	public int damage = 25;
	public GameObject gun;
}

拡張用のプログラム。C#の場合にはファイル名は自由に指定可能です(「ファイル名+Editor」で無くても大丈夫です)。
【MyPlayer2Editor.cs】

using UnityEngine;
using UnityEditor;
using System.Collections;

[CanEditMultipleObjects] // 複数のオブジェクトを選択した状態での編集に対応している場合にはこの記述を行う
[CustomEditor(typeof(MyPlayer2))]
public class MyPlayer2Editor : Editor {
    private SerializedProperty damageProp = null;
    private SerializedProperty armorProp = null;
    private SerializedProperty gunProp = null;

    private void OnEnable () {
        // SerializedPropertyの値を取得
	
        // 最初の取得時には何故か null が返って来るので1度適当な値で読む
        serializedObject.FindProperty ("__dummy__");
        armorProp = serializedObject.FindProperty ("armor");
        damageProp = serializedObject.FindProperty ("damage");
        gunProp = serializedObject.FindProperty ("gun");
    }
	
    public override void OnInspectorGUI() {
        // serializedPropertyの更新開始
        serializedObject.Update ();
		
        // int型のデータ向けのスライダー(その他にfloat型向けの Slider も有ります)
        EditorGUILayout.IntSlider (damageProp, 0, 100, new GUIContent ("Damage"));
        // 複数選択時に選択したものの値が全て同じ場合にはプログレスバーを表示
        if (!damageProp.hasMultipleDifferentValues)
            ProgressBar (damageProp.intValue / 100.0f, "Damage");

        EditorGUILayout.IntSlider (armorProp, 0, 100, new GUIContent ("Armor"));
        if (!armorProp.hasMultipleDifferentValues)
            ProgressBar (armorProp.intValue / 100.0f, "Armor");

        EditorGUILayout.PropertyField (gunProp, new GUIContent ("Gun Object"));

        // serializedPropertyの更新を適用
        serializedObject.ApplyModifiedProperties ();
    }

    // プログレスバーの描画
    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 ();
    }
}

サンプルプロジェクトはこちら

関連情報

Unity Script Reference – Editor
http://unity3d.com/support/documentation/ScriptReference/Editor.html

Unity Script Reference – EditorGUILayout
http://unity3d.com/support/documentation/ScriptReference/EditorGUILayout.html

Unity3D - カスタムメニュー - なにげにぷろぐらまーWiki - livedoor Wiki(ウィキ)
http://wiki.livedoor.jp/bokkuri_orz/d/Unity3D%20-%20%A5%AB%A5%B9%A5%BF%A5%E0%A5%E1%A5%CB%A5%E5%A1%BC