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」をドラッグ&ドロップすることを忘れないでくださいね。
とりあえず、基本的な使い方は大丈夫そうですね✨
応用させれば本当に色々なことができるので、これからも活用していきましょう。
お名前