この記事でのバージョン
Unity 2022.2.8f1
はじめに
C#ではConditionalAttributeという属性を使う事で
特定のシンボルが定義されていない時にメソッドの呼び出しを無視する事が出来ます。
指定した条件付きコンパイル シンボルが定義されていない場合、メソッド呼び出しまたは属性を無視するようコンパイラに指示します。
具体的には以下のような感じで、メソッド側にConditionalを付けておけば
呼び出し元は何もしなくてもシンボルの有る無しで実行するかを切り替える事が出来ます。
using System.Diagnostics;//Conditionalを使うのに必要
private void Awake() { //SAMPLE_SYMBOLが定義されていないと無視(CreateLogも実行されない) ShowLog(CreateLog()); } //ログを作成 private string CreateLog() { Debug.Log($"ログを作成"); return "特に意味のないログ"; } //ログを表示 [Conditional("SAMPLE_SYMBOL")]//SAMPLE_SYMBOLが定義されている時だけ呼び出される private void ShowLog(string log) { Debug.Log($"ログを表示 : {log}"); }
ちなみにシンボルをそのまま使っても同じような事は出来ますが、
全ての呼び出し元に設定する必要があるためちょっと面倒だったりします。
#if SAMPLE_SYMBOL//SAMPLE_SYMBOLが定義されている時だけ呼び出される ShowLog(CreateLog()); #endif
今回はこのConditionalで複数のシンボルのANDやORを実装する方法の紹介です!
なお、Unityでの使用を想定しているためDebugを使っています。
ConditionalAttributeで複数のシンボルのANDやORを実装する方法
まずOR、つまり「どちらかのシンボルが有効なら実行する」場合ですが、
Conditionalをそのまま2つ使えばOKです。
//UNITY_EDITORかDEBUGが有効なら実行 [Conditional("UNITY_EDITOR"), Conditional("DEBUG")] private void ShowLog(string log) { Debug.Log($"ログを表示 : {log}"); }
次にAND、つまり「どちらのシンボルも有効なら実行する」場合ですが、
素直にConditionalを使って実装する事は出来ません。
なのでちょっと複雑ですが、絶対に宣言されないシンボルをConditionalで設定(=メソッドを無効化)し、
そのConditionalを複数のシンボルが有効な時だけ無効化(=メソッドを有効化)する事で実現出来ます。
#if !(SAMPLE1 && SAMPLE2) //SAMPLE1とSAMPLE2の両方が有効な時だけ↓のConditionalを無効(=メソッドの呼び出しが有効) [Conditional("NEVER_DEFINED_SYMBOL___XYZ")]//絶対に宣言されないシンボルを設定し、メソッドを無効 #endif private void ShowLog(string log) { Debug.Log($"ログを表示 : {log}"); }
逆に「どちらのシンボルも無効なら実行する」場合は以下のような感じになります
#if SAMPLE1 || SAMPLE2 //SAMPLE1とSAMPLE2の両方が無効な時だけ↓のConditionalを無効(=メソッドの呼び出しが有効) [Conditional("NEVER_DEFINED_SYMBOL___XYZ")]//絶対に宣言されないシンボルを設定し、メソッドを無効 #endif private void ShowLog(string log) { Debug.Log($"ログを表示 : {log}"); }
参考