スマゲ

スマートなゲームづくりを目指して日々精進

Unityで条件付きコンパイルを行う

Unityでシンボル定義を利用して条件付きコンパイルを行います

■条件付きコンパイル
プログラムの特定のブロック、コードだけを選択してコンパイルすること。アプリケーションを混合言語で利用したり、プラットフォーム依存コンパイルを行ったりする時に利用する

■利用例1 : プラットフォームごとに振る舞いを書き分ける
プリプロセッサーディレクティブを利用してプラットフォームごとに異なる振る舞いを記述する
以下のコードはプロジェクトをUnityエディタ、Android、iOSそれぞれの環境で実効した時の振る舞いを書き分けている

using UnityEngine;
using System.Collections;

public class EnvTest : MonoBehaviour {

    void Start(){
        Debug.Log(GetEnv());
    }

    string GetEnv(){
#if UNITY_EDITOR
        return "editor";
#elif UNITY_ANDROID
        return "android";
#elif UNITY_IOS
        return "ios";
#endif
    }
}


■利用例2 : 独自のシンボル定義を行う
スクリプトの上部に #define を利用して独自のシンボル定義を行うことができる。この定義のスコープはそのスクリプトないだけである
以下はログを出すかどうかをシンボルで判断している

#define SHOW_LOG

using UnityEngine;
using System.Collections;

public class Title : MonoBehaviour {

    void Start(){
        int hp = 100;
#if SHOW_LOG
        Debug.Log("hp : " + hp);
#endif
    }
}


■独自のシンボル定義をプロジェクト全体に適用する
上の例ではシンボルは定義したスクリプト内でしか有効でなかったが、Unityの[Player Settings] -> [Scripting Define Symbols]からプロジェクト全体で利用することのできるシンボルを定義することができる。この設定はプラットフォーム間では共有されない。
f:id:sanukin39:20160629233750p:plain


■スクリプトからシンボルを定義する
SetScriptingDefineSymbolsForGroupを利用するとScripting Define Symbolsに値を設定できる

[MenuItem("Custom/SetSymbols")]
static void SetSymbols(){
    var symbols = PlayerSettings.GetScriptingDefineSymbolsForGroup(EditorUserBuildSettings.selectedBuildTargetGroup);
    symbols += ";DEVELOP;SHOW_LOG";
    PlayerSettings.SetScriptingDefineSymbolsForGroup(EditorUserBuildSettings.selectedBuildTargetGroup, symbols);
}


■参考リンク
#define (C# リファレンス)
Unity - マニュアル: プラットフォーム依存コンパイル
Unity - スクリプトリファレンス: PlayerSettings