ScriptableObjectは、ゲームデータを簡単に管理でき、エディタ上で操作するのに非常に便利です。
まず、保存するゲームデータの構造をScriptableObjectで定義します。
using UnityEngine;
[CreateAssetMenu(fileName = "GameData", menuName = "Game Data", order = 1)]
public class GameData : ScriptableObject
{
public int playerLevel;
public float health;
public string[] inventoryItems;
}
ScriptableObjectのインスタンスを作成し、エディタ上でデータを操作するためのスクリプトを作成します。
CreateAsset: エディタメニューから新しいGameDataオブジェクトを作成できるようにします。
using UnityEditor;
using UnityEngine;
public class GameDataAsset
{
[MenuItem("Assets/Create/Game Data")]
public static void CreateAsset()
{
GameData asset = ScriptableObject.CreateInstance<GameData>();
AssetDatabase.CreateAsset(asset, "Assets/GameData.asset");
AssetDatabase.SaveAssets();
EditorUtility.FocusProjectWindow();
Selection.activeObject = asset;
}
}
ゲームデータを読み込み、操作し、保存するためのクラスです。
gameData: InspectorでGameDataのインスタンスをアタッチして使用します
using UnityEngine;
public class GameController : MonoBehaviour
{
public GameData gameData;
private void Start()
{
// 現在のゲームデータを表示
Debug.Log("Player Level: " + gameData.playerLevel);
Debug.Log("Health: " + gameData.health);
Debug.Log("Inventory Items: " + string.Join(", ", gameData.inventoryItems));
// ゲームデータの変更
gameData.playerLevel++;
gameData.health -= 10.0f;
Array.Resize(ref gameData.inventoryItems, gameData.inventoryItems.Length + 1);
gameData.inventoryItems[gameData.inventoryItems.Length - 1] = "Sword";
// 変更後のゲームデータを表示
Debug.Log("Updated Player Level: " + gameData.playerLevel);
Debug.Log("Updated Health: " + gameData.health);
Debug.Log("Updated Inventory Items: " + string.Join(", ", gameData.inventoryItems));
}
}