2013年5月9日木曜日

Unityのエディタ拡張 -基礎

なんかUnityではエディタが拡張できることも売りの一つらしい.
そんなこと言われたら手を出すしかないじゃない+(・ω・0)*

Unityのエディタ拡張 -基礎

まずは拡張ウィンドウ作成から

1. 準備

ほとんどいらない. Assetsの下に「Editor」ディレクトリを作るくらい. ちなみに他のところでも, 「Editor」ディレクトリにあれば動くらしい. まぁわかりやすくまとめておくのが吉. 

2. コーディング

他の普通のコードと同じようにC#で書ける. 
using UnityEngine;
using UnityEditor;
using System.Collections;

public class ExpansionPrac : EditorWindow {

 [MenuItem("Window/My Window %i")]
 static void Init(){
  ExpansionPrac window = 
   (ExpansionPrac)EditorWindow.GetWindow(typeof(ExpansionPrac));
 }
}
こんな感じ. なにも表示されないウィンドウを出すだけ.
とりあえず EditorWindowクラスを継承. その際には UnityEditorクラスのインポートを忘れずに.

問題は 7行目. 他ではあまり見ない [ ] を使った宣言. MenuItem()により, メニューに追加する.
引数はその際の配置. この場合はメニューの Window → My Windowをクリックで表示されるようになる. 最後の %i はなんとショートカットキー. この場合は 「ctrl + i」. 他と被ってないか注意.


こうなります.

クリック後, Init()の中でウィンドウを用意する.  EditorWindow.GetWindow()でウィンドウを呼び出してる(らしい). 型はこのクラスの型. このクラス名がウィンドウのタブに出てくるので注意.

3. 実際に呼び出せるようにする

しかしゲームに関係ないのにいつコンパイルするんだろう…とか思ってたら
シーンを再生/停止したとき
スクリプトを編集したとき
にやってくれているらしい. 道理でスクリプト編集から戻ってくるなり「エラーあるぞゴルァ!щ(゚Д゚#щ)」とか怒ってくれるわけだ…
なのであと必要な手順は「Editor」ディレクトリの下に配置しているかということ. ちなみに自分は
Assets/Scripts/Editor/ExpansionPrac.cs
と配置して起動を確認. ただ他でEditorを作成→Scriptsディレクトリ以下に移動 した直後はコンパイルが通っていないのか起動しません(・ω・`) 一度 再生→停止 するなどしてコンパイルしてもらうといいかも.

4. 中身を作ってみる

呼び出してはみたものの…
さみしい(・ω・`)
なので中身を適当に入れてみる.
bool isEditable;
bool childToggleBool = true;
float childSliderFloat = 2.22f;
 
void OnGUI(){
 GUILayout.Label("DispTest", EditorStyles.boldLabel);
 int sw = Screen.width;
 int sh = Screen.height;
 isEditable = EditorGUILayout.BeginToggleGroup("ToggleGroupTest", isEditable);
 childToggleBool = EditorGUILayout.Toggle("childToggle", childToggleBool);
 childSliderFloat = EditorGUILayout.Slider("childSlider", childSliderFloat, -10, 10);
 EditorGUILayout.EndToggleGroup();
}
まさかの OnGUI();
シーン中で使ったようにGUILayout()が使用可能. EditorStylesなんていうフォントなどの仕様のクラスも.
また 7, 8行目のように, カスタムウィンドウの幅/高さを取得することも可能.

9行目からがちょっと独特. EditorGUILayoutなるクラスを使える. 通常よく見る Inspectorなんかで使われている表示はここから取り出せるっぽい. Unityリファレンスマニュアルにある通り, とりあえず Toggleグループを追加してみる. グループの中身になるものを 10, 11行目に宣言し, 12行目の EndToggleGroup()でグループの宣言を閉じる. 閉じなくても今回は問題なく動くのだが, 当然閉じないといつまでもグループの中身を足し続けることに…

10行目は子にもトグルボタンをつけてみる. 特に何もなし.
11行目はスライダ. 3,4つ目の引数がスライダの下限/上限. ちなみに, ここの引数を 7行目で取得した swを使って, -sw/swと入れて, ウィンドウサイズを変えてみるとちょっと面白いことにヘ(゚∀゚ヘ)

ちなみにフィールドにあるのがトグルやスライダの初期値になります.
これを 2. で作ったコードに追加してコンパイルしてもらうと…
出てきた!+(゚∀゚0)*



ちなみにコード全景.
using UnityEngine;
using UnityEditor;
using System.Collections;

public class ExpansionPrac : EditorWindow {

 [MenuItem("Window/My Window %i")]
 static void Init(){
  ExpansionPrac window = 
   (ExpansionPrac)EditorWindow.GetWindow(typeof(ExpansionPrac));
 }
 
 bool isEditable;
 bool childToggleBool = true;
 float childSliderFloat = 2.22f;
 
 void OnGUI(){
  GUILayout.Label("DispTest", EditorStyles.boldLabel);
  int sw = Screen.width;
  int sh = Screen.height;
  isEditable = EditorGUILayout.BeginToggleGroup("ToggleGroupTest", isEditable);
  childToggleBool = EditorGUILayout.Toggle("childToggle", childToggleBool);
  childSliderFloat = EditorGUILayout.Slider("childSlider", childSliderFloat, -10, 10);
  EditorGUILayout.EndToggleGroup();
 }
 
}




今回はここまで.
次はGUI操作でちゃんと編集できるようにしたいなー+(・ω・0)*



参考 : Unityリファレンスマニュアル
         MK Games
         EditorGUILayout

AWS CDKで立てたEC2インスタンスのTimeZoneとかいじりたかった話

EC2を立てることはできたけど、立てたインスタンスは UTCのままだし設定ファイルとかいちいちscpしてくるのはダルい。 当初UserDataでなんとかしようとしたものの、「書く量がヤバいしメンテしにくい」と悩んでいたところ見かけたのが  AWS::CloudFormation:...