前回は、羊オブジェクトの生成・移動処理を作りました。
前回の記事↓
今回は羊オブジェクトのパラメータを管理するオブジェクトを作っていきます。
羊パラメータの作成 ScriptableObjectの使い方をマスターしよう
さて、ちょっとずつ画面がにぎやかになってきましたが、まだ羊が1種類しかいません。
クリッカーゲームはインフレが特徴なので、お金をためて、違う種類の羊を買っていけるようにしていきましょう。
この「違う種類の羊」を表すために、少なくとも色は変えられるようにしたいところです。
その他色々考えると
- 羊の色
- 初期値段
- 1頭追加するごとに上がる値段の額
- 何頭まで購入できるか
- 羊が持つ羊毛の量
が、生成する羊の初期設定で必要です。
これらの初期データを設定するために「ScriptableObject」というものを作成したいと思います。
ScriptableObjectの作成
ScriptableObjectというのは、普段よくSceneに配置しているGameObjectのPrefabから、位置情報など(Transform)を抜いて、データを保持することに特化したもの。(位置などが無いので、Sceneに直接置けないPrefab?)だと思ってもらうとちょっと理解しやすいです。
Scriptable Objectはインスペクター上で設定できるデータファイルなわけですね。
同じようなデータ構造が色々出てくるものを一括でまとめておけて、コードをいちいちいじらずにデータ編集できるので便利です。例えばRPGだったら敵モンスター、魔法やアイテムのデータなどをScriptable Objectでファイルとして保存できます。
実際に使ってみるのが一番理解しやすいものでもあるので、早速作っていきましょう。
Assets/Scriptsを右クリックして、「Create」→「C# Scirpt」でスクリプトを追加します。
スクリプトファイルは名前変更状態になっていますので、「SheepData」という名前に変更します。
では早速、SheepDataスクリプトを修正していきます。
まず、最初は以下のような状態になっていると思います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
using System.Collections; using System.Collections.Generic; using UnityEngine; public class SheepData : MonoBehaviour { // Start is called before the first frame update void Start() { } // Update is called once per frame void Update() { } } |
Unityでスクリプトを作ると、勝手にMonoBehaviourを継承した、GameObject用のスクリプトがテンプレートとして作られてしまいますが、今回は ScriptableObject を作りたいので、
SheepData : MonoBehaviour
は SheepData : ScriptableObject
に、
StartメソッドやUpdateメソッドも必要ないので消してしまいます。
1 2 3 4 5 6 7 8 |
using System.Collections; using System.Collections.Generic; using UnityEngine; public class SheepData : ScriptableObject { } |
そして先ほど挙げた、羊データに必要なものを全てメンバ変数で宣言していきましょう。
- 羊の色 → Color color;
- 初期値段 → int basePrice;
- 1頭追加するごとに上がる値段の額 → int extendPrice;
- 何頭まで購入できるか → int maxCount;
- 羊が持つ羊毛の量 → int woolCnt;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
using System.Collections; using System.Collections.Generic; using UnityEngine; public class SheepData : ScriptableObject { /// <summary> /// 羊の色 /// </summary> public Color color; /// <summary> /// 初期値段 /// </summary> public int basePrice; /// <summary> /// 値段上昇額 /// </summary> public int extendPrice; /// <summary> /// 購入上限数 /// </summary> public int maxCount; /// <summary> /// 羊毛の量 /// </summary> public int woolCnt; } |
(※ コメント(“//”の後ろ)は大変なら書かなくても良いです。 できれば書いた方が良いですが)
そして、ScriptableObjectはこの単体では意味が無く、このスクリプトをベースに「Asset(アセット:Projectに配置出来るファイル)を作る必要があるため、クラスの宣言のひとつ前に1行、メニューからAssetを作れるように属性(Attribute:アトリビュート)を追加します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
using System.Collections; using System.Collections.Generic; using UnityEngine; [CreateAssetMenu] public class SheepData : ScriptableObject { /// <summary> /// 羊の色 /// </summary> public Color color; /// <summary> /// 初期値段 /// </summary> public int basePrice; /// <summary> /// 値段上昇額 /// </summary> public int extendPrice; /// <summary> /// 購入上限数 /// </summary> public int maxCount; /// <summary> /// 羊毛の量 /// </summary> public int woolCnt; } |
さて、ではスクリプトを保存して、UnityEditorで実際にSheepDataのAsset(ファイル)を作っていきます。
まず、SheepDataを置くためのフォルダを作りましょう。
Assetsフォルダを右クリック→ Create → Folder で、「SheepDatas」フォルダを作りましょう。
(ついでに、スクリプトファイルがAssets直下に散らばっているようでしたら、Assets/Scriptsに移動させて、整理整頓しましょう。(私も忘れがちですが))
作ったAssets/SheepDatas フォルダで右クリックをし、Create→SheepData という追加されたメニュー項目を選択します(この右クリックメニューに追加するために[CreateAssetMenu] という属性(Attribute)を追加しました)
→
すると、このようにSheepDataのAsset(ファイル)が作られます。名前は Sheep1とでもしておきましょう。
Inspectorで各データがセット出来るので、以下のように設定します。
Color | 薄い灰色 |
Base Price | 10 |
Extend Price | 5 |
Max Count | 10 |
Wool Cnt | 5 |
気を付けたいのは、Color(色)は最初、透明度を示すアルファ値が0になっていて、まったく透明な状態になっている事です。しっかりと、アルファ値の値も設定(255で良いです)しましょう。
なお、色も全くの白ではなく、ちょっと灰色にしました。一番安い羊なので、ちょっと薄暗く(汚れた感じ?)にしてみたわけです。
とりあえず、羊の初期データが1つできました。では、次のちょっと高い羊のデータを用意します。
今作ったSheep1を選択して、CTRL+D(複製)します。
すると、Sheep2が作られましたね。
Sheep2はちょっと全体的に高くなります。色は何でもいいですが、パステルカラーの方がキレイなので、白に近い薄い色にしておきましょう。
Color | 薄いピンク |
Base Price | 100 |
Extend Price | 50 |
Max Count | 10 |
Wool Cnt | 40 |
これで、SheepDataがとりあえず2つ出来ました。最終的にはもっと増やしていきますが、とりあえずは以上でよいです。
では、SheepオブジェクトはこのSheepDataを受け取って、初期設定が出来るように直していきます。
Sheepスクリプト修正
では、Assets/Scripts/ に入っているSheepスクリプトを修正していきましょう。ダブルクリックしてIDEを開きます。
(見当たらない方は Assets/直下にあるかもしれません、小まめに整理整頓で移動していきましょう)
おさらいと次回予告
今回は羊オブジェクトのパラメータをScriptableObjectで作成しました。
次回は羊の購入処理を作っていきます。
次回の記事↓
コメント
最終的なスクリプトの68行目ですが、「 }」が
コメントに入っていますが、これは66行目の「{ 」と
ついになっていると思いますがあってますか?
合ってます!執筆時のミスですね汗
修正しておきました。
教えていただきありがとうございます^^
ScriptableObjectについてここ最近いろんなサイトで勉強中のものです。
ScriptableObjectを使うとメモリの節約になる。という文言が多くのサイトに記載されていたのですが、これは値をオブジェクトのプロパティに直接した場合メモリがその分食われるので、値をプロパティに書かずにScriptableObjectから値を取得してプロパティにセットする。という認識であっていますでしょうか?
xmlやjsonといった外部ファイルからデータの注入だったとしても、ScriptableObjectでデータ注入した場合とメモリ使用上に変わりはないと思うのですが、他サイトを調べていると「ScriptableObject=メモリ節約」といった書き方のサイトが多くて、xmlやjsonといった外部ファイルからデータの注入もScriptableObjectからのデータ注入もメモリ上は変わりはなく、色々と便利なScriptableObjectでやった方いいよーということなのでしょうか?
ScriptableObjectは用途も色々あってややこしいですよね汗
自分もUnity内部を作った人ではないので完全に理解できてるかはわからないですが、
ScriptableObjectについて改めて書籍・公式ドキュメント・他ブログなど含め色々調べてみました。
結論から言うと、その認識でほぼ合っていると思います。
メモリ節約の観点では
・ScriptableObjectはGameObjectではないためインスタンス化して使う際に余計なコンポーネントが付いてこない。
・データとして変更を加えなければ呼び出し先がいくつあっても参照機能により内部では一つのデータを共有する
↑変更したものを別途作ることもできるのがややこしいですね。
また、メモリ節約以外でも処理の観点で
・ScriptableObjectはゲームエンジン内部でC++で作られているため、xmlやjsonやエクセルファイルよりも高速読み込みが可能になる。
このあたりが利点となり利用されるのかなと思います。
必ず使わないといけないわけではないですが、使えると便利といった位置づけですかね。
ご丁寧に調査までして頂きありがとうございます><
利点を改めて列挙して頂くとメリットと利用方法、利用範囲が理解しやすくなりました!
データ管理はScriptableObjectを利用できる場面があれば上手く利用してみようと思います。
#数々のブログの記事にはお世話になっています。これからも参考にさせて頂きます!