コガネブログ

平日更新を目標に Unity や C#、Visual Studio、ReSharper などのゲーム開発アレコレを書いていきます

【Unity】シーン遷移時に簡単にデータを渡すことができるパッケージ「Unity Scene Data Transfer」を GitHub に公開しました

はじめに

シーン遷移時に簡単にデータを渡すことができるパッケージ
「Unity Scene Data Transfer」を GitHub に公開しました

インストール

"com.baba_s.unity-scene-data-transfer": "https://github.com/baba-s/unity-scene-data-transfer.git",

manifest.json に上記の記述を追加します

使い方

シーンの名前とシーンを制御するコンポーネントの名前は同じにしておきます

public class ResultData
{
    public int Score;
    public int Rank;
}

まず、シーンに渡したいデータを管理するクラスを定義して、

using UnityEngine;

public class ResultScene : MonoBehaviour
{

シーンを制御する MonoBehaviour のコンポーネントを

using KoganeUnityLib;
using UnityEngine;

public class ResultScene : SimpleSceneBase<ResultScene, ResultData>
{

SimpleSceneBase を継承するように変更します

  • using KoganeUnityLib; を追加する必要があります
  • SimpleSceneBase の型パラメータには、シーンのクラスとデータのクラスを指定します
using KoganeUnityLib;
using UnityEngine;

public class ResultScene : SimpleSceneBase<ResultScene, ResultData>
{
    private void Start()
    {
        Debug.Log( entryData.Score );
        Debug.Log( entryData.Rank );
    }

すると、entryData プロパティを使用して、
他のシーンから渡されたデータを参照できるようになります

var data = new ResultData
{
    Score = 5000,
    Rank  = 3,
};
ResultScene.Load( data );

あとは、他のシーンで上記のようなコードを記述することで、
データを渡しながらシーン遷移できます

補足

Awake や OnEnable では entryData を使用できない

public class ResultScene : SimpleSceneBase<ResultScene, ResultData>
{
    // ダメ
    private void Awake()
    {
        Debug.Log( entryData.Score );
        Debug.Log( entryData.Rank );
    }
    
    // ダメ
    private void OnEnable()
    {
        Debug.Log( entryData.Score );
        Debug.Log( entryData.Rank );
    }
  • Awake や OnEnable で entryData プロパティを参照しても正常な値を取得できません
  • entryData プロパティは Start 以降で正しく参照することができます

シーンを直接起動した時に entryData を使用する方法

シーンを直接起動した時は entryData は null になっています

public class ResultScene : SimpleSceneBase<ResultScene, ResultData>
{
    private void Start()
    {
        var data = entryData ?? new ResultData();

        Debug.Log( data.Score );
        Debug.Log( data.Rank );
    }

そのため、上記のようなコードを記述することで、
シーンを直接起動した時は初期値を使用する、といったことができるようになります

using System;

[Serializable]
public class ResultData
{
    public int Score;
    public int Rank;
}

もしくは、シーンのデータを管理するクラスに Serializable 属性を適用することで

シーンを直接起動した時の entryData のパラメータを
Unity の Inspector で設定することができます