Unity解説 ScriptableObjectによるパラメータ管理
ゲームのプレイヤーのパラメータとかを操作・管理したいんだけど、何か良いのある?

それならば、「ScriptableObject」を使うのがおススメです。
「ScriptableObject」とは、共有データを使いやすく管理できる仕組みを作れるクラスです。
また、メモリの使用効率が良くデータ管理ができるということも「ScriptableObject」の大きな特徴ですね。
【参考】
何かすぐにイメージは湧かないけど、、とりあえずのデータ管理には、それを使っておけば良さそうなかんじだね💨

はい✨
実際には、csvやjsonを使ったりなどの他の方法もありますが、、、
それらの方法と比べても「ScriptableObject」には色々なメリットがあり、使い方を知っておいて損はありません。
さて、「ScriptableObject」を使ってデータ管理をするためには、最低3つのものが必要になります。
①データアセットを作るスクリプト、②データアセット、③データアセットを活用するためのスクリプトの三つです。
まず、①データアセットを作るスクリプトを作ってみます。
using UnityEngine;
[CreateAssetMenu(fileName = "PlayerData",
menuName = "ScriptableObjects/CreatePlayerParam")]
public class PlayerParam : ScriptableObject
{
public string PlayerName;
public int PlayerHP;
public int PlayerSP;
public int PlayerScore;
}
いつもの「MonoBehaviour」じゃなくて、「ScriptableObject」を継承するんだね。

はい、そのためスクリプト名とクラス名は、いつもみたいに揃えなくて良く、オブジェクトにアタッチする必要もありません。
このスクリプトを「Assets」内のどこかに配置するだけで機能をさせることができます。
「プロジェクトウィンドウ」を右クリックし、「Create」>「ScriptableObjects」>「CreatePlayerParam」を押すと、、、
「PlayerData」というアセットが作成されます。
☑ データアセットの作成

「PlayerData」のInspector欄に使いたいパラメータの入力を行います。
下のように入力した💨ちゃんとゲームのパラメータっぽいね✨


☑ パラメータの入力
ここまでが②でして、次は③データアセットを活用するためのスクリプトを作ってみます。
まずは、「PlayerData」に設定した「PlayerName」を画面に表示するスクリプトを作ってみます。
using UnityEngine;
public class ParamDisplay001 : MonoBehaviour
{
[SerializeField] private string PlayerName;
[SerializeField] private PlayerParam PlayerData001;
void OnGUI()
{
PlayerName = PlayerData001.PlayerName;
GUI.Label (new Rect (75, 100, 150, 50), PlayerName);
}
}
「PlayerData001」の宣言をしているところの「PlayerParam」は、前に作ったスクリプト「PlayerParamCreate.cs」のクラス名になります。
こちらのスクリプトは空のオブジェクトを作成して、そちらにアタッチします。
アタッチ後、空のオブジェクトのInspector欄に「Player Data 001」欄が現れますので、そちらに「PlayerData」をドラッグ&ドロップします。

それではゲームを実行してみましょう。

ちゃんと名前が表示されているね。

ええ✨
それでは次は他のパラメータを表示し、キーボードの「A」を押すと「PlayerScore」が増えるスクリプトを作ってみます。
using UnityEngine;
public class ParamDisplay005 : MonoBehaviour
{
[SerializeField] private string PlayerName;
[SerializeField] private int PlayerHP;
[SerializeField] private int PlayerSP;
[SerializeField] private int PlayerScore;
[SerializeField] private PlayerParam PlayerData001;
void Start()
{
PlayerName = PlayerData001.PlayerName;
PlayerHP = PlayerData001.PlayerHP;
PlayerSP = PlayerData001.PlayerSP;
PlayerScore = PlayerData001.PlayerScore;
}
void Update()
{
if (Input.GetKeyDown(KeyCode.A))
{
PlayerScore += 1;
}
}
void OnGUI()
{
GUI.Label (new Rect (25, 50, 150, 50), PlayerName);
GUI.Label (new Rect (25, 70, 150, 50), PlayerHP.ToString());
GUI.Label (new Rect (25, 90, 150, 50), PlayerSP.ToString());
GUI.Label (new Rect (25, 110, 150, 50), PlayerScore.ToString());
}
}
では、ゲームを実行しましょう。
前のスクリプト「ParamDisplay001.cs」をリムーブすることと「PlayerData」をドラッグ&ドロップすることを忘れないでくださいね。


とりあえず、基本的な使い方は大丈夫そうですね✨
応用させれば本当に色々なことができるので、これからも活用していきましょう。
お名前




