マルチシーン間のアクセスサンプル(その2)

2024年4月24日

ゲームを実行するMainSceneとUIをコントロールするUISceneを作ります
MainSceneからUISceneのオブジェクトへアクセスします

MainScene

GameController

ゲームスコア管理

スコアの計算と管理を担当します。ゲーム中にスコアを追加する機能を提供し、スコアの更新をログに出力します。

  • Startメソッド: ゲーム開始時にプレイヤーのスコアを0にリセットします。
  • AddScore メソッド: 与えられたスコアを現在のスコアに加算し、更新されたスコアをデバッグログに出力します。
using UnityEngine;

// スコア管理を担当するクラス
public class ScoreManager : MonoBehaviour
{
    // ゲーム共有データへの公開参照
    public GameSharedData sharedData;

    // コンポーネントが初めてアクティブになったときに呼び出される
    void Start()
    {
        // ゲーム開始時にプレイヤーのスコアを0にリセットする
        sharedData.playerScore = 0; // ゲーム開始時のスコアをリセット
    }

    // スコアを追加するメソッド
    public void AddScore(int scoreToAdd)
    {
        // 指定された点数を現在のスコアに加算
        sharedData.playerScore += scoreToAdd;
        // デバッグログに更新後のスコアを出力
        Debug.Log("Updated Score: " + sharedData.playerScore);
    }
}

UIScene

UIManager

リアルタイムスコア表示の実装

こちらもMonoBehaviourを継承しており、UIにスコアを表示する役割を持っています。TextMeshProUGUIコンポーネントを使用してスコアを表示します。

  • Updateメソッド: 毎フレーム、sharedDataからスコアを取得し、UIのテキストを更新します。
using UnityEngine;  // Unityエンジンの機能を利用するための名前空間
using TMPro;        // TextMeshProを利用するための名前空間

// MonoBehaviourを継承したDisplayScoreクラスの定義
public class DisplayScore : MonoBehaviour
{
    // GameSharedDataの参照を保持するパブリック変数
    public GameSharedData sharedData;
    // スコア表示用のTextMeshProUGUIコンポーネントの参照を保持するパブリック変数
    public TextMeshProUGUI scoreText;

    // Updateメソッドは毎フレーム呼び出される
    void Update()
    {
        // scoreTextのテキストを、"Score: "にsharedDataから取得したplayerScoreを文字列に変換して追加
        scoreText.text = "Score: " + sharedData.playerScore.ToString();
    }
}

データの共有保存の仕組み(スクリプタブルオブジェクト)

このスクリプト自体は、どこにもアタッチしません
あくまでテンプレートとして機能します

このGameSharedDataクラスを利用することで、例えばゲーム内でプレイヤーのスコアを保持し、異なるシーンやゲームオブジェクトにわたって簡単にアクセスしやすくなります。例として、プレイヤーが新しいレベルに進むたびにスコアをリセットする代わりに、ゲーム全体を通じてスコアを蓄積することができます。また、このスコアを使ってリーダーボードを更新したり、達成条件をチェックすることができます。

このスクリプトはScriptableObjectを継承しており、プレイヤーのスコアを保持するためのデータコンテナとして機能します。Unityエディタのメニューから直接生成できるようにCreateAssetMenu属性が付けられています。

  • 目的: ゲーム全体で共有されるデータ(この場合はプレイヤーのスコア)を管理します。
  • フィールド: playerScore はプレイヤーのスコアを整数型で保持します。
using UnityEngine;

// ScriptableObjectを継承し、Unityエディタのメニューから生成可能にする属性設定
[CreateAssetMenu(fileName = "GameSharedData", menuName = "ScriptableObjects/GameSharedData")]
public class GameSharedData : ScriptableObject
{
    // プレイヤーのスコアを公開変数として保持
    public int playerScore; // プレイヤーのスコアを表す整数型の公開フィールド
}
  • CreateAssetMenu 属性を使用して、Unityのエディター内でこのScriptableObjectを簡単に生成できるようにメニュー項目を追加します。
  • fileNameは新しく作成されるアセットのデフォルトのファイル名を指定します。
  • menuNameはエディタのメニュー内の表示場所を指定します。

共有データの作り方

次の手順でスクリプタブルオブジェクトのファイルを作成します
これを必要とするゲームオブジェクトにアタッチしてデータを共有することになります

Projectウィンドウで右クリックメニューを表示します

上記のスクリプトによって、メニューが追加されていますので、新しいファイルを作成します

ファイルができたら、データを必要とするアタッチされたスクリプトにアウトレット接続します

アウトレット接続の例

スクリプタブルオブジェクトはインスペクターで管理できます

Unity

Posted by hidepon