強火で進め

このブログではプログラム関連の記事を中心に書いてます。

あまり知られてないけど便利な Unity の Attribute (属性)

Unity 2 Advent Calendar 2015 2日目の記事です。
1日目の記事は @pigeon6 さんの「Unityでリズムゲームを作る」でした。

Unity には Attribute という便利な機能が有ります。

主な機能はテラシュールブログさんの以下の記事に沢山紹介されています。あまり Attribute を活用してないという方は一読される事を強くオススメします。

UnityのAttribute(属性)についてまとめてメモる。 - テラシュールブログ
http://tsubakit1.hateblo.jp/entry/2015/01/03/203843

今回はその Attribute の中でもあまり使ってない人が少なそうな Attribute を2つ紹介します。テラシュールブログさんでも紹介されませんでした(^_^;)

InitializeOnLoad

まず1つ目は InitializeOnLoad です。
これは Unity エディタが起動するタイミングで処理を行わせる事が可能です。

例えば Android の KeyStore 関連の設定は他の人にソース(プロジェクト)を渡した時には入力した情報が引き継がれない為、それぞれの環境で再度設定が必要に成り、ちょっと不便です。
この様な場合に InitializeOnLoad で設定を行うと便利です。コードはこの様な記述に成ります。

※Editor フォルダに Startup.cs という名前で保存して下さい。

using UnityEngine;
using UnityEditor;
using System.IO;

[InitializeOnLoad]
public class Startup {
	static Startup() {
		PlayerSettings.Android.keystoreName = Directory.GetCurrentDirectory () + "/Assets/Editor/Keys/hoge.keystore";
		PlayerSettings.Android.keystorePass = "fuga";
		PlayerSettings.Android.keyaliasName = "Hoge";
		PlayerSettings.Android.keyaliasPass = "fuga";
	}
}

※もちろん、コードを観ると KeyStore パスワードがまるわかりになるのでチーム内の人間だけがソースコードにアクセス出来る状態で運用して下さい。また、自社の運用ルールなども確認の上、使うようにして下さい。
※ KeyStore のファイルは普通のフォルダに置くとビルドしたアプリに含まれる為、 Editor フォルダ内に配置する様にして下さい。

Conditional

2つ目は Conditional 。
これは指定の定数が定義されていたら実行し、定義されてなかったら何もしないという機能を追加できます。

例えば開発ビルド(ビルド時の設定で Development Build にチェック)の時にだけデバッグログを出力したい場合には以下の様に記述します。

	[System.Diagnostics.Conditional("DEVELOPMENT_BUILD")]
	void DebugLog(string msg) {
		Debug.Log (msg);
	}

[System.Diagnostics.Conditional("DEVELOPMENT_BUILD")] の DEVELOPMENT_BUILD 所は DEBUG など自分が別途定義する定数を使っても、もちろんOKです。

System.Diagnostics.Conditional の部分については using System.Diagnostics; を記述しておけば [Conditional("DEVELOPMENT_BUILD")] と書けます。必要に応じて使い分けて下さい。

なお、この機能は以下の様に #if 〜 #endif を行った時と動作は近いですが

#if DEVELOPMENT_BUILD

#endif

以下の様に実際に関数を呼んでる記述の部分についても定数が定義されてない場合にはコンパイラが自動的に削除してくれます。

	void Start() {
		DebugLog(" Start が実行された!!"); // DEVELOPMENT_BUILD が定義されてない場合にはここは自動的にコードから削除されます
	}

その為、あちこちに #if 〜 #endif を記述する必要なくなり、コードの見通しが格段にアップするのでこちらの記述の方がオススメです。

以上、2つのちょっとした便利機能を紹介しさせて頂きました。年末の忙しい時期にちょっとでもお役に立てれば幸いです。それでは皆様よい年末をノシ

Advent Calendar 3日目の記事は @geekdrums さんの「Unityで音楽同期したアニメーションを作る」です。