この記事は「Unityでゲームを作るうえで必要なC#プログラミングの基礎知識」を解説するシリーズの第二弾で、今回は条件分岐について詳しくご説明するという内容になっています。
Unityでゲームを作る際にはC#によるプログラミングは避けて通れないので、プログラミングが苦手だなぁという方は本シリーズをご覧いただき基礎知識を学んで頂ければと思います。
条件分岐とは?
でははじめに、そもそも条件分岐とは何なのかについてご説明します。
プログラミングにおける条件分岐とは例えば
- もし〇〇だったら処理A
- それ以外だったら処理B
というように条件に応じて処理を変化させることを指します。条件分岐を使えば様々な状況に柔軟に対応できるプログラムを作ることができます。
もし条件分岐がなければ、プログラムは単純に上から下へ1行ずつ処理を実行するだけなので柔軟なプログラムを書くのは困難になるでしょう。プログラミングにおいては欠かせない要素のうちの一つですね。
C#での条件分岐の書き方
さて、それでC#では条件分岐の書き方が大きく分けて2通りあります。
- if文と、それに付随する構文
- switch文
それぞれ詳しく見ていきましょう。
if文、else文、else if文の使い方
if文の使い方
まずはif文です。次のソースコードをご覧ください。
using UnityEngine; public class SampleScript : MonoBehaviour { int hp = 100; void Start() { int damage = 100; hp -= damage; Debug.Log(damage + "のダメージ!"); Debug.Log("残りHP:" + hp); if(hp == 0) { Debug.Log("ゲームオーバー"); } } void Update() { } }
これは変数hpが0に等しいとき「ゲームオーバー」という文章を出力するC#スクリプトです。if文は
if(hp == 0) { Debug.Log("ゲームオーバー"); }
の部分で、書き方としては
if(条件式) { 条件を満たしたときに実行する処理; }
となっています。
if文では条件式が真(=成り立つとき)はif文の{}内の処理が実行されますが、条件式が偽(=成り立たないとき)は{}内の処理は実行されずにそのまま通過します。
ちなみにif文は入れ子にすることも可能です(つまりif文の中にまたif文を書くこともできます)。
条件式の基本的な書き方
ところでif文では条件式が必要になりますが、この条件式はどうやって書けばいいのかというと「関係演算子」というものを使います。
例えば、上の例のように「hpが0と等しい」という条件を書きたい場合は、関係演算子の「==」を使って
と書きます。関係演算子は下の表のように他にも色々な種類があります。
関係演算子 | 意味 |
---|---|
== | 左辺と右辺が等しければ真 |
!= | 左辺と右辺が等しくなければ真 |
> | 左辺が右辺より大きければ真 |
< | 左辺が右辺より小さければ真 |
>= | 左辺が右辺以上なら真 |
<= | 左辺が右辺以下なら真 |
ちなみに注意点ですが、float型など小数を扱う型を条件式に使う場合は「==」は使ってはいけません。なぜならそういった型は数値に誤差が生じる場合があり、ピッタリ等しい値になるとは限らないからです。覚えておきましょう。
複雑な条件式の書き方
条件式を書いていると、
- 複数の条件を全て満たす場合
- 複数の条件のうち、どれか一つでも満たす場合
を判定したくなることがあります。そのようなときは論理演算子というものを使って条件式をつなぎ合わせると便利です。論理演算子は主に次の2種類があります。
論理演算子 | 意味 |
---|---|
&& | かつ |
|| | または |
例えば
という状況を判定したければ次のような条件式になります。
こうすることでif文を何重にも入れ子にしなくてもよくなり、すっきりとしたソースコードを書くことができます。ただしその分条件式は複雑になり分かりづらくなるので、込み入った条件式の場合は
- if文をどの程度まで入れ子にするか
- 条件式をどのくらいまで複雑にするか
のバランスを見てなるべく分かりやすいコードを書くようにしましょう。
else文の使い方
さて条件式の話が長くなってしまいましたが、次はelse文をご紹介しておこうと思います。これはif文にelse文を付け加えることで「if文の条件以外」の場合にも処理を用意できるようにするものです。次のC#スクリプトをご覧ください。
using UnityEngine; public class SampleScript : MonoBehaviour { int hp = 100; void Start() { int damage = 100; hp -= damage; Debug.Log(damage + "のダメージ!"); Debug.Log("残りHP:" + hp); if (hp == 0) { Debug.Log("ゲームオーバー"); } else { Debug.Log("まだまだ余裕だ。"); } } void Update() { } }
最初のほうのC#スクリプトのif文にelse文を付け加えて「hpが0以外の場合」を追加しました。else文をif文の後に付け加えることで「その他の場合」の処理を追加することができます。
if (条件式) { 条件を満たしたときに実行する処理; } else { 条件を満たさなかったときに実行する処理; }
なおelse文は「上記以外の場合すべて」を表すので条件式は必要ありません。
else if文の使い方
また、そのほかにもif文にはelse if文というものを付け加えることができます。こちらもまずはサンプルコードをご覧ください。
using UnityEngine; public class SampleScript : MonoBehaviour { int hp = 100; void Start() { int damage = 100; hp -= damage; Debug.Log(damage + "のダメージ!"); Debug.Log("残りHP:" + hp); if (hp == 0) { Debug.Log("ゲームオーバー"); } else if (hp <= 20) { Debug.Log("ヤバい、そろそろ倒れそうだ…"); } else if (hp <= 50) { Debug.Log("だんだんキツくなってきた。"); } else { Debug.Log("まだまだ余裕だ。"); } } void Update() { } }
else if文を上記のようにif文とelse文の間に追加することで、別の条件を満たす場合の処理を用意することができます。
ちなみにelse if文を使う場合も最後のelse文は必須というわけではなく、省略することが可能です。
switch文の使い方
さてC#の条件分岐の構文にはもう一つ、switch文というものもあります。たいていの場合はif文・else文・else if文の3つで事足りるのですが、たくさん分岐させたい場合はswitch文を使ったほうがスッキリしたコードを書けるかもしれません。まずはサンプルコードをご覧ください。
using UnityEngine; public class SampleScript : MonoBehaviour { void Start() { string fruit = "りんご"; switch (fruit) { case "りんご": Debug.Log("りんごはHPを50回復する。"); break; case "みかん": Debug.Log("みかんはMPを30回復する。"); break; case "バナナ": Debug.Log("バナナはスタミナを40回復する。"); break; default: Debug.Log("これはその他のフルーツだ。"); break; } } void Update() { } }
変数fruitの文字列に応じて果物の説明を出力するC#スクリプトですね。switch文の構文は次のようになります。
switch (変数) { case 値A: 変数が値Aのときの処理 break; case 値B: 変数が値Bのときの処理 break; default: その他の場合の処理 break; }
caseの部分に「変数が〇〇の時の処理」を書きます。またdefaultはどのケースにも該当しない場合に実行される部分で、省略することも可能です。breakはcase・defaultの最後に必要なので面倒でも必ず書きましょう。
なおswitch文とif文の使い分けについてですが、一般的に
- 最初から比較する値が具体的に決まっている場合
- 条件分岐が3つ以上になる場合
はswitch文のほうが良いとされます。参考になさってください。
おわりに
以上、C#の条件分岐の書き方や使い方についてご説明しました。条件分岐は柔軟な処理を作るうえで欠かせない概念なので、ぜひ上記の内容を参考にしていただきご理解いただければと思います。