(:3[kanのメモ帳]

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

(:3[kanのメモ帳]


本ブログの運営者kan.kikuchiが個人で開発したゲームです!

    

ConditionalAttributeで複数のシンボルのANDやORを実装する方法【C#】【属性】


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




この記事でのバージョン
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}");
}


参考