Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
学ぶ メインメニューを作成 | Unityアニメーションシステム
Unityでの格闘ゲーム

メインメニューを作成

メニューを表示するにはスワイプしてください

メインメニュー

メインメニュー用スクリプト

using UnityEngine;
using UnityEngine.SceneManagement;

public class MainUI : MonoBehaviour
{
    public void StatTheGame()
    {
        SceneManager.LoadScene(1);
    }

    public void Quit()
    {
        Application.Quit();
    }
}

MainUI クラスは、ゲームの開始とアプリケーションの終了機能を提供するシンプルなスクリプト。Unity の UI ボタンと組み合わせて使用することを想定。

クラス定義とメソッド

StatTheGame メソッドは、新しいシーンをロードすることでゲームを開始するためのもの。特に、SceneManager.LoadScene(1) は Build Settings でインデックス 1 のシーンをロードする。

Quit メソッドは Application.Quit() を呼び出すことでアプリケーションを終了できるが、この機能はビルドされたアプリケーションでのみ有効で、Unity エディタ内では動作しない。

Unityでの使用方法

スクリプトのアタッチ

GameObject(例:空のGameObjectやUI要素)を作成。 MainUIスクリプトをGameObjectにドラッグ&ドロップするか、インスペクターのAdd Componentボタンを使用してアタッチ。

UIボタンの設定

UIボタン(例:GameObject > UI > Button)を作成。 ボタンを選択し、インスペクターに移動。 On Click ()セクションで+ボタンをクリックして新しいイベントを追加。 MainUIスクリプトがアタッチされたGameObjectをオブジェクトフィールドにドラッグ。 ドロップダウンからMainUI > functionNameを選択。

ゲームマネージャー

ゲームマネージャー用スクリプト

public class GameManager : MonoBehaviour
{
    public GameStates GameState { private set; get; }
    public static event System.Action<GameStates> onGameStateChanges;
    public static GameManager instance;

    void Awake()
    {
        if (instance != null)
        {
            Destroy(gameObject);
            return;
        }
        instance = this;
        DontDestroyOnLoad(gameObject);
    }

    void Start()
    {
        GameState = GameStates.Playing;
        onGameStateChanges?.Invoke(GameState);
    }

    public void FinishGame()
    {
        GameState = GameStates.Finished;
        onGameStateChanges?.Invoke(GameState);
    }
}

public enum GameStates
{
    Playing,
    Finished,
}

GameManagerクラスはゲームの状態管理を担当。シングルトンパターンを用いてゲーム内にGameManagerのインスタンスが一つだけ存在するようにし、ゲーム状態の管理や、イベントを使った状態変更の通知を行う。

クラス定義とメンバー変数

メソッド

Awake メソッド

void Awake()
{
    if (instance != null)
    {
        Destroy(gameObject);
        return;
    }
    instance = this;
    DontDestroyOnLoad(gameObject);
}

目的: GameManager のインスタンスが一つだけ存在することを保証し、新しいシーンを読み込む際に破棄されないようにします。

シングルトンパターン: 既にインスタンスが存在するかを確認し、存在する場合は重複を破棄します。存在しない場合はインスタンスを割り当て、シーンの読み込み時にオブジェクトが破棄されないように設定します。

Start メソッド

void Start()
{
    GameState = GameStates.Playing;
    onGameStateChanges?.Invoke(GameState);
}

目的: ゲーム開始時にゲーム状態を Playing に初期化し、onGameStateChanges イベントを発火させます。

FinishGame メソッド

public void FinishGame()
{
    GameState = GameStates.Finished;
    onGameStateChanges?.Invoke(GameState);
}

目的: ゲームの状態を Finished に設定し、onGameStateChanges イベントを発火させる。

GameStates 列挙型

public enum GameStates
{
    Playing,
    Finished,
}

目的: ゲームの可能な状態を定義する。

敵キャラクターのゲーム状態変化への反応

private void GameManager_onGameStateChanges(GameStates state)
{
    if (state == GameStates.Finished)
    {
        stateManager.ChangeState(idle);
    }
}

