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

(:3[kanのメモ帳]

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

オーディオのファイル名を定数で管理するクラスを作成するエディタ拡張【Unity】【エディタ拡張】

Unity エディタ拡張

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

追記:改良版作りました!
オーディオのファイル名を定数で管理するクラスを自動作成する【Unity】【エディタ拡張】【LINQ】 - (:3[kanのメモ帳]


エディタ拡張とは

とりあえず↑こんな感じです。


AudioNameCreator.cs

では先にコードを公開。
以下のコードをかなり参考にしております。

↑こちらのエディタ拡張もかなり便利!


使い方

まず、オーディオファイルをBGM用とSE用に分けてResources以下のフォルダにいれます

f:id:kan_kikuchi:20141116141531p:plain

上記の用に、BGMまたはSE以下にフォルダを作り、分類しても問題ありません。

次にAudioNameCreator.csをEditorフォルダに入れると以下のように、Tools/Create/AudioNameというメニューが使えるようになります。

f:id:kan_kikuchi:20141116141207p:plain

これを実行するとScripts/Constants/AUDIO.csと言うファイルが出来上がります。

/// <summary>
/// オーディオ名を定数で管理するクラス
/// </summary>
public static class AUDIO
{
	  public const string BGM_BATTLE = "Battle";
	  public const string BGM_BOSSBATTLE = "BossBattle";
	  public const string BGM_MAP = "Map";
	  public const string BGM_TOPMENU = "TopMenu";
	
	  public const string SE_DAMAGE = "Damage";
	  public const string SE_SKILLLEARNING = "SkillLearning";
	  public const string SE_VANISHING = "Vanishing";
}

これで以下の用に、他のスクリプトからオーディオのファイル名を呼び出す事が出来るようになりました!

//"Vanishing"が返って来る
string seName = AUDIO.SE_VANISHING;

実はこれ単体ではそんなに役に立たないのですが、自家製AudioManagerを使うと真価を発揮します…!

OnPostprocessAudioから呼ぶ

最初に紹介した記事でも書かれていますが、AssetPostprocessorを継承したクラスで、 void OnPostprocessAudio () というメソッドを記述すると、オーディオファイルがインポートされた直後にそのメソッドが実行されます。

	void OnPostprocessAudio ()
	{
		AudioNameCreator.Create ();
	}

なので、上記の用に記述するとオーディオがインポートされる度にAUDIO.csを作り直してくれます

コード説明

AudioNameCreator.csの中で重要そうな所だけコード説明です。

MenuItem

[MenuItem(COMMAND_NAME)]以下に書かれたコードをCOMMAND_NAMEで指定されたボタンを押した時に実行するようにします。
また、第二引数をtrueにすると、それ以下のメソッドでそのメニューが使えるかを判断するようです(多分…)。

.ToUpper()

string型で.ToUpper()とすると大文字になるようです。また小文字にするには.ToLower()です。
定数だったので大文字にしてるんですが、c#では定数を大文字+アンダーバー区切りで表現しないという噂が…!

Resources.LoadAll

Resources以下にあるファイルを全て取得する事が出来ます。
また、今回のようにパスを指定する事でそのパス以下の(さらに下のファルダ内も含めた)全ファイルを取得します。

//指定したパスのリソースを全て取得
object[] bgmList = Resources.LoadAll("Audio/BGM");
object[] seList  = Resources.LoadAll("Audio/SE");

記事では分かりやすさのため、"Audio/BGM"とパスを指定しましたが、実際のコードではDATA.BGM_PATHというようにDATAというstaticクラスにパスをまとめています。


おわりに

上でも書きました、自家製のAudioMangerと一緒に使う事でよりよく使えます!

本当は一緒に書くはずが長くなってしまったため分けることに…
あと、出来ればAUDIO.cs内の定数名を決める時に大文字にするだけでなく、アンダーバーで区切りたかったんですが…めんどうなのでファイル名側で調整する事にしました。