【Unity】ボタン作成時のカスタム拡張

UnityEditor のメニューに [GameObject/UI/Button] でボタンを作成したが、
プロジェクトによってはカスタムのコンポーネントを追加したり、
デフォ画像を設定したりしたいわけですが、

毎回手動でやると面倒ですよね!!!!

UnityEditor.UI.MenuOptions というクラスをHACKしてコールバックを追加してみました。

gist.github.com

使い方

例: 自前の ButtonSE というコンポーネントを追加したい!
gist.github.com

とても手軽になりました!

MenuItem 重複による警告

Cannot add menu item 'GameObject/UI/Button' for method 'MenuOptions.AddButton' because a menu item with the same name already exists.

上記の警告が表示されるので、気になる場合

// MenuOptions.cs
[MenuItem("GameObject/UI/Button", false, 2001)]
↓
[MenuItem("GameObject/UI/Button/Create", false, 2001)]

に変更すれば警告は消えます。(その代わりにメニューの階層が深くなりますorz)

OverrideXml

皆さん~
C#XML を解析時、どんなシリアライザーを使いますか?
おそらく真っ先にXmlSerializer クラス (System.Xml.Serialization) にたどり着くでしょう。

だけど、XmlSerializerを使うと、
XmlElement クラス (System.Xml) とか
XmlAttribute クラス (System.Xml) とか
クラスやメンバーに属性を付ける必要があります。

場合によっては、クラスに編集を加えることができないし
いわゆる「非侵入型シリアライザー」がほしいです。

今年に面白い子「OverrideXML」 と出会いましたよ。
日本語の記事はほぼないので、ぜひ皆さんに紹介したいですね。

OverrideXML とは

XmlAttributeOverrides クラス (System.Xml.Serialization) を使うと、
XmlSerializer も非侵入型シリアライズができるんです。
が、サンプルを読んでも使い方はよくわからないですね
OverrideXML は XmlAttributeOverrides をとても使いやすくしてくれるクラスです。

OverrideXML の導入方法

方法1:nuget からインストール

NuGet Gallery | OverrideXml 1.0.0

方法2:GitHub からダウンロードして自分のプロジェクトに取り込む

github.com
ファイルは1つしかないのでとても手軽です。( Unity でも使えます )

OverrideXML の使い方

例えば以下のXMLファイルがあります
gist.github.com

上記XML データ構造によってクラスを定義します
gist.github.com

OverrideXml を使ってXmlAttributeOverrides を構築する
gist.github.com

もっと詳細に説明すると
OverrideXML はメソッドチェーンを使って記述していきます。

イメージしやすいように、
行毎にコメントを記載してみる

// まずは OverrideXml のインスタンスを作成して
new OverrideXml()
// class Table をオーバーライドし
.Override<Table>()
  // ルートタグを "table" 指定し
  .XmlRoot("table")
  // class Table のメンバー [border] を XmlAttribute [border] と紐付けます
  .Member("border").XmlAttribute("border")
  // class Table のメンバー [tr] を XmlElement [tr] と紐付けます
  .Member("tr").XmlElement("tr")
// class TR をオーバーライドし
.Override<TR>()
  // class TR のメンバー [td] を XmlElement [td] と紐付けます
  .Member("td").XmlElement("td")
// class TD をオーバーライドし
.Override<TD>()
  // class TD のメンバー [value] を XmlText と紐付けます
  .Member("value").XmlText()
// コミットしXmlAttributeOverrides を構築されます
.Commit();

最後はデシリアライズします。
gist.github.com

以上 OverrideXML の使い方でした。

命名規則表示するエディタ拡張

ゲーム開発時にリソースを管理しやすいよう、

ファイルに命名規則を決めることが多い。

だけど、命名規則をすべて覚えるのは至難の業です

Unityエディタ上で選択しているをヒントとして出せないかなぁと思い

このエディタ拡張を作りました。

必要な知識

正規表現

XML

導入手順

github.com

上記リンクから NamingConvention.unitypackage をダウンロードする

・プロジェクトにインポートする

サンプルとして、NamingConvention/Detail フォルダを選択したら、

f:id:kou_yeung:20171206215629p:plain

以上のように表示されているはず。

使い方

基本的に編集するファイルは NamingConvention/Pattern.xml だけです。

例として、新たに「アイテムの命名規則」を追加します。

要件

ITEM_AAAABB

AAAA : アイテム種類( 数字4桁 )

BB : アイテムレアリティ( 数字2桁 )

ITEM_100001 HP回復(小)
ITEM_100002  HP回復(中)
ITEM_100003 HP回復(大)
ITEM_100101 MP回復(小)
ITEM_100102 MP回復(中)
ITEM_100103 MP回復(大)
■ パターンにマッチする正規表現を作成する

ITEM_([0-9]{4})([0-9]{2}$)

■ Pattern.xml に <Pattern>タグで追加します

<Pattern match="ITEM_([0-9]{4})([0-9]{2}$)"></Pattern> 

■ マッチしたグループにより文字列を表示する

<Group index="1" equal="1000">HP回復</Group>

<Group index="1" equal="1001">MP回復</Group>

<Group index="2" equal="01">(小)</Group>

<Group index="2" equal="02">(中)</Group>

<Group index="2" equal="03">(大)</Group>

・index は マッチしたグループ番号

・equal は マッチした文字列

記載例を以下のようになるはず

gist.github.com

ITEM_100001 というファイルを追加して、

選択したら下記のように表示されます

f:id:kou_yeung:20171207014034p:plain

あとがき

いかがでしょうか?

遊び程度なエディタ拡張ですが、

もし役に立てれば幸いです。