Unity C#の条件分岐の使い方 if文・switch文

条件式についての画像 Unity C#入門講座
条件式を使うと処理を分岐することができる。


Unityの本格ゲーム制作講座はこちら
【30日間の全額返金保証付き】

今回の記事では制御文について解説していきます。

制御文にはいくつか分類があるのですが、ここでは条件分岐と呼ばれるif文とswitch文について見ていきます。

前回の記事:

Unity C#の演算子の使い方をマスターしよう
今回の記事では演算子について解説していきます。 演算子は簡単に言うと、足し算、掛け算、引き算、割り算などを意味する記号ですね。 プログラミングする上ではこうした四則演算以外でも演算子を利用することがあります。 以前の記事の中でも既...

【Unity入門の森の最新ゲーム開発講座もお届け】

制御文と条件分岐について

制御文とはプログラムの処理を実行するかしないかを制御するための構文になります。

その中でも今回説明する以下の条件分岐は最も基本的な制御文になります。

  • if
  • if else
  • ?演算子
  • switch

これらの制御文はC#以外のプログラミング言語でも使われており、基本的に同じように使うことができます。

一度使い方を覚えると一生使える知識になるのでがんばっていきましょう!

if文とは

if文についての画像

if文は最も基本的な条件式

if文、if else文は最も基本的な制御文になります。

if文は条件式の中の条件を満たしているとき、満たしていないときで処理を分岐させるために使います。

if文の書き方

if文の書き方は以下のものになります。条件式がtrue(真)になる時のみ鍵括弧({})で括った処理を実行します。

if (<条件式>) { <条件式がtrueの時に実行したい処理> }

ちなみに処理が1文に収まる時は鍵括弧を省略することができます。

if else文の書き方

if else文はif文を拡張したもので、条件式の値によって処理を2つ以上に分岐させることができます。

こちらの場合でも処理が1つに収まる時は鉤括弧を省略することができます。

if (<条件式>) { <条件式がtrueの時の処理> } else { <falseの時の処理> }

if else if …と複数のif文を繋げた書き方

if else文はelseの後に他のif文をつなげることで処理を3つ以上に分岐することができます。

if (<条件式1>) {} else if (<条件式2>) {} ...

注意点として、これと似たようにif文単体の後すぐにif文を書くことができますが、その場合は異なる分岐だとみなされますので注意してください。(単純に改行されていないとみなされます。)

ネスト(Nest、入れ子)したif文の書き方

アプリ作成中に分岐した処理の中でさらに分岐したいことが出てくるかもしれません。

そのような場合はif文で分岐した処理の中にさらにif文を書くことで対応できます。

このような入れ子構造になったものをネスト(Nest)と呼んでいます。

? 演算子 

?演算子についての画像

?演算子は簡略したif文みたいなもの

条件式を用いてある変数に代入したい値を切り替えたい場合があります。

if文を使用してもいいですが、?演算子を使用するともっと簡単に書くことができます。

<条件式> ? <trueの時の値> : <falseの時の値>

このように書くと条件式によって?より後に書いた2つの値のどちらを使うか切り替えることができます。

?演算子は変数に値を代入する用途で使われることが多いですが、それ以外にもメソッドの戻り値を返す時などにも使用することができます。

また、?演算子も入れ子にすることができますので、2つ以上の条件式を組み合わせることができます。ですが、そのようなコードは読みづらくなりやすいのであまり書かないようにしましょう。

また、?演算子を使用する際は必ずtrueとfalseそれぞれ書いた値の型を一致させて下さい(※)。

(※型変換が可能な型なら問題ありません。)

switch文とは

switch文についての画像

switch文を使うと値がとるものによって処理を分岐させることができる。

switch文はif文を拡張したような制御文です。条件式に与えた値に応じて処理を分岐することができます。

分岐先の処理はcase文の中に書いていきます。

switch(<条件式>) { ... case <値1>: <処理1> break; ... }

また、同じ処理を実行したいcase文がある時は、続けて書くことで実行する処理をまとめることができます。

switch(<条件式>) { ... case <値1>: case <値2>: <処理1> break; ... }

どのcase文に当てはまらない場合に処理を実行したい時はdefault文を書いて下さい。

switch(<条件式>) { ... default: <処理> break; ... }

なお処理を書いたcase文の末尾には必ず、breakキーワードをつけて下さい。つけ忘れると、C#コンパイラーはbreakキーワードをつけ忘れという意味合いのコンパイルエラーを出します。

また、case文とdefault文の並び順は自由になります。なので、先にdefault文を書いてもOKです。

switch文の中には最新のC#では使用できるがUnityでは使用できないものもありますので注意して下さい。

  • Type pattern
  • case when句

などなど。ちょっと応用的な文法なので初心者さんは気にしなくてOKです。

switch制御文の中で変数を宣言・初期化する時の注意点

switch文の中で変数を宣言・初期化する際にはいくつかの注意点があります。

  • 変数を宣言・初期化する時は必ずcase文の鍵括弧({})の中で行う
  • 同じswitch文全体には同じ名前の変数は一つだけになるようにする
  • あるcase文で宣言・初期化した変数の型は他のcase文でも同じ型として扱う

別々のcase文で同じ名前の変数を宣言・初期化する際には一番上に書いたcaseの中で宣言・初期化を行い、それより下にあるcase文では宣言を省略してそのまま使用することができます

これはswitch文のもつスコープがその中にあるcase文で共通しているためです。

