2012年12月16日日曜日

[Unity]Unity Editorのカスタマイズ


Unity Editorのカスタマイズのメモ。


Unityの特性上、GUI上でパラメータを扱うことが非常に多いため、どうしてもカスタマイズの必要性がある。
なので、カスタマイズまでの流れをメモしておく。

◆共通

Assetsフォルダ以下にEditorというフォルダを作成し、そのフォルダ内に作成したスクリプトを配置すれば自動で読み込まれて実行される。


◆Menuのカスタマイズ

ショートカットなどに登録して行う作業はここで行なったほうがいい。
或は、全オブジェクト対象の作業などもここで行なうと良いと思う。

例えば、複数のカメラオブジェクトを一括で無効にするようなものなど。


例:
public class  MenuA {
    private const string MENUITEMNAME = "MenuB";
    [MenuItem(MENUITEMNAME + "/hideALLCameraObjects")]
    static void hideALLCameraObjects() {
        GameObject[] objects = (GameObject[])
        GameObject.FindSceneObjectsOfType(typeof(GameObject));
        foreach(GameObject obj in objects) {
            if (obj.camera != null && !obj.camera.name.Equals("Main Camera") ) {
                obj.camera.enabled = false;
            }
        }
    }
}

◆Preferencesのカスタマイズ

設定のカスタマイズに是非。
レポートの作成時のパラメータ設定などはこちらで行った方がいい。

下記の例は文字列を記入しておいて、保存する仕組みのもの。

例:
public class PreferencesMenuB {
    private const string MENUITEMNAME = "MenuB";
    private const string TEXT_KEY = "HashKey";
    [PreferenceItem (MENUITEMNAME)]
 
    public static void PreferencesGUI () {
        if (!prefsLoaded) {
            text = EditorPrefs.GetString (TEXT_KEY, "");
            prefsLoaded = true;
        }
      
        text = EditorGUILayout.TextArea (text, GUILayout.Height(100));
      
        if (GUI.changed)
            EditorPrefs.SetString (TEXT_KEY, text);
    }
}

◆Inspectorのカスタマイズ

Inspectorは特にパラメータを弄る画面なので、覚えておくと損は無いと思う。
注意点としては、Inspectorのカスタマイズを行うと、パブリック変数は全てEditorGUILayoutで設定し直す必要がある点。
例えば10個のメンバー変数があり、その全てをInspector上で編集できる状態だとして、そのうちの1つだけカスタマイズしたいとなると、
CustomEditorスクリプト内に10個分の設定を行う必要があるわけだ。
もし、10個のメンバー変数の内、一つだけカスタマイズしたいという状態なら敢えてエディターをカスタマイズする必要はないかもしれない。



CustomEditorアトリビュートを使用して、エディタのカスタマイズの準備をする。
Editorクラスを継承する。
OnInspectorGUIメソッドをオーバーライドして、Inspectorを改造する。
これは、カーソルがInspectorビュー上に移った時に呼ばれるメソッド。
ターゲットを指定する。
〜カスタマイズ〜


例:
using UnityEngine;
using UnityEditor;
[CustomEditor(typeof(ClassB))]
public class CustomInspectorForClassB : Editor {
    public override void OnInspectorGUI() {
        ClassB script = target as ClassB;
        EditorGUILayout.BeginHorizontal();
        EditorGUILayout.PrefixLabel("Rotate Y Speed");
        script.SpeedY = EditorGUILayout.Slider(script.SpeedY, 0, 30);
        EditorGUILayout.EndHorizontal();
    }
}

◆参考

http://www.wisdomsoft.jp/321.html

0 件のコメント:

コメントを投稿