Movatterモバイル変換


[0]ホーム

URL:


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

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


Unity入門の森オリジナル本格ゲーム制作講座はこちら
11種類の本格ゲームの全ソースコード公開・画像&動画による解説付き

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

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

前回の記事:

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

【Line登録者限定のプレゼントもあるよ!】

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

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

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

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

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

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

if文とは

if文についての画像

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

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

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

if文の書き方

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

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

if文の書き方
C#
1
2
3
4
5
6
7
8
9
10
inta=0;
if(2<4){// <- 条件式 2が4より小さい時はtrueになる。
//条件式がtrueの時に実行される処理
  a=100;
}
 
intb=-1;
if(a==0){
  b*=-1;
}

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

処理が1分の時は鉤括弧を省略することができる
C#
1
2
3
4
inta=0;
intb=0;
// 鉤括弧を省略したもの
if(a==0)b=100;

if else文の書き方

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

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

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

if else文の書き方
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
inta;
if(2<4){// <- 条件式 2が4より小さい時はtrueになる。
//条件式がtrueの時に実行される処理
  a=100;
}else{
//条件式がfalseの時に実行される処理
  a=0
}
 
intb=-1;
if(a==0){//aの値が0かどうかで処理を分岐させる
// a == 0の時に実行される処理
  b*=-1;
}else{
// a != 0の時に実行される処理
  b*=2;
}

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

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

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

2つ以上のif文をつなげた時の書き方
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
inta=0;
intb=0;
if(a==0){// <- 条件式1
  // a == 0の時に実行される処理
  b=100;
}elseif(a==1){// <- 条件式2
// a == 1の時に実行される処理
  b=200;
}elseif(a==2){// <- 条件式3
// a == 2の時に実行される処理
  b=300;
}else{
// どの条件式にも当てはまらない時に実行される処理
  b=-1;
}

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

if文の後にif文を書くと別の分岐とみなされる
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
inta=0;
// 一応このように書くことができるが、別々の分岐処理とみなされる。
if(a==0){
  // ...
}if(a==1){
  // ...
}
 
//上のコードは次のものと同じ
if(a==0){
  // ...
}
if(a==1){
  // ...
}

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

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

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

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

ネストしたif文の書き方
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
inta=0;
intb=0;
intc=0;
if(a==0){
  //他のif文の中にもif文を書くことができる。
  // この場合は、if(a == 0 && b == 0)と書いた時と似た意味合いになるが、
  // ネストした場合はaの判定をした後に追加で処理を書くことができるのが異なる。
  if(b==0){
    c=2;
  }else{
    c=-2;
  }
}

? 演算子 

?演算子についての画像

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

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

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

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

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

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

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

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

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

?演算子の書き方
C#
1
2
3
4
5
6
7
8
inta=0;
//?演算子
intb=a>0?100:-100;
 
//入れ子になった?演算子
intc=a>0
  ?100
  :b>0?200:-200;

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#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
inta=0;
intb;
//switch文の書き方
switch(a){
case0:b=1;break;
case1:b=100;break;
default:b=-1;break;
}
 
//if文で書くと次のようなものになる
if(a==0){
  b=1;
}elseif(a==1){
  b=100;
}else{
  b=-1;
}

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になるよう設定しています。

条件分岐で値を検証してみよう!その1if文
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
usingUnityEngine;
 
publicclassSample:MonoBehaviour
{
  publicintValue;
  publicColorColor;
  publicMeshRendererMesh
  voidOnValidate(){
    if(Value==1){// Valueが1の時Colorを白色に設定する
      Color=Color.white;
    }
    if(Mesh!=null){
      Mesh.sharedMaterial.color=Color;
    }
  }
}

Unityでのif else文の使い方

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

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

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

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

条件分岐で値を検証してみよう!
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
usingUnityEngine;
 
publicclassSample:MonoBehaviour
{
  publicintValue;
  publicColorColor;
 
  voidOnValidate(){
    if(Value==1){
      Color=Color.white;
    }elseif(Value==2){
      Color=Color.blue;
    }elseif(Value==3){
      Color=Color.red;
    }elseif(Value==4){
      Color=Color.green;
    }else{
      Color=Color.black;
    }
    if(Mesh!=null){
      Mesh.sharedMaterial.color=Color;
    }
  }
}

