bool 型には特殊な記法が用意されており、覚えておくと便利な使い方が出来ます。
ここでは利用例を交えて紹介します。
bool 型については、こちらの記事を参考にしてください。
1.等価条件式の省略記法
bool 型の変数の条件式は == や != の演算子を省略して記述することが出来ます。
true を評価したい場合には、bool 型の変数名のみを if 文の条件式に記述します。
// isSwitchOn 変数の値が true なら、という条件を等値演算子(==)で調べている if (isSwitchOn) // → if (isSwitchOn == true) と同じ意味 { // このブロックが実行される }
これは 別の見方から考えた場合には、if (isSwitchOn != false) であるとも言えます。
false を評価したい場合には、bool 型の変数名のみを if 文の条件式に記述し、接頭に ! 演算子をつけます。
// isSwitchOn 変数の値が false なら、という条件を非等値演算子(!=)で調べている if (!isSwitchOn) // → if (isSwitchOn != true) と同じ意味 { // このブロックが実行される }
これは 別の見方から考えた場合には、if (isSwitchOn == false) であるとも言えます。
実はこの省略記法は、すでに活用されているかもしれません。 次のような if 文をみたことはありませんか?
using UnityEngine; public class MouseClickSample : MonoBehaviour { void Update() { // マウスの左ボタンをクリックしたとき if (Input.GetMouseButtonDown(0)) // ← ☆ この部分です { Debug.Log("マウスの左ボタンがクリックされました。"); } } }
実は if (Input.GetMouseButtonDown(0)) も、この bool 型の省略記法を利用した記法になっています。 本来は if (Input.GetMouseButtonDown(0) == true) と書きます。
それでは紹介した等価条件式の省略記法を利用して、 GameObject のアクティブ(表示/非表示)切り替えと、コンポーネントのアクティブ(オン/オフ)切り替えの例を紹介します。
【GameObject のアクティブ(表示/非表示)切り替え】
こちらはGameObject のアクティブ(表示/非表示)切り替えのサンプルです。 bool の値が true であるかを確認する条件式で利用しています。
using UnityEngine; public class ToggleActiveWithShorthand : MonoBehaviour { // 対象の GameObject をインスペクタからアサイン public GameObject targetObject; void Update() { // スペースキーが押されたとき if (Input.GetKeyDown(KeyCode.Space)) // ← if (Input.GetKeyDown(KeyCode.Space) == true) と同じ意味 { // targetObject がアクティブなら非アクティブに、非アクティブならアクティブに if (targetObject.activeSelf) // ← if (targetObject.activeSelf == true) と同じ意味 { targetObject.SetActive(false); } else { targetObject.SetActive(true); } } } }
この例では、スペースキーが押されるたびに、対象の GameObject のアクティブ状態(表示/非表示)が切り替わります。 等価条件式の省略記法を使用しているため、if (targetObject.activeSelf) と記述しています。これは if (targetObject.activeSelf == true) と同じ意味です。
【コンポーネントのアクティブ(オン/オフ)切り替え】
続いて、コンポーネントのアクティブ(オン/オフ)切り替えのサンプルです。 こちらでは false であるかを確認する条件式で利用しています。
using UnityEngine; public class ToggleComponentWithShorthand : MonoBehaviour { // 対象のコンポーネント (例として Light を使用) private Light targetLight; void Start() { // 初期化時に対象のコンポーネントを取得 targetLight = GetComponent<Light>(); } void Update() { // スペースキーが押されたとき if (Input.GetKeyDown(KeyCode.Space)) // ← if (Input.GetKeyDown(KeyCode.Space) == true) と同じ意味 { // targetLight が非アクティブならアクティブに、アクティブなら非アクティブに if (!targetLight.enabled) // ← if (targetLight.enabled != true) と同じ意味 { targetLight.enabled = true; } else { targetLight.enabled = false; } } } }
この例では、スペースキーが押されるたびに、対象のコンポーネント(ここでは Light コンポーネント)のアクティブ状態(オン/オフ)が切り替わります。 等価条件式の省略記法を使用しているため、if (!targetLight.enabled) と記述しています。これは if (targetLight.enabled != true) と同じ意味です。
2. ! 演算子を利用した値の反転処理
bool 型では次のような分岐の処理を作成することで、変数内の真偽値を入れ替えることが出来ます。 (ここでは値をそのまま入れ替えていますが、他の bool 型の変数を代入しても処理できます。)
bool isFlag = true; // 初期値を true に設定する // isFlag の値を判定して、真偽値を入れ替える分岐処理 if(isFlag == true) { // 現在値が true なら false に isFlag = false; } else { // 現在値が false なら true に isFlag = true; } // 結果を表示する Debug.Log(isFlag); // 出力結果: false
この処理に慣れてきたら、次は、以下のような書式で真偽値を入れ替えることができます。
bool isFlag = true; // 初期値を true に設定する // isFlag の値を反転させる isFlag = !isFlag; // ← 代入している部分がポイント! // 結果を表示する Debug.Log(isFlag); // 出力結果: false
処理が一気に短くなりましたね。
理由は if / else 文の処理が1行の処理で済むようになっているためです。 この特殊な処理は、bool 型の変数で利用できる処理です。 代入用の bool 型の変数の接頭に ! 演算子をつけることで、変数の値を反転させる機能があります。
そのため、上記の例では ! 演算子を使って isFlag の値を反転させています。 最終的に isFlag の値は false になります。
反転処理、ということですから、さらにその後でもう一度、反転の処理を行うと
bool isFlag = true; // 初期値を true に設定する // isFlag の値を反転させる isFlag = !isFlag; // true → false // isFlag の値を反転させる isFlag = !isFlag; // false → true // 結果を表示する Debug.Log(isFlag); // 出力結果: true
やはり値が反転します。
このように bool 型では、! 演算子と変数を使って真偽値を反転させることができます。
まとめ
bool 型の特殊な記法を2つ紹介させていただきました。 基本的な処理を覚えてきたら、次のステップアップに向けて、これらを是非活用してみてください。
ただし、これらの省略記法は、状況に応じて使い分けることが重要です。 コードの可読性(読みやすさ)を高めることが目的なので、逆に理解しづらくなる場合は省略せず、 == や != の演算子を使用して記述しても構いません。
インターネットや教材などでは、これらの記法で記述されていることもあります。 プログラムを読み解く力を身につけるためにも、色々な処理の読み方を覚えてスキルアップを目指していきましょう。