ゲーム制作のための switch を学ぶ
はじめに
switch は「値に応じて処理を振り分ける」ための構文です。ゲーム開発ではキャラクターの状態(待機・走行・ジャンプなど)を分岐する場面でよく使われます。この記事では基本的な使い方に加え、制作でよく遭遇する落とし穴とその回避方法まで解説します。
- switch を使うと、複数の条件分岐を見通しよく書ける
- ただし,switch は設計問題の可能性があるので、適切な場面で使うことが重要
if-elseを使った場合
if(i == 0)
{
// 待機
}
else if(i == 1)
{
// 走る
}
else if(i == 2)
{
// ジャンプ
}
else
{
// その他
}
switchを使った場合
switch(i)
{
case 0:
// 待機
break;
case 1:
// 走る
break;
case 2:
// ジャンプ
break;
default:
// その他
break;
}
この記事の目標
- switch を使って状態ごとに処理を分けられるようになる
- case / default / break の意味と挙動を理解する
- フォールスルーなどの落とし穴を回避できる
switch文の基本構文
まずは switch の基本的な書き方を学びましょう。
switch 文は、判定したい「値」を一つ決め、その値が「どのケース(case)に当てはまるか」を探して処理を実行します。
基本の形は以下のようになります。
switch (/*判定する値や変数*/)
{
case /*値1*/:
// 値1と一致した時の処理
break;
case /*値2*/:
// 値2と一致した時の処理
break;
default:
// どのcaseにも一致しなかった時の処理
break;
}
ここで絶対に覚えておくべき重要なキーワードが3つあります。
-
switch: 分岐の基準となる変数や値を指定します。 -
break: 処理を終了し、switchブロックから抜け出します。C#では原則として必須であり、書き忘れるとコンパイルエラーになります。 -
default: どのcaseの値にも当てはまらなかった場合に実行される処理です。if-else文におけるelseに相当します。
実装例:整数を使った状態分岐
それでは、実際のゲーム開発を想定して、キャラクターの状態を整数(int型)で管理し、switch で処理を振り分けるコードを書いてみましょう。
今回は enum(列挙型)を使用せず、直接「数値」を使って判定を行います。
using UnityEngine; // Unity環境での動作を想定
public class PlayerController : MonoBehaviour
{
// 0: 待機, 1: 走る, 2: ジャンプ
public int playerState = 0;
void Update()
{
// playerStateの値に応じて処理を分岐する
switch (playerState)
{
case 0:
Debug.Log("プレイヤーは待機しています。");
// ここに待機アニメーションの再生処理などを書く
break;
case 1:
Debug.Log("プレイヤーは走っています!");
// ここに移動スピードの計算処理などを書く
break;
case 2:
Debug.Log("プレイヤーはジャンプ中!");
// ここにジャンプ力の加算処理などを書く
break;
default:
Debug.LogWarning("未知の状態です。エラー処理を行います。");
// 予期せぬ値が入ったときの安全対策(待機状態に戻すなど)
playerState = 0;
break;
}
}
}
コードのポイントと注意点
-
breakによるフォールスルー防止
他のプログラミング言語(C++など)では、breakを書き忘れるとそのまま下のcaseの処理まで実行されてしまう「フォールスルー」という動きがあります。C#では、caseブロックの終わりにbreakやreturn、throw、gotoなどの終端文がないとコンパイルエラーになります。そのため、基本的には各処理の終わりにbreak;を書く、と覚えておくと分かりやすいです。 -
defaultによるフェイルセーフ(安全対策)
もしplayerStateに3や-1など、想定していない数値が代入されてしまった場合、プログラムが停止したりバグの温床になったりします。defaultを用意しておくことで、「想定外の値が来た場合の予備の処理(エラーログを出す、初期状態に戻すなど)」を行うことができ、堅牢なプログラムになります。
上記のコードを実際にUnityのプロジェクトに貼り付けて、playerState の値を変えてみると、どのようなログが出るか確認してみましょう。これにより、switch 文の挙動を体感的に理解できます。また、case の値を追加して動きを試してみるのもおすすめです。さらに、playerState に 3 や -1 などの想定外の値を代入すると、default が実行されてエラーログが出ることも確認できます。
switch文で使える型
先ほどの例では整数(int)を使いましたが、C#の switch 文は数値以外にも様々な型を判定に使うことができます。
-
整数型 (
int,long,byteなど) -
列挙型 (
enum) -
文字列 (
string)
などを判定に使うことができます。
特にゲーム開発では、アイテム名やタグ名を string で判定したり、キー入力された文字(char)で分岐させたりする場面も非常に多いです。
文字列を使った実装例
string weaponType = "Sword";
switch (weaponType)
{
case "Sword":
Debug.Log("近接攻撃を行います。");
break;
case "Bow":
Debug.Log("遠距離攻撃を行います。");
break;
default:
Debug.Log("素手で攻撃します。");
break;
}
演習:アイテムの説明文を取得しよう
switch 文の応用として、よくある「特定の入力に対して、対応する値を1つ返す」という処理に挑戦してみましょう。
課題
以下の条件を満たす、アイテム名を受け取ってその説明文(文字列)を返すメソッドを完成させてください。
-
入力:
"Potion"→ 戻り値:"HPを回復する薬" -
入力:
"Ether"→ 戻り値:"MPを回復する薬" -
入力: それ以外 → 戻り値:
"不明なアイテム"
実装例
string GetItemDescription(string itemName)
{
switch (itemName)
{
case "Potion":
return "HPを回復する薬";
case "Ether":
return "MPを回復する薬";
default:
return "不明なアイテム";
}
}
発展:switch式へのステップアップ(クリックして展開)
C# 8.0以降では、値を返すだけの単純な switch 文をより簡潔に書く 「switch式」 という書き方が導入されました。
まずは通常の switch 文で書いてみて、慣れてきたら以下の「switch式」の形に書き換えてみましょう。
// switch式の書き方のイメージ
string description = itemName switch
{
"Potion" => "HPを回復する薬",
"Ether" => "MPを回復する薬",
_ => "不明なアイテム" // _ は default と同じ意味
};
通常の switch 文よりも case や break を省略でき、非常にスッキリと記述できるのが特徴です。
まとめ
この記事では、C#における switch 構文の基礎と、実戦的な使い方について解説しました。
-
基本の3要素:
switch,case,break(そして安全のためのdefault) をセットで覚えることが重要です。 -
柔軟な型利用:
intだけでなく、stringやcharなど、用途に合わせて様々な型をキーにできます。