if 文とは、条件が成立するかどうかを判断し、プログラムの実行フロー(どんな風に動くのか)を制御する機能です。 ゲームにおいては、プレイヤーの行動や状態に応じて、異なる結果を出力する際に使用されます。
例えば、プレイヤーが特定のアイテムを持っているかどうか、特定のボタンを押したかどうか、ゲーム内のドアを開けることができるかどうか、など もしも~だったらという形で、良し悪しの判断(評価といいます)をする場面などで使われます。
if 文の書式
if 文の書式は以下のようになります。
if (条件式) { // 条件が成立した場合に実行されるコード }
プログラムは if 文の条件式に記述されている内容をもとに、評価を行います。 そして評価結果は、bool(ブール)型のtrue(トゥルー)かfalse(フォールス)のいずれかになります。 評価結果が true であれば条件は成立したことになり、false であれば条件は成立しなかったことになります。
条件が成立した場合に、if文の()に続く{ } ブロック内の処理が実行されます。 条件が成立しない場合は { } ブロック内の処理は実行されず、無視されます。
if 文のサンプルコード
それでは実際に if 文を活用したサンプルコードです。2つ提示します。
1つ目は、変数の値を評価し、その値により、if 文内の処理を行うか、行わないかを評価する分岐処理です。
// プレイヤーが持っているアイテムの数 int playerItems = 3; // アイテムが 1 つ以上ある場合(playerItems > 0 の条件を評価)、条件が成立した場合にメッセージを表示する if (playerItems > 0) { Debug.Log("アイテムを使用できます。"); }
2つ目は、マウスの左ボタンがクリックされたときに、メッセージを表示する処理を行う分岐処理です。
using UnityEngine; public class MouseClickExample : MonoBehaviour { void Update() { // マウスの左ボタンがクリックされたかどうかを評価 if (Input.GetMouseButtonDown(0)) { Debug.Log("マウスの左ボタンがクリックされました。"); } }
このように、if 文を使うことで、変数の値や、マウスクリック、キー入力など、条件に応じた分岐処理を作成することができます。
条件式用の演算子
if 文の条件式に利用できる演算子を抜粋しておきます。
1.比較演算子
演算子の左辺と右辺を比較する際に利用します。
演算子 | 読み方 | 内容 |
---|---|---|
< | 小なり演算子 | 左辺が右辺より小さい場合に true |
<= | 小なりイコール演算子 | 左辺が右辺以下の場合に true |
> | 大なり演算子 | 左辺が右辺より大きい場合に true |
>= | 大なりイコール演算子 | 左辺が右辺以上の場合に true |
2.論理演算子
真(true)と偽(false)の二値からなる真偽値(真理値/ブール値)に対して、演算を行うことができる演算子です。 複数の条件を設定する際に利用します。
演算子 | 読み方 | 内容 |
---|---|---|
&& | 条件付き論理 AND (論理積)演算子 | 左右の条件式の両方がtrueであればtrue |
|| | 条件付き論理 OR (論理和)演算子 | 左右の条件式のどちらかがtrueであればtrue |
&& 演算子は「 A の条件の成立に加えて、B の条件も成立したら(A かつ、B なら)」という風に言い表せます。
|| 演算子は「A の条件か、B の条件の、どちらからが成立すれば」という風に言い表せます。
3.等値演算子
演算子の左辺と右辺が等しいか、あるいは等しくないかを判定する際に利用します。
演算子 | 読み方 | 内容 |
---|---|---|
== | 等値演算子 | 左辺と右辺が等しい場合に true |
!= | 非等値演算子 | 左辺と右辺が異なる場合に true |
特に注意したいのは等値演算子である「==」です。左辺と右辺が等しい場合という条件の書き方は、C#での記述は「==」です。 「=」では、変数への代入を意味する演算子になってしまうため、比べる条件にはなりません。
bool isGround; // マウスの左クリックが押されたとき、かつ、isGround 変数の値が true なら、条件成立 if (Input.GetMouseButtonDown(0) && isGround == true) { }
if / else 文
if / else 文は、条件が成立するかどうかで、2つの異なる処理を行う場合に使用します。 条件が成立した場合 (true) には if 文内の処理が実行され、条件が成立しなかった場合 (false) には else 文内の処理が実行されます。
if 文のみの場合、条件が成立しなければ何も処理を行いませんでしたが、 else 文を一緒に活用することにより、if 文が成立しなかった場合の分岐処理を作ることが出来ます。
サンプルコード1:
雨が降っているか、降っていないか、といった形で、必ずどちらかに分岐してほしい評価を行うケースです。 Aか B かという判定を作りたい場合に利用できます。
bool isRaining; // 条件(今回であれば isRaining の値が true であるか)を評価 if (isRaining) // bool 型の省略記法を利用している。これは isRaining == true と同じ条件式となる { // 雨が降っている場合の処理 } else { // 雨が降っていない場合の処理 }
サンプルコード2:
プレイヤーの体力が 0 になった場合、ゲームオーバーの画面を表示する、それ以外の場合は、ゲームを続行するといった場面で使うケースです。 こちらも処理の内容としては、サンプルコード1と同じで、A か B か、どちらかに分岐させる処理になっています。
// プレイヤーの体力 int playerHealth = 10; // 条件(今回であれば、体力が 0 になったかどうか)を評価 if (playerHealth <= 0) { // 条件が成立した場合(今回であれば、0 以下なら)、こちらの処理を行う Debug.Log("ゲームオーバー"); } else { // 条件が成立しない場合(今回であれば 0 以上なら)、こちらの処理を行う Debug.Log("ゲームを続行"); }
このように、条件式を変えることで、2つの処理の分岐を作りたい場合には if / else 文を利用することで制御することが出来ます。
if / else if 文
if / else if 文は、いくつかの条件があり、それぞれの条件が成立した場合に別々の処理を行いたいときに使います。 条件は一つだけが成立し、その他の条件は同時に成立しないように処理が行われます。
例えば、プレイヤーのスコアに応じて、異なる報酬を与える場面などで使われます。
サンプルコード
// プレイヤーのスコア int playerScore = 120; // スコアに応じて報酬を与えるため、評価していく if (playerScore >= 200) { Debug.Log("ゴールド報酬を獲得しました。"); } else if (playerScore >= 100) { Debug.Log("シルバー報酬を獲得しました。"); }
この例の場合、最初の if 文の条件が成立した場合、if 文内の処理のみを実行し、それ以降に用意されている else if 文は実行されません。 if 文の条件に合致していない場合のみ、else if 文の条件を評価し、条件が成立したら else if 文内の処理を実行します。
このように、if / else if 文は、それらが1つのセットのようになっており、セット内では重複して条件が成立しないように制御されます。
if / else if 文では、else if 文の部分はいくつでも追加できます。 また、最後に else 文をつけることができます。これにより、複数の条件に応じて、複雑かつ、異なる処理を行うことができます。
サンプルコード
using UnityEngine; public class WeatherEvents : MonoBehaviour { private string weather; void Update() { // 天気に応じた処理を行うため、条件式の評価を行う if (weather == "Sunny") { Debug.Log("天気は晴れです。"); // 晴れのときの処理を記述 } else if (weather == "Rainy") { Debug.Log("天気は雨です。"); // 雨のときの処理を記述 } else if (weather == "Snowy") { Debug.Log("天気は雪です。"); // 雪のときの処理を記述 } else { // 上記のいずれにも該当しない場合 Debug.Log("天気は曇りです。"); // 曇りのときの処理を記述 } } }
まず最初に if 文で天気が晴れかどうかを判断しています。 もし晴れでなければ、次に else if 文で雨かどうかを判断し、雨でもなければ、次の else if 文で雪かどうかを判断します。 最後に、いずれの条件も成立しなかった場合(つまり、天気が曇りの場合)には、else 文で処理が行われます。
複数の if 文と if / else if 文の使い分け
複数の if 文は、それぞれの条件が独立している場合に使用されます。
例えば、以下のようなケースでは、if 文を複数利用することが適切です。
using UnityEngine; public class PlayerEvents : MonoBehaviour { private bool itemCollected; private bool enemyDefeated; private bool reachedGoal; void Update() { // アイテムを拾った場合の処理 if (itemCollected) { Debug.Log("アイテムを拾いました。"); // アイテムの効果を適用する処理を記述 itemCollected = false; } // 敵を倒した場合の処理 if (enemyDefeated) { Debug.Log("敵を倒しました。"); // 敵を倒したときの報酬を獲得する処理を記述 enemyDefeated = false; } // ゴールに到達した場合の処理 if (reachedGoal) { Debug.Log("ゴールに到達しました。"); // ゲームクリアの処理を記述 reachedGoal = false; } } }
このコードでは、アイテムを拾った場合、敵を倒した場合、ゴールに到達した場合の、それぞれのイベントに対して独立した if 文を使用しています。 これにより、複数のイベントが同時に発生する可能性がある場合でも、それぞれが独立した if 文になっているため、それぞれの条件が判定され、適切に処理が行われます。
一方、if / else if 文は、複数の選択肢の中から1つだけ成立する条件の場合に使用されます。
例えば、以下のようなケースでは、if / else if 文が適切です。
// プレイヤーのスコア int playerScore = 350; // スコアに応じて報酬を与える if (playerScore >= 500) { Debug.Log("ゴールド報酬を獲得しました。"); } else if (playerScore >= 300) { Debug.Log("シルバー報酬を獲得しました。"); } else if (playerScore >= 100) { Debug.Log("ブロンズ報酬を獲得しました。"); } else { Debug.Log("報酬はありません。"); }
まず最初に if 文でスコアが 500以上であるかを判断しています。 もし500以上でなければ、次に else if 文で300以上かどうかを判断し、300以上でもなければ、次の else if 文で100以上かどうかを判断します。 最後に、いずれの条件も成立しなかった場合(つまり、100以下の場合)には、else 文で処理が行われます。
このように、if / else if 文の場合、複数の選択肢の中から、重複しない回答を1つだけ得たい場合に利用することが適切です。
if 文のまとめ
プログラムは制御処理の連続です。
そのために用意されている if 文や、if / else 文、if / else if 文は、いずれも条件に応じてプログラムの実行フローを制御する、とても重要な機能です。
「こうなったときにはこうしたい」という処理が浮かんだら if 文達の出番です。 自分の思い通りの処理を作れるようにするためにも、まずは簡単な処理を作ることから始めていき、プログラムに慣れていきましょう。