【Unity】Airtableを使って簡易的なDB管理をする方法【SQLは不要】

こんにちは！
ねこじょーかー（[@nekojoker1234](https://twitter.com/nekojoker1234)）と申します。

Unityでゲームを作ろうとしたときに、DBとしてデータを管理して、そこからデータを引っ張ってくる、といった処理も必要になってくると思います。

数個くらいのデータであれば「まぁ、if文で分岐すればいいか」となりますが、さすがに数十、数百となると手間が増えてやっていられないですよね。

しかし、ちゃんとしたDBを用意するとなると、サーバー・テーブル設計・SQLなどなど、考えることがたくさんあります。

そんな「大規模なDBはいらないけど、ソースコードにベタ書きも嫌だ！」という人のための記事です。

## Airtableを使って簡易的なDB管理をする方法

### Airtableに登録する

タイトルでネタバレしていますが、まずは[Airtable](https://airtable.com/)に無料登録しましょう。

「[Airtable](https://airtable.com/)」は、スプレッドシートのような機能が無料で使えるサービスがあり、これをDB代わりに使用することができます。

登録手順はメールアドレスを登録するだけなので割愛しますね。
登録が終わったら、以下の画面が表示されます。

<img width="1438" alt="スクリーンショット 2019-11-26 21.18.18.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487218/e56b04ca-57f7-f08b-ecd9-8af65b73c44e.png">

### テーブルを追加する

先ほどの画像で「Add a base」となっているところをクリックすると、新しいテーブルを作成することができます。

「Start From Scratch」を選択することで、完全に「空」のテーブルになります。

<img width="1435" alt="スクリーンショット 2019-11-26 21.23.37.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487218/8fe2768f-2c22-163a-5331-bff691a614aa.png">

### レコードを追加する

基本的な使い方はExcelと同じなので、特に操作の説明はしません。

私は以下のようなテーブルを作成しました。

<img width="1435" alt="スクリーンショット 2019-11-26 21.26.58.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487218/c42ad1f4-36d0-ba51-aec4-23a87b1b62da.png">

一番上に表示されているのが「テーブル名」、左上に表示されているのが「シート名」です。

**シート名はプログラム上で使うことになるので、コピーしておいてください。**

### APIキーを確認する

トップページ右上の「Account」からマイページに行くと、APIキーが「●●●●●●」と表示されているので、カーソルを合わせると具体的なAPIキーが表示されます。

このAPIキーはプログラムで使用するのでコピーしておきましょう。

### BaseIDを確認する

まずは以下のページにアクセスしてください。
https://airtable.com/api

「The ID of this base is」となっているところがBaseIDなので、これをコピーしておきましょう。（灰色でぬりつぶしているところです）

<img width="1439" alt="スクリーンショット 2019-11-26 21.36.26.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487218/3d65bdce-4d0c-4447-1291-ebf850211deb.png">

これでようやくAirtable側の準備が終わったので、次からはUnity側の準備に入ります。

### AirtableClientをプロジェクトにインポート

以下で公開されているソースコードを、プロジェクトにインポートしましょう。
csファイルだけで大丈夫です。

https://github.com/yKimisaki/AirtableClient

### Utf8Jsonをプロジェクトにインポート

AirtableClientをインポートすると、「Utf8Jsonがないよ！」と怒られるので、Utf8Jsonもインポートしておきます。

https://github.com/neuecc/Utf8Json

するとここで、「unsafeが許可されていません」的なエラーが出て困ることになるので、unityの設定を変更しましょう。

「Edit -> Project Setting」と進んでいき、「unsafe」と検索窓に入力して「Allow 'unsafe' code」を見つけます。

<img width="556" alt="スクリーンショット 2019-11-26 21.48.28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487218/f8474538-0a15-9703-1307-cc1d8d0a4778.png">

このチェックをつけることで、エラーを解消することができます。


### 処理を実装する

では、実際の処理を実装していきましょう。

サンプルはこんな感じです。

```csharp
var client = new AirtableClient("コピーしたAPIキー");
var @base = client.GetBase("コピーしたBaseID");
var allRows = @base.LoadTableAsync<"コピーしたシート名">().Result;

foreach (var row in allRows)
{
    // 1レコードずつ取り出す処理 
}
```

コピーしたシート名の型のエンティティが返ってくるので、シート名をクラス名にして、各列名をプロパティ名にします。

```csharp
public class CharacterParam
{
    public string Name;
    public int Attack;
    public int Defence;
    public int HitPoint;
}
```

### 完成

めでたく完成です！

「応答なし」で固まってしまう場合は、以下のケースが考えられるので、チェックしてみてください！

- APIキーが間違っている
- BaseIDが間違っている
- シート名とエンティティ名が一致していない
- オフラインになっている

### 補足

最後に念のため、公式で提供されているAPIとドキュメントをリンクとして貼っておきます。

公式API
https://github.com/ngocnicholas/airtable.net

公式ドキュメント
https://github.com/ngocnicholas/airtable.net/wiki/Documentation

##あわせて読みたい

- [HTMLもわからない初心者が、独学で「投稿型SNSサービス」を作ったって本当？【193日間の死闘】](https://qiita.com/nekojoker/items/2497b4f81ffd1cd7025c)

運営している PlayFab 専用ブログ
https://playfab-master.com