完成したスクリプタブル・オブジェクトは、
いずれかのスクリプトで管理を行う必要があります(アセットの扱いですが、スクリプトに変数として宣言できます)
設計としてましては「
生成されたアイテムの ItemBase スクリプトが、自分のアイテムのデータを確認しにいって、スクリプタブル・オブジェクトから情報をもらう」という処理にしたいと思います。
そこで、どのアイテムからでもアクセスしやすいスクリプトであった方が利便性が高くなります。
またこのようにアクセスするスクリプトを1つにしておくことでアイテム1つずつにスクリプタブル・オブジェクトを登録する必要もなくなります。
そのためスクリプタブル・オブジェクトを管理する DataBaseManager スクリプトはシングルトンで作成するようにして、アイテムからアクセスが容易な状態で作成を行います。
C#スクリプトを新しく作成し、名前を DataBaseManager に変更します。
すでにある場合には処理を追加していきましょう。
DataBaseManager.cs
<= クリックすると開きます。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class DataBaseManager : MonoBehaviour
{
public static DataBaseManager instance; // シングルトン用の変数です
[SerializeField]
private ItemDataSO itemDataSO; // インスペクターからスクリプタブル・オブジェクトをアサインします
void Awake() {
// このゲームオブジェクトをシングルトンにし、かつ、シーン遷移しても破棄されないようにします
if (instance == null) {
instance = this;
DontDestroyOnLoad(gameObject);
} else {
Destroy(gameObject);
}
}
/// <summary>
/// ItemNo からItemData の取得
/// </summary>
/// <param name="searchItemNo"></param>
/// <returns></returns>
public ItemData GetItemDataFromItemNo(int searchItemNo) {
return itemDataSO.itemDatasList.Find(x => x.itemNo == searchItemNo);
}
}
DataBaseManager は名前のごとく、ゲーム内に登録する情報を一元管理させるための役割を持っています。
現在は、アイテムの情報のデータベース(リスト)であるスクリプタブル・オブジェクトを管理しています。
処理の内容ですが、GetItemDataFromItemNo メソッドを ItemBase スクリプト内で実行してもらい、
その際に、引数を通じて、アイテムの ItemNo の情報を受け取ります。
その ItemNo 変数の情報と、ItemDataSO スクリプタブル・オブジェクト内にある各 ItemData の ItemNo を1つずつ順番に照合していき、
同じ番号の ItemNo が見つかったら、その ItemData をアイテムの情報として ItemBase へと提供します。
GetItemDataFromItemNo メソッドが戻り値に ItemData 型を設定しているのはそのためです。
スクリプトが完成しましたら、ヒエラルキー上で Create Empty を選択して、新しくゲームオブジェクトを作成します。
名前を DataBaseManager に変更します。
このゲームオブジェクトに DataBaseManager スクリプトをアタッチしてください。
インスペクターを確認し、スクリプトがアタッチされていることを確認できましたら、
ItemDataSO 変数に Datas フォルダにある ItemDataSO スクリプタブル・オブジェクトをアサインしましょう。
完成すると、次のような画像の状態になります。
インスペクター画像
以上で設定は完了です。