ScriptableObjectを利用してデータベースを作成する

Tips

プロ野球ロスのため野球の試合をシミュレーションするツールでも作ろうと画策中。

PythonかUnityかで迷ったが視覚的な要素も入れたかったのでとりあえずUnityで作ってみることに。

後々Pythonにするかも(そういう時にChatGPTは便利)

データベース管理

基本的には静的な情報を管理させるときにScriptableObjectは有効(だと勝手に思ってる)

なので、今回は野球の「変化球」という要素をScriptableObjectによってデータベース化して管理するようにしてみた。

変化球のパラメータ要素

野球ゲームをやった人ならピンとくると思うパラメータをとりあえず羅列。

「変化球名」「変化球種別」「球威」「変化量」「球速」「制球」

あたりを用意した。

要素名変数名説明
変化球種別carvingType変化球の種類。例えば、スライダーやカットボールは[スライダー系]、フォークやスプリットは「フォーク系」等
変化球名carvingName変化球の名前。「スライダー」「カーブ」「フォーク」「シンカー」等
球威ballPower変化球の威力。例えばフォークは飛びにくい、カーブは飛びやすい等
変化量carvingAmount変化球の変化量。カットボールは曲がりにくく、カーブは曲がりやすい等
制球ballControll変化球のコントロールのしやすさ。スライダーは狙ったところに投げやすい、フォークはすっぽ抜けやすいとか
球速ballSpeed変化球の球速。ストレートと比較してどれだけ遅いか等

これらは変化球毎に設定があり、静的なものと定義。

例えば、Aさんのフォークは球威が高いかわりにあまり変化しない、Bさんのフォークは変化量が大きいが球速が遅い、みたいなことはせず、だれが投げても上記のパラメータは一定であると定義している。

※これは後で変更するかもしれないけど、今のところという注釈

概要図

データベース構成要素は

  • 変化球データ
  • データベース本体
  • データベース管理用マネージャー

の3つ。

そのうち変化球データとデータベース本体はScriptableObjectで構成する

データベースマネージャーはデータベース本体にアクセスしてデータを取得するための機能を要するもの。

いわゆるラッパーというやつ

データベースシステムの構築

管理するデータの整理ができたのでそれをもとにスクリプトを書いていく

変化球データクラスの作成

変化球のパラメータの仕様は整理しているので、それどおりにクラスを作成する。

とは言え、設計したパラメータを持つクラスを作成するだけなので単純。

CarvingBallData.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

[CreateAssetMenu(menuName = "CarvingBall")]
public class CarvingBallData : ScriptableObject
{
    public int carvingType;         // 変化球の種類(0:ストレート系 1:スライダー系 2:カーブ系 3:フォーク系 4:シンカー系 5:シュート系)
    public string carvingBallName;  // 変化球名
    public int ballPower;           // 球威
    public int carvingAmount;       // 変化量
    public int ballControll;        // 変化球のコントロール
    public int ballSpeed;           // 変化球速(最高球速 - 10など)
}

[CreateAssetMenu(menuName = “CarvingBall”)]

でProject上で右クリックでオブジェクトを作成できるようになる。

データベース本体の作成

先ほど作成した変化球データを整理するデータベースを作成する

CarvingBallDataBase.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

[CreateAssetMenu(menuName = "CarvingBallDataBase")]
public class CarvingBallDataBase : ScriptableObject
{
    [SerializeField] public List<CarvingBallData> carvingBallDatas = new List<CarvingBallData>();
}

先ほど作成したCarvingBallDataをリストにして持つだけ。

Assetオブジェクトを作成する

ここまで作成したらAssetオブジェクトを作成する。

CreateAssetMenuによって右クリックで作成できるようになっているはず。

CarvingBallDataオブジェクトの作成

Projectウィンドウ上で右クリックし[Create] -> [CarvingBallData]をクリックすると、Assetオブジェクトが作成されるので今回は「Slider」と命名

作成されたオブジェクトを選択するとInspectorウィンドウにて設定画面が出るので下図のように設定

これを管理したい変化球の分作成する

CarvingBallDataBaseオブジェクトの作成

管理する対象データオブジェクトを作成したので、今度はデータベース本体のオブジェクトを作成する

右クリックから[Create] -> [CarvingBallDataBase]をクリック

先ほどと同じくAssetオブジェクトが作成されるので名前を「CarvingBallDataBase」にしておく。

Inspectorはこんな感じ。

データが何も登録されていないので「List is empty」となっている。

CarvingBallDataBaseにデータを登録する

CarvingBallDataBaseの「CarvingBallDatas」のリストの「+」をクリックすると、何も登録されていない要素が作成される

ここに先ほど作成したCarvingBallDataを登録していく。

空の要素の中にCarvingBallDataのオブジェクトをドラッグアンドドロップするだけ

全部登録したものがこちら。

全14種類の変化球を用意した

これでデータベース作成および要素の登録は完了。

データベースマネージャーの作成

