ScriptableObjectとは
- 同じデータを何度もインスタンス化しないように同じインスタンスを参照する。
- インスペクター上でキャラクターとかのステータス変更を容易にする。
- データの構造を統一して、データの枠を作れる。
正直こんな言い方していいのかわからないけど、この3つの使い方、もしくはこれらを複合して使える。
本来の使い方はこんな感じ(なのかな?)
https://ekulabo.com/about-scriptable-object
ドラクエにスライムが9匹ぐらい出る戦闘がある。
このスライム1体ずつをインスタンス化するとその分メモリを食うので、参照先を同じにすることで食うメモリを減らせる。
これが9体だからいいけど、1000体とかに増えると同じところを参照したほうがいいよね。
ScriptableObjectの利点
ScriptableObjectにGameObjectやPrefabを入れれること。
https://qiita.com/toRisouP/items/1d0c8e3d8040cbb413fc
これでいちいちprefabから呼び出す必要がない。というか扱いやすい。
それでいて、同じオブジェクトでもステータスをインスペクター上変えられる。
例えば武器のデータを作るためにこんなScriptableObjectを作ってみる。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[CreateAssetMenu(menuName = "MyScriptable/Create WeaponData")]
//project上でWeaponDataを新規作成できるようにする
public class WeaponData : ScriptableObject {
public string weaponName;//武器の名前
public bool unlock;//武器の解放条件
public GameObject gameObject;//武器本体
public int level;//武器の強化情報
public int weaponCost;//武器強化にかかる値段に影響する1~4の4段階
public int WeaponUpgrage(int level) { //実装中の機能
int value = level * weaponCost * 100;
return (value);
}
}
するとこんな感じで、projectからScriptableObjectを作成できる。
新規作成するとこんな感じ。立方体に{}がついてるのがScriptableObjectの特徴
新規作成したオブジェクトはインスペクター上でいろいろ設定できる。
設定したデータが武器1つのデータとなる。
なんかこんな感じに、たくさん作ったら武器データをたくさん作れる。
ScriptableObjectのデメリット
データのサイズがとんでもなく大きくなるとエクセルとかで扱った方が便利になる。
たくさんの武器の攻撃力をソートするとか、カテゴリごとに処理するなど。
大量のデータ処理に関してはScriptableObjectは使いづらいのでは?
結論
あれ、これ普通のScriptでもいいんじゃない?って使い方をしている。
使いどころを間違えている気がしてならない、特に武器データに関しては。
ただ、武器データの構造の統一という面ではWeaponDataを作る意味がありそうだった。
参考文献
公式リファレンス
https://docs.unity3d.com/ja/540/Manual/class-ScriptableObject.html
わかりやすい入門記事
https://qiita.com/4_mio_11/items/a7d8967b853cef4385cd
公式の3つの使い方
https://unity.com/ja/how-to/architect-game-code-scriptable-objects