敵が登場するゲームにおいて必要なデータであるステータス。
今回はそのステータスの実装方法について検討していきたいと思います。
コンテンツ
現在の実装
現在開発は開発のためですが。
すべてインスペクターに記載しています。
敵の設計については以下を参照。
実際インスペクター上にこのよう設定できるようになっています。
欠点
スクリプトに直書きよりははるかにましですが。
欠点として
- プレハブを開かなければ編集できない
- 全く同じパラメータを持った敵が出てきたとき使いまわしができない
2つだけですが、この2つバランス調整をする際に致命的な時間ロスになります。
この場合の対処方法としては、
CSVを作成し、スプレットシートやエクセルで管理する方法がありますが。
この場合、
- エクセルはGitで差分が見えないので相性が悪い
- Gitで管理しているのでスプレットシート管理はデータの場所が非常に遠いので管理場所が増える
- エクセルのクラウドの場合もデータの場所が非常に遠いので管理場所が増える
- そもそもエクセルを持っていない
と非常にこちらの環境と非常に相性悪い。
そのため今回はUnityのオブジェクトとしても扱えるScriptableObjectを作成し
Unityで完結したいと思います。
実装
ステータスをScriptableObjectにする場合このようになります。
[CreateAssetMenu(menuName = "Create CharacterStatus")]
public class StatuaData : ScriptableObject
{
// ----------------------------------------------
// 設定項目
[SerializeField]
public int m_hp = 0;
[SerializeField]
public int m_atk = 0;
[SerializeField]
public float m_energy = 100;
[SerializeField]
public float m_healEnergyPerSec = 1;
[SerializeField]
public int m_point = 10;
[SerializeField]
public float m_speed = 0.0f;
[SerializeField]
public float m_searchRange = 0.0f;
// ----------------------------------------------
// アクセサ
public int Hp { get { return m_hp; } }
public int Atk { get { return m_atk; } }
public float Energy { get { return m_energy; } }
public float HealEnergyPerSec { get { return m_healEnergyPerSec; } }
public int Point { get { return m_point; } }
public float Speed { get { return m_speed; } }
public float SearchRange { get { return m_searchRange; } }
}
見事に定義だけのクラスですが。
実際の使い方として
最初の行に記載した通り、以下を記載することでこのスクリプトのScriptableObjectを生成できる
項目を追加することができます。
[CreateAssetMenu(menuName = "Create CharacterStatus")]
このように
- 適当なフォルダを選択
- Create>Create CharacterStatusを選択
- フォルダ名を入力
このようにできました。
あとはパラメータを入力して作成することができました。
あとはこのScriptableObjectをアタッチすることで完了となります。
この場合Data>Characterフォルダがステータスの一元管理をするので
ステータスの調整をしたい場合はこのフォルダの編集のみで完結するので非常に楽になります。
まとめ
ステータス系はゲームのバランスに直結するため頻繁に変更されます。
そのたびにプレハブを開くのは苦でしかないのでなるべく一元管理するに越したことはないです。
ツールの都合上見送りましたがCSV管理もUnityを起動せずに編集できるので、
非常に楽ですのでおすすめです。
コメントを残す