ScriptableObjectって何
ScriptableObjectはデータを一括管理に便利なものらしいです。
Unityに搭載されている機能でせっかくなので、使ってみました。
調べたところによると以下のようなメリットがあるそうです。
・カテゴライズされたデータ(食べ物とか、武器とか)のデータが一括管理できるからレベル調整が簡単
・ゲーム実行時にメモリを節約できる
・ゲーム実行中もパラメータの保存結果が保存される
ただ、使用上の注意として、基本的にゲーム進行中に変化するものには使えないそうです。
1. ScriptableObjectを作成する
早速やっていきます。
まず、このScriptableObjectを使うためにはそれを作るためのプログラムが必要なので、作っていきます。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
[Serializable]
public class DataBase
{
public string itemName;
public int atk;
public Sprite icon;
}
[CreateAssetMenu(fileName = "Sword", menuName = "SwordData", order = 1)]
public class SwordData : ScriptableObject
{
public List<DataBase> dataList;
}
スクリプト内のSerializableって何って方は以下の記事を参照してください。
いつも作成するスクリプトと違う点がいくつかあります。
まず、最初にclass名の前にCreateAssetMenuという記載を追加しています。
これは何かというとAssetフォルダ内で右クリックからオブジェクトを作成したり、スクリプトを作成したりすると思いますが、これを書くことでその中にScriptableObjectsを作成するメニューを追加することができます。
詳しくは以下のUnity リファレンスを参照ください。
https://docs.unity3d.com/ja/2018.4/ScriptReference/CreateAssetMenuAttribute.html

もう一つ違う点としては、public class SwordData: ScriptableObject
通常Monobehaviorを継承していますが、ScriptableObjectを継承する必要があります。
それでは実際にオブジェクトを作成して、アイテムデータを作成していきます。
作成したScriptableObjectメニューからオブジェクトを作成します。

変数部分にアイテムデータを入力します。

2. 作成したScriptableObjectのデータを使う
前準備:シーン上にテキストとボタンを配置しました


ゲームスタート時にインベントリ内のデータをとってくるような処理を作りたいと思います。
GameManagerという名のオブジェクトをゲームシーン内に作成します。

つづいて、スタート時にデータを取得するスクリプトを作成
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class GameManager : MonoBehaviour
{
public SwordData swordData;
public Text itemName;
public Text atk;
public Button itemBtn;
private Sprite btnImage;
private void Start()
{
itemName.text = swordData.dataList[0].itemName;
atk.text = swordData.dataList[0].atk.ToString();
GetBtnIcon();
itemBtn.GetComponent<Image>().sprite = btnImage;
}
private void GetBtnIcon()
{
btnImage = swordData.dataList[0].icon;
}
}
オブジェクトをアタッチします。

ScriptableObjectのデータを読み出すことができました。

コメント