📚

【シナリオ制御】ifとswitchで分岐制御 ― Unityでシナリオ展開をスマートに実装する

2025/03/11に公開

閲覧いただきありがとうございます。はじめまして、ゲーム開発所RYURYUの「りゅうや」と申します。

❏ ゲーム開発ランキング【 1位 】実績多数 (ココナラ)
❏ ココナラ総販売【 220件超 】
❏ GC甲子園2022・東京ゲームショウ2023など出展経験あり

■ Unityを使ったゲーム・VRの受託開発についてのお問い合わせは、Xからお気軽にどうぞ。
https://x.com/RYURYU_GAME_MFG

■ 記事に関するご質問やご意見は、Discordサーバーまでお寄せください。
https://discord.gg/5FwuKCacNy

【シナリオ制御】ifとswitchで分岐制御 ― Unityでシナリオ展開をスマートに実装する

Unityでのシナリオシステムの実装において、分岐制御は欠かせない要素です。シナリオの進行に応じて適切な分岐を行うことで、プレイヤーに多様な体験を提供することが可能になります。本記事では、Unityにおける分岐制御の基本であるif文とswitch文を活用し、効率的かつスマートにシナリオを展開する方法を解説します。

Unityでの条件分岐の基本

条件分岐は、プログラミングにおける制御フローの基本です。Unityでは、if文とswitch文を使用してさまざまな条件に応じた処理を実装します。

if文の使い方

if文は、指定した条件が真の場合に処理を実行する基本的な分岐制御です。以下は、if文を使用した基本的な例です。

ScenarioControl.cs
using UnityEngine;

public class ScenarioControl : MonoBehaviour
{
    void Start()
    {
        int scenarioStage = 1;

        if (scenarioStage == 1)
        {
            Debug.Log("シナリオステージ1を開始します。");
        }
        else if (scenarioStage == 2)
        {
            Debug.Log("シナリオステージ2を開始します。");
        }
        else
        {
            Debug.Log("未知のシナリオステージです。");
        }
    }
}

switch文の活用

switch文は、複数の条件に応じた分岐を簡潔に記述できるため、複雑なシナリオ制御に適しています。

ScenarioControlSwitch.cs
using UnityEngine;

public class ScenarioControlSwitch : MonoBehaviour
{
    void Start()
    {
        int scenarioStage = 2;

        switch (scenarioStage)
        {
            case 1:
                Debug.Log("シナリオステージ1を開始します。");
                break;
            case 2:
                Debug.Log("シナリオステージ2を開始します。");
                break;
            default:
                Debug.Log("未知のシナリオステージです。");
                break;
        }
    }
}

分岐制御の選び方

シナリオの構造や複雑さに応じて、if文とswitch文のどちらを使用するか選択することが重要です。以下の表に、それぞれの特徴をまとめました。

条件分岐 メリット デメリット 使用例
if文 複雑な条件を表現可能 条件が多くなると冗長になる シナリオステージの細かな条件判定
switch文 条件が多い場合に見やすい 条件が単純でないと使いにくい シナリオの主要な分岐ポイント

Unityでのシナリオシステム実装の流れ

Unityでシナリオシステムを実装する際の基本的な流れを以下に示します。

  1. シナリオデータの構造化
    • シナリオのフローチャートを作成し、分岐点を明確にします。
  2. テキスト表示の実装
    • UnityのUI機能を使用して、シナリオテキストを表示します。
  3. 選択肢の実装
    • プレイヤーが選択できる選択肢をUIに配置し、選択に応じた分岐制御を行います。
  4. シーン管理と分岐処理
    • シナリオの進行に合わせて、適切なシーンやステージをロードします。
シナリオデータの構造化

シナリオの設計段階では、フローチャートを用いて各ステージの分岐点を明確にします。これにより、実装時に適切な分岐制御を行いやすくなります。

実践的なシナリオ分岐の実装例

以下に、プレイヤーの選択によって分岐するシナリオシステムの簡単な実装例を示します。

ステップ1: シナリオデータの準備

シナリオデータをJSON形式で保存し、各ステージと選択肢を定義します。

scenarioData.json
{
    "scenarios": [
        {
            "id": 1,
            "text": "あなたは森の中にいます。どちらに進みますか?",
            "options": [
                {
                    "optionText": "左の道",
                    "nextId": 2
                },
                {
                    "optionText": "右の道",
                    "nextId": 3
                }
            ]
        },
        {
            "id": 2,
            "text": "左の道を進むと小川に出ました。",
            "options": []
        },
        {
            "id": 3,
            "text": "右の道を進むと洞窟を見つけました。",
            "options": []
        }
    ]
}

ステップ2: シナリオ管理スクリプトの実装

シナリオデータを読み込み、if文とswitch文を用いて分岐を制御します。

ScenarioManager.cs
using UnityEngine;
using UnityEngine.UI;
using System.IO;
using System.Collections.Generic;

[System.Serializable]
public class Option
{
    public string optionText;
    public int nextId;
}

[System.Serializable]
public class Scenario
{
    public int id;
    public string text;
    public List<Option> options;
}

[System.Serializable]
public class ScenarioData
{
    public List<Scenario> scenarios;
}