このメソッドはゲーム状態の変化を処理する。ゲーム状態が Finished に変わると、敵キャラクターの状態が idle に変更される。

フィニッシュパネル

フィニッシュパネルのスクリプト

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using TMPro;
using UnityEngine.SceneManagement;

public class FinishPanel : MonoBehaviour
{
    [SerializeField] Player player;
    [SerializeField] GameObject panel;
    [SerializeField] TMP_Text infoText;

    private void Start()
    {
        GameManager.onGameStateChanges += GameManager_onGameStateChanges;
    }

    private void GameManager_onGameStateChanges(GameStates obj)
    {
        if (obj == GameStates.Finished)
        {
            panel.SetActive(true);
            OnGameFinished();
        }
    }

    void OnGameFinished()
    {
        if (player.isDead)
        {
            infoText.text = "You lost";
            infoText.color = Color.red;
        }
        else
        {
            infoText.text = "You Won";
            infoText.color = Color.green;
        }
    }

    public void BackToMainMenu()
    {
        SceneManager.LoadScene(0);
    }

    public void Quit()
    {
        Application.Quit();
    }
}

FinishPanel クラスは、ゲーム終了時に表示されるフィニッシュパネルの表示と機能を管理します。このパネルは、プレイヤーが勝利したか敗北したかのフィードバックを提供し、メインメニューに戻るかゲームを終了するオプションを表示します。

解説

メソッド

Start メソッド

private void Start()
{
    GameManager.onGameStateChanges += GameManager_onGameStateChanges;
}

目的: ゲーム状態の変化を監視するために GameManager.onGameStateChanges イベントに購読する。

GameManager_onGameStateChanges メソッド

private void GameManager_onGameStateChanges(GameStates obj)
{
    if (obj == GameStates.Finished)
    {
        panel.SetActive(true);
        OnGameFinished();
    }
}

目的: ゲーム状態の変化を処理する。ゲーム状態が Finished の場合、終了パネルをアクティブにし、OnGameFinished を呼び出す。

OnGameFinished メソッド

void OnGameFinished()
{
    if (player.isDead)
    {
        infoText.text = "You lost";
        infoText.color = Color.red;
    }
    else
    {
        infoText.text = "You Won";
        infoText.color = Color.green;
    }
}

目的: プレイヤーが死亡しているかどうかに応じて、終了パネルのテキストを更新する。

ロジック: プレイヤーが死亡している場合、テキストを赤色で「You lost」に設定する。プレイヤーが生存している場合、テキストを緑色で「You Won」に設定する。

BackToMainMenu メソッド

public void BackToMainMenu()
{
    SceneManager.LoadScene(0);
}

目的:呼び出された際にメインメニューシーン(ビルドインデックス 0)を読み込む。UI のボタンに紐付けることを想定。

Quit メソッド

public void Quit()
{
    Application.Quit();
}

目的:呼び出された際にアプリケーションを終了する。UI のボタンに紐付けることを想定。

まとめ

FinishPanel クラスは、ゲーム終了時の結果を表示し、メインメニューへの戻るオプションや終了オプションを提供する。GameManager.onGameStateChanges にサブスクライブし、ゲーム終了時に適切に更新されることで、明確なフィードバックと直感的な選択肢によってユーザー体験を向上させる。

1. FinishGame クラスで GameManager メソッドが呼び出されるとどうなりますか?

2. GameManager がゲーム状態を GameStates.Finished に変更するとどうなりますか?

question mark

FinishGame クラスで GameManager メソッドが呼び出されるとどうなりますか?

正しい答えを選んでください

question mark

GameManager がゲーム状態を GameStates.Finished に変更するとどうなりますか?

正しい答えを選んでください

すべて明確でしたか?

どのように改善できますか?

フィードバックありがとうございます!

セクション 1.  23

AIに質問する

expand

AIに質問する

ChatGPT

何でも質問するか、提案された質問の1つを試してチャットを始めてください

セクション 1.  23
some-alt