制御文の基本とif文の扱い方を知ろう!

unityにおいて、スクリプトは基本的に上から下の順番で読み込まれます。そこに「ある条件では読み込む」「ある条件では読み込まない」といった読み込む際の条件を付けるときに必要になるのが制御文です。

今回はそんな制御文について学んでいきましょう!

制御文って何?

先ほど言った通り、スクリプトは基本的に上から読まれます。

制御文を使用することで、ある条件のときにだけ処理を行なったり、処理を繰り返すことが可能になります。if文・while文・for文などがその代表的な例です。

ポイント
制御文を使うことでスクリプトに”条件”を付けることができる

制御文の基本のif文について知ろう

制御文の一番代表的なものはif文です。基本的には英語の授業で習うifと一緒です!

if(条件式){
処理
}

早速ですがこちらがif文の基本形になります。

()の中に条件式を書くのですが、条件式が真(true)だった場合に{}内の処理が読み込まれ、条件式が偽(false)だった場合には{}内の処理が実行されずに次のスクリプトが読まれます

真と偽を扱うのはブール型でしたね。覚えているでしょうか?

また、条件式ではこれから説明する関係演算子が使われます!

関係演算子

関係演算子は、一言で言うと「左右の値の関係を調べる演算子」です。

わかりやすいようにまとめてみます。

関係演算子 どの場合に真か 具体例
== 左右が同じ値だと真 真 10 == 10  偽 10 == 7
!= 左右の値が異なると真 真 100 == 56  偽 100 == 100
> 左の値が大きいと真 真 100 > 56  偽 98 > 150
< 右の値が大きいと真 真 56 < 98  偽 150 < 98
>= 左の値が右以上だと真 真 200 >= 150 真 150 >= 150  偽 50 >= 156
<= 右の値が左以上だと真 真 48 <= 150 真 150 <= 150 偽 150 <= 48

==と!=は対の関係にあり、>と<はより大きい・より小さい、>=と<=は以上・以下という関係をおさえておくと覚えやすいと思います。

また、スクリプトでは”=”と”==”は全く異なるのでしっかり区別しておきましょう!”=”は値の代入を意味するでしたね!

ポイント
  • 関係演算子は制御文で条件を判断するのに用いられる
  • “=”は代入、”==”は値の比較で用いる!

if文についてもう少し知ろう!

if(条件式){
処理
}

こちらがif文の基本的な書き方でした。

少しスクリプトを書いてみましょう。

void Start () {
	
int myheight = 170;
if(myheight > 165){
Debug.Log("私は彼より身長が高い");
}
	
	}

彼の身長は165センチです。その人が誰かとかはここでは無視してください。

myheight(私の身長)は170なのでif内の処理が読み込まれます。結果としてコンソールウィンドウに「私は彼より身長が高い」と出力されます。

if-elseを使って条件を分岐させよう

今度はif文の後にelseを入れることで条件を分岐させる方法を学んでいきます。

elseを用いることで、if文に入った後に条件が真でなかった場合の処理を追加できます

void Start () {
	
int myheight = 170;
if(myheight > 175){
Debug.Log("私は彼より身長が高い");
} else {
Debug.Log("私は彼より身長が高くない");
}
	
	}

ここでは、彼の身長が175センチあると考えてください。myheightは175よりも小さいのでif内の処理は読み込まれず、else以降の処理が読み込まれます。

その結果コンソールウィンドウには「私は彼より身長が高くない」と出力されます。

複数のifを使い分けよう!

先ほどある条件かどうかの場合の処理ついて説明しました。ですが、条件が2つあった場合はどうでしょうか?

実はifと条件の文の数だけのelse ifを用いて複数の条件についての処理を扱うことができます。

if(条件式A){
処理1
} else if(条件式B) {
処理2
}

..........//さらに条件を加えることもできる

else if(条件式○){
処理○
}else{
処理○
}

こちらのようにelse ifを使うことで、いくつもの条件で分岐させることができます。
上から順にスクリプトが読まれ、条件を満たした最初のスクリプトが読み込まれます。一度読み込まれると、それ以降は読まれないので注意が必要です。

当てはまる条件がない場合はelseが読まれますが、elseはなくても構いません。

ここで1つスクリプトの例を挙げてみます。

void Start() {
int a = 170;//Aの身長は170
int b = 165;//Bの身長は165
int c = 175;//Cの身長は175
if(a > c){
Debug.Log("Aの身長はCより高い");
} else if(a > b) {
Debug.Log("Aの身長はBより高い");
}else{
Debug.Log("Cは身長が一番高い");
}

最初の宣言だけを見ると、Cが一番身長が高いのは明らかですが、ここでは2番目の処理が読まれるのでコンソールウィンドウに「Aの身長はBより高い」と表示されます。

一番最後の処理は読まれません。

変数のスコープについて知ろう!

いきなりですが、このコードをunityを使って書いてみてください。

void Start(){
int myage = 16;
if(myage == 16){
int hisage = 18;
Debug.Log(myage);
Debug.Log(hisage);
}
Debug.Log(hisage)

なぜかエラーが表示されてしまいました。

これには変数のスコープ(有効範囲)というものが関係しています。スコープとは変数の有効範囲を表し、上の例ではhisage(彼の年齢)という変数がスコープから出てしまっているためにエラーが表示されたのです。

void Start(){
int myage = 16;
if(myage == 16){
int hisage = 18;
Debug.Log(myage);
Debug.Log(hisage);
}
Debug.Log(hisage);
}

↑変数myageのスコープ(有効範囲)は2から8行目

void Start(){
int myage = 16;
if(myage == 16){
int hisage = 18;
Debug.Log(myage);
Debug.Log(hisage);
}
Debug.Log(hisage);

↑変数hisageのスコープ(有効範囲)は4から6行目

わかりやすく書くとこのような感じです。void Start(){}またはif() {}のような{}で表された範囲をそれぞれボックスというのですが、上の例ではif内で宣言されたhisageという変数が、ボックスの外で呼び出されてしまっているためにこのようなエラーが発生してしまったのです。

まとめ

今回のポイントを一度整理しておきます。

ポイント
  1. スクリプトに条件をつけたいときは制御文を用いる
  2. 制御文の基本はif文、それ以外にもwhile文やfor文がある
  3. 制御文では関係演算子を用いて条件を判断する
  4. {}で囲まれた範囲をブロックと呼ぶ
  5. 制御文を使う変数のスコープに気をつける

制御文は非常によく使うので、今回の内容はよく理解しておきましょう!