public class ScenarioManager : MonoBehaviour
{
    public Text scenarioText;
    public GameObject optionsPanel;
    public Button optionButtonPrefab;

    private ScenarioData scenarioData;
    private Scenario currentScenario;

    void Start()
    {
        LoadScenarioData();
        DisplayScenario(1);
    }

    void LoadScenarioData()
    {
        string path = Path.Combine(Application.streamingAssetsPath, "scenarioData.json");
        string jsonString = File.ReadAllText(path);
        scenarioData = JsonUtility.FromJson<ScenarioData>(jsonString);
    }

    void DisplayScenario(int id)
    {
        currentScenario = scenarioData.scenarios.Find(s => s.id == id);
        scenarioText.text = currentScenario.text;

        // ボタンのリセット
        foreach (Transform child in optionsPanel.transform)
        {
            Destroy(child.gameObject);
        }

        // 選択肢の生成
        foreach (var option in currentScenario.options)
        {
            Button btn = Instantiate(optionButtonPrefab, optionsPanel.transform);
            btn.GetComponentInChildren<Text>().text = option.optionText;
            btn.onClick.AddListener(() => OnOptionSelected(option.nextId));
        }
    }

    void OnOptionSelected(int nextId)
    {
        switch (nextId)
        {
            case 2:
                DisplayScenario(2);
                break;
            case 3:
                DisplayScenario(3);
                break;
            default:
                Debug.Log("未知のシナリオIDです。");
                break;
        }
    }
}

注意点

シナリオ分岐設計のベストプラクティス

シナリオ分岐を効果的に設計するためのポイントを以下にまとめました。

  • 明確なフローチャートの作成
    • シナリオの進行と分岐点を視覚的に整理します。
  • 再利用可能なコードの構築
    • 分岐制御部分を汎用的に設計し、他のシナリオにも適用可能にします。
  • エラーハンドリングの実装
    • 無効なシナリオIDや不正な選択肢に対する対処を行います。

まとめ

Unityでのシナリオシステム実装において、if文とswitch文を効果的に活用することで、柔軟でスケーラブルな分岐制御を実現できます。シナリオの複雑さや要件に応じて適切な条件分岐を選択し、プレイヤーに多様な体験を提供しましょう。参考資料や実践的なコード例を活用し、スマートなシナリオ展開を実現してください。

シナリオ制御の効率的な実装は、ゲームの品質向上につながります。是非、この記事を参考に、自身のプロジェクトに役立ててください。

Unityをもっと極めたい"あなた"へ ― 今すぐスキルアップのチャンス!

1. どこでもUnity教室「無料プラン」

❏ 毎日の質問で即解決|Unityに関する疑問や悩みは、専用Discordでプロの仲間とシェア!

  • 月額0円 で、テキストで気軽に質問・進捗共有が可能
  • 実績多数のコミュニティで、参加するだけで具体的な課題解決のヒントが手に入る

まずは無料で参加して、あなたのUnity学習を加速させましょう! 無料でDiscordに参加する]
https://discord.gg/5FwuKCacNy

2. Unity超入門書【1,000円】

Unityスキルを5日間でマスター|「実践×即戦力」を手に入れる!

  • 130,000文字超の詳細な解説と実例で、初心者でもすぐにUnityの基礎が身につく
  • 実際の成果例:5日間でシンプルな3D FPSゲームを完成
  • 専属講師サポートのオプション付きで、疑問を即解消しながら学習を進められる

まずはこの教材でUnity開発の第一歩を体験してください! 教材を今すぐ購入する
https://zenn.dev/ryuryu_game/books/fd28de9d8e963a/viewer/0570af

3. Unity超入門完全支援プラン【単発24,800円】

Unityの全てをプロがバックアップ|教材で学んだ内容を実践サポート!

  • 専属講師による24時間テキスト質問サポート(毎日17:00~21:00の回答)
  • 月2回×60分 または 月1回×120分のビデオチャットで、学習進捗やプロジェクトの具体的な課題を徹底サポート
  • 教材と連携し、実践の現場での疑問や課題をそのまま解決!
  • 限定:1度に最大10名様のみ受付!早期申込で安心のサポート体制を

教材で学んだ知識をさらに深め、実践に活かすならこのプランがおすすめです! 今すぐ詳細を確認する
https://ryuryu.memberpay.jp/service/item/yjo1sst

4. Unityプロジェクト完全支援プラン【月額48,000円】

Unityプロジェクトを本格サポート|個人の趣味からプロの現場まで幅広く対応!

  • 専属講師による24時間テキスト質問サポート(毎日17:00~21:00の回答)
  • 月2回×60分のビデオチャットで、プロジェクトの進行状況を細かくサポート
  • Unity開発の一部を代行するサービスが常に20%割引で利用可能
  • 基本操作からエラー対応、プロジェクト設計のアドバイスまで幅広くサポート
  • 専用Discordサーバーでのサポート体制(ご購入後に招待リンクを送付)

個人プロジェクトを着実に進め、より高い成果を求めるあなたに最適なプランです! 今すぐプロジェクト支援プランを確認する
https://ryuryu.memberpay.jp/plan/item/epeiywt

※ Unity超入門書で学んだ内容を、さらに深く実践に活かしたい方は、完全支援プランとプロジェクト支援プランの併用がおすすめです!

Discussion