くらっしゅろぐ

Unityに関連する内容で気が向いたら書きます。

EditorWindowのデザインを作成するエディター拡張

こちらは【Unity Advent Calendar 2015】17日目の記事になります。

昨日は veniegames_takumi さんによる【AssetBundleのパフォーマンスを計測したかった~Unity5.3.1編~】でした。

はじめに

エディター拡張erの皆さん
「EditorWindow作るの楽しい!!けどもうGUI***、GUILayout***は見飽きた!」
などと思ったことはありませんか?

なんか、こう、Windows FormsとかWPFみたいにぱぱっとレイアウト作って、
本命の機能実装に時間をかけたい・・・!!

そんな思いから作り始め、なんとか最低限見せれる形になったのでこの場を借りて紹介させていただきます。

その名はuForms

内容を簡単に説明すると
Windows Formsに近いもの劣化版をUnity上で実装してみた」
といったところです。

Unity + Windows Forms = uForms

UnityFormsはちょっと長いし、UniFormsだとuniformって単語があるしで、
uFormsに落ち着きました。

デモ+解説

※音声解説付きです。音量にご注意下さい。


uForms - Demo

Chrome上からだと画質選択ができなくて文字が潰れている・・・ぐぬぬ・・・

ニコニコにも上げておきます。
http://www.nicovideo.jp/watch/sm27808246

元の動画ファイルも置いておきます。
Google Drive - uForms

解説追記

いくつか実装面での解説をば。

各コントロールの描画について

DesignerView上で表示されている各コントロールは、
実際のButtonなどを使うと移動できなくなるため、
GUI.Labelにスタイルを指定するようにしています。

選択中の表示について

f:id:cra_cellar:20151217001235j:plain

選択中のコントロールは追加でGUI.Window()を使用してガイドを表示しています。

UFControl.cs 288行目 - 388行目

8つの小さいウィンドウと移動用の透明ウィンドウを描画し、
ドラッグされたウィンドウのINDEXを見てコントロールの拡縮と移動を行っています。

作成したWindowの取得

「Import Code」でやっている処理です。
ReflectionでUFWindowから派生したクラスを取得して一覧に表示しています。

UFSelector.cs - Awake()

クラス情報の読み込み

Import Codeで取得した型のインスタンスをEditorWindow.CreateInstance()で取得。

UFProject.cs - ImportCode()

環境

Unity 5.3.0f4 (Win / Mac)

恐らく5系であれば問題無く動作すると思います。
4.6あたりだとRectのコンストラクタが無くて通らなかったはず・・・

導入

githubの下記ページより

hidakas/uForms at v0.1.0 · GitHub

readmeなどが用意できていなくてすみません・・・

今後の実装予定

  • 使用可能なコントロールの追加
  • コントロールの実装をより楽にする
  • DesignerViewでの複数選択やスナッピング
  • 各ウィンドウの統合
  • 警告/エラー類表示
  • WPFのStackPanelのようにGUILayout方式での表示
  • Undo/Redo機能
  • OnGUIベタ書きソースでの出力
  • 各コントロールのGUIStyle指定
  • 出力変数名の自動採番
  • ショートカットキー対応
  • OutlineViewの操作改善

などなど!

反省点

  • Advent Calendar初参加にも関わらず風呂敷を広げすぎた
  • 設計が甘い所が多々ある
  • 実装を優先しすぎてコメントがほぼ皆無
  • Windows Forms、WPFの両方とも互換性が無い
  • デレステに時間を吸われた

まとめ

張り切りすぎて時間が足りなかったが、
思い描いていたものに近い所まで落とし込めたし、
実装する中でいろいろと調べて勉強になりました。

Advent Calendar用に作り始めたものでしたが、今後も実装は続けたいと思います。
そして最終的にはこのエディター拡張自体もuFormsで作れるといいですね!

実装要望や質問などございましたら、こちらのエントリーにコメントして頂くか、
Twitter(@cra_cellar)などで気軽にご連絡下さい。

最後までご覧いただきまして、ありがとうございました。

 

18日目は yaju さんによる【UnityでVisual Basicを使ってみる】です。

参考