Unity で スイカ風ゲームを作ってみる#2
Unityでゲームを作る
Unity でスイカ風ゲームを作る!
Unity Version 2022.3.16
ScriptableObject を使ってフルーツデータの管理
前回の仕様確認の結果から、フルーツの種類が全部で11種類と意外と多いことが分かった。各フルーツに必要なパラメータを考えてると、テトリスとは異なり物理演算が必要になることから、RigidBody 系のパラメータも必要になると思われる。
フルーツのパラメータ
- サイズ(Transform.localScale)
- 色(SpriteRenderer.color)
- 重さ(RigidBody2d.mass)
- 空気との回転摩擦(RigidBody2d.angularDrag)
- 空気との移動摩擦(RigidBody2d.drag)
- 摩擦係数(PhysicsMaterial2D.friction)
- 反発係数(PhysicsMaterial2D.bounciness)
- 落下時に加える力(Addforce で与える力を計算するため)
ざっと考えるだけでもこれくらいのパラメータ数が存在する。これらのデータを管理するためにデータクラスを作成して、スクリプト上にリテラルで直接値を定義をしてしまってもよいが、後々調整しながらゲームバランスを整えることを考えると、手軽に変更できる手段で実装しておきたい。
そこで、今回はUnity のScriptableObject という仕組みを使ってデータ管理を行うように実装する。ScriptableObject の詳細はUnity のマニュアルや解説サイトを参照いただくとして、ここでざっくり説明しておくと、ScriptableObject とはUnity でゲームに使用する各種の定数データ(動的に書き換えることもできるが)をアセット上に保存し、それをスクリプトから参照できるようにする仕組みである。アセットなので、定義したデータをInspector から直接編集して変更することが可能なため、コンパイルせずにパラメータ調整を行うことが可能となる。使用方法は、ScriptableObject から派生したクラスを作成し、そのクラス内に各種データ用のメンバを定義する。Edior から定義したScriptableObject アセットファイルを作成して、Inspector から値を設定する。スクリプトから利用する際はPrefab の時と同様にResources.Load メソッドなど読み込むと通常のクラスと同様にスクリプト上でアクセスすることができる。
文章で説明するだけだとよくわからいなので、実際にスイカ風ゲームで適用した方法を記載する。
FruitDataSet.cs の抜粋
※ScriptableObject を定義するファイル名は、ScriptableObject のクラス名と同一にする
FuitDataSet がScriptableObject から派生したクラス。クラス定義の前にある属性[CreateAssetMenu] は、Unity Editor のAssets/Create メニューからこのアセットを作成できるようにするために必要な指定。FruitDataSet クラスにてList で保持されるFruitData クラスもInspector 上から値を設定できるようにするために[Serializable] 属性の定義を付ける必要がある。
- [Serializable]
- public class FruitData
- {
- public string Name;
- public float Size;
- public float Weight;
- public float AngularDrag;
- public float LinearDrag;
- public float Friction;
- public Color FColor;
- }
- [CreateAssetMenu(menuName = "ScriptableObject/FruitDataSet", fileName = "FruitDataSet")]
- public class FruitDataSet : ScriptableObject
- {
- public float MassBase;
- public float DropForce;
- public List<FruitData> Data;
- }
次に上記で作成したScriptableObject をアセットとして生成する。今回は"Resources" フォルダ配下に"Data" フォルダを作成し、そのフォルダの中で右クリックのメニューから"Create"→"ScriptableObject"→"FruitDataSet" を選択する。すると"FruitDataSet" というアセットファイルが作成される。
"FruitDataSet" アセットが作成できたら、具体的な設定値を設定していく。"FruitDataSet" アセットファイルを選択すると、Inspector 上にFruitDataSet クラスで定義したパラメーターが見えるので、それぞれの値を設定していく。これでアセットファイルとして各フルーツのデータが保存できたことになる。
作成した"FruitDataSet" アセットは、スクリプト上からResources.Load メソッドでロードして利用することが可能である。
スクリプト上でScriptableObject アセットをロードする例)
- _fruitDataSet = Resources.Load<FruitDataSet>("Data/FruitDataSet");
ロードさえしてしまえば、後は通常のクラスのメンバにアクセスするのと同様に各パラメータを利用することできる。
これで、後から各パラメータを微調整する際には、Inspector からいつでも変更できてコンパイル不要で動作確認を行うことができるようになった。
次の記事