Unityでのswitch文の使い方

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

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

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

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

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

条件分岐で値を検証してみよう!
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
usingUnityEngine;
 
publicclassSample:MonoBehaviour
{
  publicintValue;
  publicColorColor;
 
  voidOnValidate(){
    switch(Value){
    case1:Color=Color.white;break;
    case2:Color=Color.blue;break;
    case3:Color=Color.red;break;
    case4:Color=Color.green;break;
    default:Color=Color.black;break;
    }
    if(Mesh!=null){Mesh.sharedMaterial.color=Color;}
  }
}

ネストした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文
今回の記事では繰り返し処理についてみていきます。アプリ開発ではたくさんのデータに対して同じ処理を行いたい時があるのですが、その時に繰り返し処理を利用することになります。前回の条件分岐の制御文と併せてプログラミングの超重要ポイントの一つです。...
feynman.co.jp
2021.09.11

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



Unity入門の森オリジナル本格ゲーム制作講座はこちら
11種類の本格ゲームの全ソースコード公開・画像&動画による解説付き

関連記事

Unity C#入門講座

Unity C#の繰り返し処理の使い方 for文・while文・foreach文

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

UnityC#のLinq・属性・拡張メソッド・クラスの部分定義の使い方

今回の記事では拡張メソッド、Linq、属性、クラスの部分定義など開発にとても役立つC#の機能を説明します。前回のデリゲートとイベントはちょっと難易度が高かったですが、今回の記事はもう少し取り組みやすくなります。ぜひ読んでみてください。前回の...
2023.04.22
Unity C#入門講座
Unity C#入門講座

Unity C#での列挙型と定数の使い方

今回の記事では列挙型と定数について解説していきます。列挙型を使うとスクリプト上で定数をテキストとして表現でき、より読みやすく設定しやすいコードを書くことができます。前回の記事:列挙型(enum)とは列挙型は値型になり、System.Enum...
2021.09.11
Unity C#入門講座
Unity C#入門講座

Unity C# 変数と型の使い方 宣言や代入・型変換について

前回はコンパイルエラーとその対処法について解説しました。前回の記事:今回の記事ではC#の文法についてみていきましょう!プログラミングにおいて最重要な変数と型についてしっかり解説しています。型については、初心者さんはいきなり全部を理解しようと...
2023.02.04
Unity C#入門講座
Unity C#入門講座

Unity C#スクリプトの構造 スクリプトの作成と実行方法

前回はUnityとC#について簡単に解説しました。前回の記事↓今回の記事ではいよいよ実際にUnity上ではじめてのプログラミングに挑戦です!Unity C#スクリプトを作成・実行していきましょう!C#スクリプトを作成してGameObject...
2023.02.02
Unity C#入門講座
Unity C#入門講座

UnityC#の例外処理の使い方 throw, try, catch, finally文について

今回の記事では例外処理について解説していきます。例外処理はアプリ実行時に予想していない自体が発生した時に使用するC#の機能になります。例外処理をマスターしてばっちりエラーハンドリングしていきましょう。前回の記事:例外処理とは例外処理とはアプ...
2023.04.23
Unity C#入門講座

コメント

コメントをどうぞコメントをキャンセル

メールアドレスが公開されることはありません。

CAPTCHA


↓知りたいことを検索してね

Unity入門の森 インディーゲームリリース!

魔女と召喚獣

 

Seeker of Darkness

 

呪術迷宮をリリース

unity入門の森 ゲームの作り方のyoutubeチャンネル

unity入門の森 ゲームの作り方
「unity入門の森 ゲームの作り方」のyoutubeチャンネル。unityを用いたゲームプログラミング、unityスクール、ゲームクリエイターになりたい方向けの情報を中心に発信。インディーゲームクリエイター・プロゲーマー・ゲーム実況者を目...
www.youtube.com

ブログランキング参加中(クリックして応援してくれると嬉しいな)

にほんブログ村 教育ブログ プログラミング教育へ
にほんブログ村

カテゴリー

最近の投稿

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

[8]ページ先頭

©2009-2025 Movatter.jp