コガネブログ

平日更新を目標にUnityやC#などのゲーム開発アレコレを書いていきます

【Unity】列挙型とそれに関連する便利なクラスや拡張メソッドを自動生成するエディタ拡張

はじめに

public enum JOB_TYPE
{
    NONE     , // 不明
    SOLDIER  , // 王国兵士
    SORCERER , // 魔法使い
    HUNTER   , // 狩人
    SIZEOF   , // 番兵
}

僕は普段のゲーム開発で列挙型を使用する時に
下記のようなクラスや拡張メソッドを使用して処理を記述することが多々あります

var jobType = JOB_TYPE.SOLDIER;

// アッパーケースの文字列に変換
Debug.Log( jobType.ToUpper() ); // SOLDIER

// ローワーケースの文字列に変換
Debug.Log( jobType.ToLower() ); // soldier

// アッパーキャメルケースの文字列に変換
Debug.Log( jobType.ToUpperCamel() ); // Soldier

// ローワーキャメルケースの文字列に変換
Debug.Log( jobType.ToLowerCamel() ); // soldier

// コメントの文字列に変換
Debug.Log( jobType.ToComment() ); // 王国兵士

// 文字列から JOB_TYPE の要素に変換
var result = JobTypeUtils.FromString( "SOLDIER" );

// JOB_TYPE のすべての要素を列挙
foreach ( var n in JobTypeUtils.List ) { }

// JOB_TYPE.NONE を除くすべての要素を列挙
foreach ( var n in JobTypeUtils.ListWithoutNone ) { }

// JOB_TYPE の要素数を取得
Debug.Log( JobTypeUtils.Count );

// JOB_TYPE.NONE を除く要素数を取得
Debug.Log( JobTypeUtils.CountWithoutNone );

// Dictionary の comparer を指定してメモリ割り当てを削減
var dict = new Dictionary<JOB_TYPE, string>( new JobTypeComparer() );

こういった便利なクラスや関数をすべての列挙型に対して手動で記述するのは大変なので
Unity のエディタ拡張を使用してこれらのクラスや関数が自動で生成されるようにしています

今回はそのエディタ拡張の機能を紹介していきます

使い方

EnumCreator.cs · GitHub

こちらの GitHub に公開されている EnumCreator.cs を
Unity プロジェクトの Editor フォルダに追加します

f:id:baba_s:20170828180725p:plain

そして、Editor フォルダに「enum.xml」という名前のテキストファイルを作成します

f:id:baba_s:20170828180828p:plain

その後、ゲームで使用する列挙型を「enum.xml」に下記のように記述します

<root>

 <enum name="param_type" comment="パラメータタイプ">
  <param name="none" comment="不明" />
  <param name="flame" comment="炎" />
  <param name="thunder" comment="雷" />
  <param name="ice" comment="氷" />
 </enum>

 <enum name="job_type" comment="ジョブタイプ">
  <param name="none" comment="不明" />
  <param name="soldier" comment="王国兵士" />
  <param name="sorcerer" comment="魔法使い" />
  <param name="hunter" comment="狩人" />
 </enum>
 
</root>

これで列挙型を自動生成する準備が完了したので
Unity メニューの「Tools>Create Enum」を選択します

f:id:baba_s:20170828181042p:plain

完了ダイアログが表示されたら OK ボタンを押します

f:id:baba_s:20170828181128p:plain

これで Project ビューの Script フォルダに「Enum.cs」というスクリプトが作成されて、
列挙型と、それに関するクラスや拡張メソッドが定義されます

f:id:baba_s:20170828181348p:plain

成果物の「Enum.cs」がどのように作成されるかは下記の GitHub で閲覧できます

Enum.cs · GitHub

以上が EnumCreator.cs の使い方になります

まとめ

列挙型に紐付く便利なクラスや拡張メソッドをこのように自動生成できる環境を作っておくと
UI やデバッグメニュー、チートコマンドを実装する時にキレイなコードが記述できます
興味がある方はぜひ導入してみて頂ければと思います