記事一覧
Unityのオーディオといえば、オブジェクトにオーディオソースを貼って、オーディオクリップを鳴らすためのスクリプトを書いて・・・と、適当に作ってしまうとどこに何をつけたか分からなくなりそうだったので、まとめて管理できるような仕組みを考えてみました。
設計方針
〜なんちやってプログラマにつき、スクリプトはめんどくさいから極力書きたくない〜
- エクセルみたいにファイル管理ができるようにして、変更もそこから出来るようにする。
- オーディオソースやオーディオクリップを貼る手間を減らす。
- スクリプトも書く手間を少なくする。
- どこに何を埋めたか分かるようにする。
対策
- ①について・・・データベースを使う
- ②、③について・・・共通のスクリプトファイルを1つ貼れば済むようにする。
- ④について・・・ログを出力してくれるようにする
ということで、今回の記事ではデータベースアプリであるSQLiteをUnityに実装します。
SQLiteについて
使い方、インストールについてはこちらのサイト様を参考にさせていただきました。
SQLiteは、データの管理、検索、参照に特化したデータベースアプリケーションです。 SQLというデータベースに特化した言語を使います。本気で習得するにはそれなりに時間がかかるデータベースですが、今回使用するのはごく一部の機能ですのであまり難しくはないと思います。
今回使用するのはSQLiteUnityKitというツールです。 Unityで使えるフリーのデータベースツールとしては結構有名で解説しているサイトも多く、私も参考にさせていただきました。
SQLiteUnityKitをインストールする
今回はWIndows10を使っていきます。Macは確認できていませんが、DLLの準備が不要なだけで、ほとんど手順は同じはずです。
ソースコードの入手
このツールはAssetStoreで配布されていません。 GitHub からダウンロードしてきたファイルを自分でプロジェクトに配置していく必要があります。Windowsはさらに、SQLite用のDLLを入手する必要があります。
まずはGitHubよりファイルをダウンロードします。
ダウンロードボタンを押してファイル一式を入手します。
Windows用のDLLはSQLiteの公式サイトからダウンロード
こちらのx86、x86_64bit用をダウンロードしておきます。MacはSQLiteが標準でインストールされているのでこの作業は必要ありません。
ファイルの準備ができたらこんな感じでプロジェクトに配置していきます。
※sqlite3ファイルが2つありますが、それぞれ32bit用をx86フォルダへ、64bit用をx86_64ファルダに入れます。
32bit用ファイルの設定
64bit用ファイルの設定
SQLiteUnityKitの問題点について
こちらのサイト様がとても分かりやすく解説されています
問題点だけ簡単に説明しておくと
- 日本語などのマルチバイト文字を扱えない
- 同時に複数個所のアクセスができない
- アップデートの度にdbファイルが上書きされる
などがあるようです。私の用途では日本語を扱えないと困るので、サイトを参考に修正しています。
ほかは今のところ問題ないのでそのままにしてあります。
PuP SQLiteをインストールする
データを格納しておくファイルは、本体をインストールしてからスクリプトで作成することもできますが、エクセルライクなファイル管理を実現したいので、SQLite用のクライアントアプリをインストールします。
上記サイト様の中でも紹介されている、「PuP SQLite」がとても使いやすいです。
クライアントアプリであればなんでも構いません。
「PuP SQLite」を実行する
インストールは不要です。ダウンロードしたパッケージの中の「PuP SQL.exe」を実行すればアプリが起動します。
※動作には.NET Framework4.0が必要です。
データベースファイルを作成する
テーブル・フィールドの作成
まずは「新規作成」でテーブルを作成します。今回は名前を「sound」としました。
データベースはデータ管理のために、主キーと呼ばれる絶対に同じ値が無いフィールドを作成する必要があります。
今回は「id」フィールドを主キーに設定。オートインクリメントにチェックをしておきました。その他、データの管理に必要なフィールドを作っていきます。
フィールドには型があり、事前にどんな形式のデータを入れるのか設定しなければなりません。SqLiteで設定できる型は
- BOOL型・・・TrueとFalseの二値の型
- INTEGER・・・整数型。Unityのint型
- REAL・・・浮動小数型。
- TEXT・・・テキスト型。String型に代入できる。
- BLOB・・・バイナリ型。基本何でも入るはずだが未検証。
と5種類あるのですが、私の使い方が悪いのか、Unity側ではBOOLEANとREALを正常に読み込みできませんでした。
TEXTはString型で、INTはint型で、どちらも問題なく使えているので、私はこの2種類しか使っていません。
では、sound再生に必要なフィールドを作っていきます。この辺はお好みでどうぞ。
私はこんな感じで作りました。
- 「name」・・・TEXT型:選ぶときに分かりやすい日本語の名前
- 「clip」・・・TEXT型:mp3ファイルの名前を格納しておくところ
- 「volume」・・・INT型:音量の設定もここでしてしまう
3D音響を使うためのフィールド - 「use_3d」・・・TEXT型:3D音響を使うかどうか
- 「mode1」・・・TEXT型再生させるオブジェクトの名前を格納する。
- 「scene」・・・TEXT型:シーンの名前を入れておく。直接は使用せず、検索するときに活用する
定義したらどこでも良いのでファイルを一旦保存して、データを入力してみましょう。入力したデータを保存するには「Ctr1+S」です。.dbファイルが作成できたと思います。
.dbファイル・・・StreamingAssetsフォルダに配置(必須)
これでとりあえずSQLiteを使う準備はできました。
Unityからデータベースにアクセスする
スクリプト
データベースのデータを利用するには
- データベースに接続
- 条件をSQL文で指定して実行
- 値を変数に代入
という手順が必要になります。ということでスクリプトです。
using UnityEngine;
using System;
using System.Collections;
using System.Collections.Generic;
public class AudioTest : MonoBehaviour
{
void Start()
{
string sname;
sname = "BGM3"//テストのため、適当にnameフィールドの値をいれる。
SqliteDatabase sqlDB = new SqliteDatabase("db.db");
string query = string.Format("select * from sound where name = '{0}'", sname);
DataTable dataTable = sqlDB.ExecuteQuery(query);
string name = "";
string clip = "";
float volume = 0;
string mode = "";
string dimention = "";
string model = "";
foreach (DataRow dr in dataTable.Rows)
{
name = (string)dr["name"];
clip = (string)dr["clip"];
volume = (int)dr["volume"]; volume = volume / 10;
mode = (string)dr["mode"];
dimention = (string)dr["3d"];
model = (string)dr["model"];
Debug.Log(name + ":" + clip + ":" + volume + ":" + mode + ":" + 3d + ":" + model);
}
}
}
コマンド解説
①データベースに接続
SqliteDatabase sqlDB = new SqliteDatabase("db.db");
②条件をSQL文で指定して実行
string query = string.Format("select * from sound where name = '{0}'", sname);
DataTable dataTable = sqlDB.ExecuteQuery(query);
検索条件に指定する変数は、文字列の場合(シングルクオート)で囲む必要があります。
③値を変数に代入
string name = "";
string clip = "";
float volume = 0;
string mode = "";
string dimention = "";
string model = "";
foreach (DataRow dr in dataTable.Rows)
{
name = (string)dr["name"];
clip = (string)dr["clip"];
volume = (int)dr["volume"]; volume = volume / 10;
mode = (string)dr["mode"];
dimention = (string)dr["3d"];
model = (string)dr["model"];
Debug.Log(name + ":" + clip + ":" + volume + ":" + mode + ":" + 3d + ":" + model);
}
で、ログを出してみます。
無事にテーブルの中身が取り出せています。
以降、データ変更する時には
・StreamingAssets以下のファイルに「PuPSQL」で直接アクセスすれば簡単に書き換えができるようになりました。
書き換え時の注意点
SQLiteは同時アクセスに弱いと書きましたが、UnityでdbファイルにアクセスしながらPuP SQLiteで内容を書き換えていると、頻繁にエラーを吐きます。こまめな保存を心がけましょう。
次回はUnityに実装していきます。
記事一覧