0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ゲーム制作のための 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つあります。

  1. switch: 分岐の基準となる変数や値を指定します。
  2. break: 処理を終了し、switchブロックから抜け出します。C#では原則として必須であり、書き忘れるとコンパイルエラーになります。
  3. 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 ブロックの終わりに breakreturnthrowgoto などの終端文がないとコンパイルエラーになります。そのため、基本的には各処理の終わりに break; を書く、と覚えておくと分かりやすいです。
  • default によるフェイルセーフ(安全対策)
    もし playerState3-1 など、想定していない数値が代入されてしまった場合、プログラムが停止したりバグの温床になったりします。default を用意しておくことで、「想定外の値が来た場合の予備の処理(エラーログを出す、初期状態に戻すなど)」を行うことができ、堅牢なプログラムになります。

 上記のコードを実際にUnityのプロジェクトに貼り付けて、playerState の値を変えてみると、どのようなログが出るか確認してみましょう。これにより、switch 文の挙動を体感的に理解できます。また、case の値を追加して動きを試してみるのもおすすめです。さらに、playerState3-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 文よりも casebreak を省略でき、非常にスッキリと記述できるのが特徴です。


まとめ

この記事では、C#における switch 構文の基礎と、実戦的な使い方について解説しました。

  • 基本の3要素: switch, case, break (そして安全のための default) をセットで覚えることが重要です。
  • 柔軟な型利用: int だけでなく、stringchar など、用途に合わせて様々な型をキーにできます。
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?