サークル獏の佐藤敏 Unityとか備忘録

サークル獏の佐藤敏 Unityとか備忘録

サークル獏の佐藤敏がUnityとかで知ったTipsを書いておく備忘録です。

乱暴に始めるUnityEditor拡張

乱暴に、レイアウトも雑に始めてしまえ

UnityEditor拡張は沼だとか言われるし、入門ページでも結構導入とかレイアウト操作を丁寧に書いているので難しそうに見える。
なので、乱暴ながら一応使い道がありそうな奴を。

f:id:VinSatoo:20180809133334p:plain:w300
Cubeを置いただけのUnityプロジェクト。

  • Editor拡張は「Editor」という名前のフォルダの中に作らないといけないので、フォルダ作成。
  • スペルミスしないように注意

 
 

スクリプトを書く

f:id:VinSatoo:20180809133639p:plain:w300
Editorフォルダの中に適当な名前でC#スクリプトを作る。
んで、そのファイルの中に以下をコピペして保存。

using UnityEngine;
using UnityEditor; //Editor拡張には必要

public class TestEditor : EditorWindow
{
    [MenuItem("Window/PosMove")]


    public static void ShowWindow() {
        EditorWindow.GetWindow(typeof(TestEditor));
    }

    void OnGUI() {
        if(GUI.Button(new Rect(20.0f, 20.0f, 120.0f, 20.0f), "X+")) { //ボタンの位置と名前を決める
            var obj = Selection.activeGameObject; //選択中オブジェクト
            if (obj != null) {
                var pos = obj.transform.position;
                pos.x += 0.1f;
                obj.transform.position = pos; //Xを0.1プラスした
            }
        } else if (GUI.Button(new Rect(20.0f, 50.0f, 120.0f, 20.0f), "X-")) { //ボタンの位置と名前を決める Y位置だけ1つめのボタンより下にずらした
            var obj = Selection.activeGameObject; //選択中オブジェクト
            if (obj != null) {
                var pos = obj.transform.position;
                pos.x -= 0.1f;
                obj.transform.position = pos;  //Xを0.1マイナスした
            }
        }
    }
}

 
 
f:id:VinSatoo:20180809141204p:plain:w300
Unityに戻りコンパイルが行われる。すると、Windowメニューにプログラムの6行目に書かれた名前の「PosMove」という項目ができている。

f:id:VinSatoo:20180809141104p:plain:w300
で、それを選ぶとこのように「TestEditor」という新しいウィンドウが現れる(変な場所に出ることもあるのでよく探して)。
X+を押すと選択中の物体のXが0.1ずつプラスされていく。X-はその逆。 
 
 

何が嬉しいのか?

この程度ならCubeを操作パネルからマウスで動かしても同じだ。

  • しかし、0.1ずつ微調整したいなんて時には使い道がある。
  • そして最大の違いは、SceneウィンドウでもGameウィンドウでも(つまりゲーム進行中でもSceneに戻らずに)使えるという点だ。
  • しかもスクリプトで書けるので複雑なこともできる。
  • 例えば「他のオブジェクトと合わせる」「Yだけ0にリセット(≒床に下ろす)」とか。

 
 
よくある「Gameという空オブジェクトにGameManagerコンポーネントがくっついていて、そこがゲーム進行の司令塔」なんて場合ならEditor拡張のボタンを押したときの処理に

var game = GameObject.Find("Game").GetComponent<GameManager>()
game.PlayBGM("エンディング");
game.ChangeScene("エンディングシーン");

とかすることでデバッグを便利にすることもできる。
 
 

乱暴に始めた後はレベルアップを

もちろん今回のはEditor拡張の初歩の初歩で、本当は細かいレイアウト機能や、ユーザーに数字を入力させてボタンを押したときに活用する機能など色々なものがある。
その辺はすぐれた入門ページがたくさんあるので、そちらで勉強を。
anchan828.github.io
caitsithware.com
qiita.com


ただ、乱暴に「ボタンを置いて、それを押したらなんか処理してくれる」だけでもEditor拡張は普通に便利だからどんどん活用していこう。
どうせ使うのは自分だ。