(※スコープにつきましては他の記事でご紹介します。)

【Unityで実践】 変数の状態によって制御文を使って処理を切り替える方法

今回の記事で条件分岐について紹介しました。早速、条件分岐のよくある使い方の値の検証を行ってみましょう!

Inspectorからの入力をチェックしてみよう。MonoBehaviour.OnValidate()について

MonoBehaviour内にvoid Validate()メソッドを定義しますと、Inspector上からSampleコンポーネントの値を変更するたびに上に書いたOnValidateメソッドが実行されます。

これはUnityEngine.MonoBehaviourが持つ機能の一つで、引数を持たず、voidな戻り値を持つOnValidateと名付けられたメソッドがある時はInspecotorから値を変更した時にUnityが自動的にそのメソッドを呼び出すようになっています。

現状ではEditor拡張にその役目が置き換わっていますが、手軽にInspector上で入力した値を検証することができますので簡単に紹介します。

OnValidate()が呼び出されるタイミングは以下のものになります。

  • Inspector上から値が変更された時
  • スクリプトが有効化された時
  • 他のスクリプトをビルドした時

それでは実際に条件分岐を使ってみましょう!

Unityでのif文の使い方

if文を使ってみようの画像

Valueを1にするとColorが白色になる。他の値にしても変わらない。

まず初めにValueの値を変更するのに合わせてColorの色も変更するコードを書いてみましょう!

使用する条件文はif文になります。サンプルコードではValueが1になった時、Colorを白色に変更しています。

またまだ説明していないものが含まれていますが、Meshに値が設定されている時にはその色をColorになるよう設定しています。

Unityでのif else文の使い方

if else文を使ってみようの画像

ネストしたif文を使うことでValueの値が1以外の時でも色が変更されるようにできる。

Valueの値が1になった時だけしか変更しないのは物足りませんので、if else文を使用しValueが他の値になった時にも色を変更するようにしてみましょう!

サンプルコードではネストしたif else文を使用してValueの値が1から4になった時はColorをそれぞれ対応する色に変更し、Valueの値がそれ以外のものになったらColorを黒色にしています。

Unityでのswitch文の使い方

switch文を使ってみようの画像

ネストしたif文の時と動作は変わらないが、switch文でも分岐させることができる。

ネストしたif文を使用すると条件式がたくさん書く必要があり、読みづらくなりがちです。

先のサンプルコードではValue単体の値を見て処理を分岐していますので、そのような場合はswitch文に置き換えることができます。

次のサンプルコードの動作は上のif else文で書いたものと同じになります。ですが、switch文を使った方が意味を把握しやすくなっています。

ネストしたif文とswitch文は似たような意味合いを持つプログラムになりがちですが、一般的に一つの値がとるものに対して処理を分岐させたい時はswitch文を使用し、if else文はそれ以外の複雑な分岐に使用するようにしましょう!

まとめ

今回の記事では制御文の一つである条件分岐について見てきました。条件分岐にはif文とif else文、switch文があり、それら全てプログラムの処理を分岐するためのC#の機能になります。

この記事を簡単にまとめますと以下のようになります。

  • 条件分岐を使うと変数の状態に合わせてアプリの処理を切り替えることができる。
  • if文は最も基本的な条件分岐で、変数の値に応じて処理を実行したりしなかったりできる。
  • if else文は処理を2つに分岐させることができ、それ以上にif文を続けることができる。
  • ?演算子を使用すると条件式によって簡単に値を切り替えることができる。
  • switch文は一つの値に対するif文を簡単にした条件分岐。
  • switch文の各ケース分けの末尾にはbreakキーワードをつける必要がある。

それでは、次の記事に行ってみましょう。

余談:goto文について

歴史的経緯からC#の条件分岐にはgoto文という制御構文があります。

こちらはソースコード上にラベルをつけた部分に処理をジャンプさせることができる機能になりますが、決して安易に使用しないでください。

一見便利に見えますが、goto文を使用したコードはスパゲティコード(※)という乱雑で読みづらく修正作業がしづらい酷いコードになりやすいです。そのようなコードは悪いコードとみなされます。

goto文自体は次の処理を好きな箇所にジャンプさせる単純な処理なのですが、人がプログラミングする上で自由度が高すぎたようです。

(※スパゲティコードはgoto文を使用しなくても処理の流れが把握しづらいコード全般を指します。)

内部的な処理から見るとgoto文は他の制御構文の裏側で使用されています、さらにコンピュータから見ると最も基本的な制御構文ではあります。

ですが、人がプログラミングする上では自由度が高すぎることはミスにも繋がりやすいため、プログラミングの世界ではif文やswitch文など機能に制約をつけ、人が理解しやすく、ミスしづらい方向へと進歩していっています。

goto文は一部の場面では便利な面もあるのですが、基本的にそれを使用するようなソースコードは設計ミスだと判断してもいいでしょう。

Unity C#の繰り返し処理の使い方 for文・while文・foreach文
今回の記事では繰り返し処理についてみていきます。 アプリ開発ではたくさんのデータに対して同じ処理を行いたい時があるのですが、その時に繰り返し処理を利用することになります。 前回の条件分岐の制御文と併せてプログラミングの超重要ポイントの一...

初心者向けUnityC#入門講座に戻る>>


【Unity入門の森の最新ゲーム開発講座もお届け】

コメント

タイトルとURLをコピーしました