データベースの作成は完了したが、このままだと要素を参照して取得することができない。

ので、このデータベースから要素を取得できるように管理クラスを作成する。

DataBaseManager.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class DataBaseManager : MonoBehaviour
{
    [SerializeField] private CarvingBallDataBase carvingBallDataBase;   // 変化球データ用データベース

    /// <summary>
    /// 変化球データベースから変化球名によって変化球データを抽出する関数
    /// </summary>
    /// <param name="carvingName">取得したい変化球名</param>
    /// <returns>変化球データクラス(CarvingBallData)</returns>
    public CarvingBallData GetCarvingBallDataByName(string carvingName)
    {
        // DataBaseに登録されているリストを取得してくる
        List<CarvingBallData> carvingBallList = this.carvingBallDataBase.carvingBallDatas;

        // リストに入っているDataを全件検索
        for (int i = 0; i < carvingBallList.Count; i++)
        {
            CarvingBallData carvingBallData = carvingBallList[i];

            // もし指定した変化球名とマッチしたらその変化球データを返却する
            if (carvingBallData.carvingBallName == carvingName) return carvingBallData;
            else continue;
        }

        // もし何ともマッチしなかったらNULLを返却する
        return null;
    }
}
[SerializeField] private CarvingBallDataBase carvingBallDataBase;

によりInspectorウィンドウで先ほど作成したCarvingBallDataBaseを設定できるようにする

今後色々な条件でデータを検索できるようにするつもりだけど、とりあえずは変化球名でデータを抽出できる関数だけ用意した。

オブジェクトにアタッチする

データベースマネージャークラスを作成したらオブジェクトにアタッチする。

Hierarchyウィンドウで右クリックして[Create empty]をクリック

空のGameObjectが作成されるので、名前を「DataBaseManager」として、先ほど作成したDataBaseManager.csをアタッチする。

「Carving Ball Data Base」の設定がNoneになっているので、先ほど作成したCarvingBallDataBaseを設定する

※スクリプトではなくAssetオブジェクトの方

これでデータベースシステムの構築は完成。

実際に使ってみる

実際に使ってみる。

今回はテスト用にDebug用のオブジェクトを作成し、そこからデータベースを利用して変化球のデータを抽出してみる。

Debug用オブジェクトの作成

DebugObject.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class DebugObject : MonoBehaviour
{
    [SerializeField] private DataBaseManager dbMng;
    [SerializeField] private string searchWord;


    void Start()
    {
        Test01(searchWord);
    }

    /// <summary>
    /// DataBaseManagerで変化球データ情報を取得する関数の動作確認用
    /// </summary>
    /// <param name="ballName">変化球名</param>
    private void Test01(string ballName)
    {
        CarvingBallData testCarvingBall;
        testCarvingBall = dbMng.GetCarvingBallDataByName(ballName);

        Debug.Log("変化球名: " + testCarvingBall.carvingBallName);

        string carvingTypeStr = "";
        switch (testCarvingBall.carvingType)
        {
            case 0: carvingTypeStr = "ストレート系"; break;
            case 1: carvingTypeStr = "スライダー系"; break;
            case 2: carvingTypeStr = "カーブ系"; break;
            case 3: carvingTypeStr = "フォーク系"; break;
            case 4: carvingTypeStr = "シンカー系"; break;
            case 5: carvingTypeStr = "シュート系"; break;
        }
        Debug.Log("球種タイプ: " + carvingTypeStr);

        Debug.Log("球威: " + testCarvingBall.ballPower.ToString());
        Debug.Log("変化量: " + testCarvingBall.carvingAmount.ToString());
        Debug.Log("コントロール: " + testCarvingBall.ballControll.ToString());
        Debug.Log("球速補正: " + testCarvingBall.ballSpeed.ToString());
    }
}

仕組みは簡単。

[SerializeField] private DataBaseManager dbMng;

にて先ほど作成した「DataBaseManager」オブジェクトを設定し、変化球名で検索する関数を利用するだけ。

検索結果はとりあえずコンソールに標準出力するようにしている。

DebugObjectの作成とスクリプトのアタッチ

DataBaseManagerを作成したときと同じように「Create empty」で空のGameObjectを作成したのちにDebugObject.csをアタッチする。

「DB Mng」設定にはDataBaseManagerオブジェクトを設定しておく。

「Search Word」は検索したい変化球名を設定。

今回はカットボールという変化球がちゃんと抽出できるかテストしてみる。

実行結果

無事にカットボールの情報を抽出することができた。

データの追加

もし新しい変化球が登場してデータに追加したい、となった場合は

  1. CarvingBallData のオブジェクトを作成
  2. CarvingBallDataBaseのCarvingBallDatasに新規作成したCarvingBallDataオブジェクトを追加

してあげるだけで良い。

削除する際はCarvingBallDataBaseのCarvingBallDatasに登録されているデータを消すだけ。

メンテナンスが簡単なのもこのデータベースシステムの良いところ。

タイトルとURLをコピーしました