読者です 読者をやめる 読者になる 読者になる

(:3[kanのメモ帳]

個人ゲーム開発者kan.kikuchiのメモ的技術ブログ。月木更新でUnity関連がメイン。

シーン名、タグ名、レイヤー名、ソーティングレイヤー名の定数を自動作成&更新【Unity】【エディタ拡張】【LINQ】

Unity エディタ拡張 LINQ

このエントリーをはてなブックマークに追加

はじめに

コガネブログさんで以下のような記事が公開されていまして、これがとても便利です。





また、上記を参考して作った以下もとても便利です。



ただ、クラスを作ろうとする度に、毎回メニューから実行するのは面倒だなーという事で、

各設定に更新がある度に自動で定数クラスも更新してくれるエディタ拡張を作りました。


SettingClassCreator

何はともあれ、コードです。



使い方はAssetPostprocessorExConstantsClassCreatorと共にEditorディレクトリに入れるだけです。

また、[Tools]-[Create]-[Setting Class]から使う事もできます。


使用すると、各定数を管理する定数クラスが生成されます。

例えばSenceName.csは以下のような感じです。

/// <summary>
/// シーン名を定数で管理するクラス
/// </summary>
public static class SenceName
{
  public const string TOP           = "Top";
  public const string GAME          = "Game";
  public const string PLAYER_SELECT = "PlayerSelect";
}


これで、シーン名を直書きしたり、自分で定数を宣言しなくても大丈夫ですね!

しかも自動で更新されるので、シーン名を書き換えたり、ビルド対象から外した時には

エラーが出て教えてくれるという優れもの…!


コード説明

コード説明の前に過去記事で紹介した物を使っているので、

こちらについて知りたい方は以下をどうぞ!

  • ConstantsClassCreator


  • AssetPostprocessorEx


  • Sortinglayerの名前一覧を取得


  • シーンの番号と名前の変換


ではコード説明です!


ProjectSettings

OnPostprocessAllAssetsと言いながら、実はAssetsと同じ階層にある

ProjectSettingsディレクトリ内の変更も取得できるようです。


ProjectSettingsにはタグやらシーンやらの設定ファイルが置いてあるので、

ここが変更された時に各クラスを自動作成しています。


InternalEditorUtility.tags、InternalEditorUtility.layers、EditorBuildSettings.scenes

それぞれ、タグ、レイヤー、シーンの一覧を取得できます。

ただし、シーンはビルド対象になっているものだけです。


ToDictionary

これはLINQのメソッドで、配列を辞書に変換しています。

第1引数がkey、第2引数valueとなっており、

第2引数valueを指定しないとkeyとvalueが同じ値になるようです。


LayerMask.NameToLayer (layer)

レイヤー名からそのレイヤーの番号を取得するメソッドです。


レイヤーマスクのビット演算

ビット演算とは以下のようなもので、フラグ管理によく使われるやつです。



レイヤーマスクもビット演算で管理されているため、LayerMask.NameToLayerで番号を取得した後、

以下のようにその番号分だけ左シフトを行い、値を取得します。

1 <<  LayerMask.NameToLayer (layer)


また、レイヤーマスクは以下のように使うらしいです。



知らなんだ…


おわりに

今までの自分がやったエディタ拡張の中で、今回の一番便利なんじゃないかと自負しております!

まぁエディタ拡張ばっかやっててゲーム出来なきゃ、意味ないんですけどね!(´;ω;`)