Unityでデータベースを作成する方法

この記事はだいぶ前に書かれたものなので情報が古いかもしれません
データのアセットを作るのがかなりしんどい

この記事を三行にまとめると

テーブル用のスクリプト
本体のスクリプト
クリックイベント用のスクリプト
この記事は以下の動画の中に出てきたサンプルコードを載せたものです。コピペなどが必要なときに使ってください。



動画の本編では説明の流れに沿ってスクリプトファイルを行ったり来たりしながら少しずつコードを追加していますが、ここでは動画の6:40辺りで言っている手順に沿ってスクリプトファイルごとにまとめて紹介します。アセット作成などUnity画面側の操作に関しては省略しますので、動画の方を見ていただけたらと思います。



テーブル用のスクリプト(Numbers)

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

[CreateAssetMenu]
public class Numbers : ScriptableObject {
  // カラム用の変数
  [SerializeField] private int id;
  [SerializeField] private string word;

  // idを返す関数
  public int GetId() {
    return id;
  }

  // wordを返す関数
  public string GetWord() {
    return word;
  }
}

動画の中でも言っていますが、カラム用の変数はpublicでも別にダメではないです。ただしpublicにするとインスペクタで値を入れられるだけではなく、他のスクリプトからも自由に値を書き換えられてしまうので、スクリプトの中でうっかり値を上書きしてしまう可能性があるかもしれません(数値を加算したりとか)

関数の中では値を書き換えたいけどレコードの中身が変わると困るみたいなときは、うっかり事故を防ぐためにもprivateにしておいた方が安全でしょう。



データベース本体のスクリプト(DataBase)

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

[CreateAssetMenu]
public class DataBase : ScriptableObject {
  // データの一覧用の変数
  [SerializeField] private List<Numbers> data_list;

  // データの一覧をリストで返す関数
  public List<Numbers> GetAllData() {
    return data_list;
  }

  // idを指定してそのレコードのwordを返す関数
  public string GetWord(int id) {
    Numbers row = data_list.Find(data => data.GetId() == id);
    return row.GetWord();
  }
}

Findのかっこの中にある「data => data.GetId()」のdataは任意の文字列なら何でも良いです(dataである必要はない)。foreach文のinの前に書く文字列みたいなもので、自分で変数を作る感じです。

GetIdはNumbersスクリプトのGetId関数のことです。GetIdで取得したidと指定したidが同じならその要素を返すってことですね。

ちなみにもしリストの中に同じidを持つ要素が2つ以上ある場合は、最初の要素が返ります。同じidを持つ要素を全て取得したい場合はFindAllという関数を使います。



ボタンにセットするスクリプト(GetNumbers)

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

public class GetNumbers : MonoBehaviour {
  // データベース本体のアセット用変数
  public DataBase db;

  // データの一覧を取得してidとwordをログに出す関数
  public void GetAllData() {
    List<Numbers> datas = db.GetAllData();

    foreach(Numbers data in datas) {
      Debug.Log(data.GetId());
      Debug.Log(data.GetWord());    
    } 
  }

  // idが1のwordをログに出す関数
  public void GetWord() {
    Debug.Log(db.GetWord(1));
  }
}
 もしかしたら何か関連しているかも? 
 質問や感想などお気軽にコメントしてください