はじめに
Unity のプログラミングで使用される C# のデータ型には様々な種類があります。 今回はそのデータ型の中から bool (ブール)型を紹介します。
bool 型
C#における bool 型は、真(true)または偽(false)の2つの状態を表すデータ型です。
例えば、あなたが作っているゲーム内において、プレイヤーがスイッチを押すとドアが開くようにしたい、と考えてみてください。 この場合に、「スイッチの状態を表す」変数として、 bool 型の変数を使用することができます。
bool 型には真か偽の状態しかありませんので、それをスイッチの状態と見立てて 「スイッチが押されている」のか「スイッチが押されていない」のか、 いずれかの状態であるかをプログラムに判別させることで利用出来ます。
用途
bool型を使用する場合、自分で変数の名前を決めるだけではなく、 true / falseの意味を決め、プログラム内でその変数を使用するように記述する必要があります。
例えば、スイッチの状態を表す変数に「isSwitchOn」という名前をつけるとしましょう。
このときの真偽の役割は自分で決めることができますので、スイッチが押された場合には「true」、 押されていない場合には「false」という風に、真偽の役割を決めておくことでスイッチの現在の状態を表すことができます。
この前提でプログラム内で bool 型の変数を利用することになります。
また bool 型の変数は、ゲーム内では特に「フラグ(旗のこと)」という通称で呼ばれることもあります。 フラグが立っている、フラグが降りている、という言い回しを聞いたことがあるかと思いますが、 このフラグの状態を表す部分に bool 型の変数が利用されています。
bool 型の変数の宣言
bool 型の変数を宣言する場合は、次のように行うことができます。
bool myBool = true; // trueで初期化 bool isSwitchOn = false; // falseで初期化
bool 型の変数も int 型などの他のデータ型の変数と同じように、役割に合った適切な名前をつけます。 変数の宣言と同時に初期化することも出来ます。
なお、宣言フィールドにおいてメンバ変数として変数の宣言のみを行った場合には、自動的に false が代入されて初期化されます。
private bool myBool; // メンバ変数の場合で、初期化していない場合には自動的に false で初期化
ここで登場している「メンバ変数」、「宣言フィールド」、「初期化」といった単語が聞きなれない、 あるいは聞いたことがあるけど意味がわからない、という場合には、是非、自分で調べてみてください。
プログラムを上達するコツは、知らないことを知らないまま終わらせないことです。 なぜなのか、どんなことなのか、常に興味を持ち、探求心を持つことがとても大切です。
使い方(分岐処理)
bool 型も他のデータ型と同じように代入処理をすることで値を変更できます。 代入する際には値を直接書き込む方法、変数を利用する方法などがあります。
bool isSwitchOn = true; void Start() { isSwitchOn = false; // false を代入している Debug.Log(isSwitch); // Consoleビューに false と表示される }
bool isSwitchOn = true; bool isLockOn = false; void Start() { isSwitch = isLockOn; // isLockOn 変数の値(現在値は false) を代入している Debug.Log(isSwitch); // Consoleビューに false と表示される }
bool型は、条件分岐(if文やswitch文など)やループ(while文やfor文など)など、プログラムの制御フローにおいて非常に重要な役割を果たします。 bool型は、2つの値(trueまたはfalse)しか取り得ないデータ型です。この値を使って、プログラムの制御フローを制御することができます。
今回はその中から if 文(正式には if ステートメントといいます)を利用した、最も利用されるパターンの分岐処理を提示します。
例えば、ある条件が満たされているかどうかを調べる場合に、その状態を表しているbool型の変数と、等値演算子(==)と非等値演算子(!=)を使います。 以下の例では、スイッチが押されていることを表す変数「isSwitchOn 」がtrueである場合に、if文の中のブロックが実行されます。
bool isSwitchOn = true; // isSwitchOn 変数の値が true なら、という条件を等値演算子(==)で調べている if (isSwitchOn == true) { // このブロックが実行される }
このような分岐処理を作ることにより、プログラムは「スイッチが押されているか」を確認する制御が出来るようになります。
続いて、変数「isSwitchOn 」がfalseである場合に、if文の中のブロックが実行するパターンを書きます。
bool isSwitchOn = false; // isSwitchOn 変数の値が (false)なら、という条件を等値演算子(==)で調べている if (isSwitchOn == false) { // このブロックが実行される }
このような分岐処理を作ることにより、プログラムは「スイッチが押されていないか」を確認する制御が出来るようになります。 ここまではどちらも等値演算子(==)を利用して条件式を作っています。
ポイント①
等値演算子(==)を非等値演算子(!=)に変えて、同じ処理を書いてみましょう。
bool isSwitchOn = false; // isSwitchOn 変数の値が true ではない、つまり false なら、という条件を非等値演算子(!=)で調べている if (isSwitchOn != true) { // このブロックが実行される }
このような形で条件式には等値演算子(==)も非等値演算子(!=)も利用できます。 そのため bool 型の変数はいずれの方法でも、分岐の処理を作ることが出来ます。
bool isSwitchOn = false; // スイッチが押されていない(false)なら、という条件を非等値演算子(!=)で調べている if (isSwitchOn != true) { // このブロックが実行される } // スイッチが押されていない(false)なら、という条件を等値演算子(==)で調べている if (isSwitchOn == false) { // このブロックが実行される }
演算子と変数の状態は異なりますが、まったく同じ条件で分岐処理を作ることが出来ます。
そのため、一方的な変数の使い方をイメージするだけではなく、 true なら、false なら、という風に、常に変数の役割を考えておくことで効率のよい処理を書くイメージを持つことが出来ます。
ポイント②
bool 型のポイントは、真偽値に対してどのような役割を与えるのか、自分で考えておくことです。 そうすることで始めて分岐処理を使って処理の制御を行うことができるようになります。
また分岐処理を書いた変数を読み解く際には「変数が true なら」というプログラム的な読み方から 自分が変数に与えている役割に沿った読み方で読んでいくようにしてみてください。
if(isSwitchOn == true) { }
例えば、isSwitchOn 変数がスイッチの状態を表していて、 true が「スイッチが押している」という役割を持つなら、 「isSwitchOn 変数が true なら」と読むだけではなく、「スイッチが押されているなら」という風に解釈に読み変えるということになります。
プログラムはただ読むだけではなく、その部分を日本語の処理の解釈に置き換えて読み解いていくようにチャレンジしてください。
この処理の解釈の置き換えが出来るようになることを目標にするとよいでしょう。
まとめ
以上が、bool型の基本的な使い方です。 bool型は、プログラムの制御フローを制御するために非常に重要なデータ型なので、 しっかり理解しておくと自分の考えているプログラミングを作る上で楽になるでしょう。
また、プログラムには色々な書式が用意されています。 いずれは初心者から脱初心者を目指すことになりますから、 「今書いている処理をもっとよく書く方法(綺麗に、効率的に)はないのか?」という視点で、 自分のプログラムを客観的に見るように意識してみてください。