プロ野球ロスのため野球の試合をシミュレーションするツールでも作ろうと画策中。
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」は検索したい変化球名を設定。
今回はカットボールという変化球がちゃんと抽出できるかテストしてみる。
実行結果
無事にカットボールの情報を抽出することができた。

データの追加
もし新しい変化球が登場してデータに追加したい、となった場合は
- CarvingBallData のオブジェクトを作成
- CarvingBallDataBaseのCarvingBallDatasに新規作成したCarvingBallDataオブジェクトを追加
してあげるだけで良い。
削除する際はCarvingBallDataBaseのCarvingBallDatasに登録されているデータを消すだけ。
メンテナンスが簡単なのもこのデータベースシステムの良いところ。