UnityのUIにテキスト、画像をある程度自動表示 〜値自動設定編〜
前回の記事の続きになります。
UnityのUIにテキスト、画像をある程度自動表示 〜紹介編〜 - 湯呑み茶碗の開発日記
ダウンロードしたライブラリ内の「AutoGUISample.unity」を開いてみてください。
まずは実際に動かしてみて値がUIに設定される様子を確認してみてください。
UIに表示する処理について
では実際に表示する処理をまとめている「AutiGuiSampleManager.cs」を見ていきます。
#region button event
/// <summary>
/// UI(入力コントロール群)にキャラクターデータを表示する。
/// 「→」ボタンのイベントです。
/// </summary>
public void ShowCharacterInput()
{
InputCharacterData.Show(SampleCharacterData);
}
/// <summary>
/// UIにキャラクターデータを表示する。
/// 「Show Output」ボタンのイベントです。
/// </summary>
public void ShowCharacterDataOutput()
{
SetComponent.SetGuiComponent(this.OutputCharacterTransform, SampleCharacterData);
}
/// <summary>
/// UIに選択データを表示する。
/// 「Show Toggle Status」ボタンのイベントです。
/// </summary>
public void ShowToggleStatus()
{
InputToggleStatus.Show(SampleToggleStatus);
}
/// <summary>
/// 入力されたデータを取得
/// 「Get Input Data」ボタンのイベントです。
/// </summary>
public void GetCharacterInput()
{
CharacterData characterData = new CharacterData();
SetComponent.SetGuiComponentToObject<CharacterData>(this.InputCharacterTransform, characterData);
this.SampleCharacterData = characterData;
ToggleStatus toggleStatus = new ToggleStatus();
SetComponent.SetGuiComponentToObject<ToggleStatus>(this.ToggleTransform, toggleStatus);
this.SampleToggleStatus = toggleStatus;
}
/// <summary>
/// 入力値を反映させる
/// 「←」ボタンのイベントです
/// </summary>
public void ReflectionInputData()
{
CharacterData characterData = new CharacterData();
SetComponent.SetGuiComponentToObject<CharacterData>(this.InputCharacterTransform, characterData);
SetComponent.SetGuiComponent(this.OutputCharacterTransform, characterData);
}
#endregion
このソース部分で行っていることは「Inspector」上で設定したオブジェクトの子オブジェクトに対して値を設定しています。
言葉だけだとものすごくわかりにくいと思うので画像を交えて説明していきます。
オブジェクトとプロパティのマッピング
「AutiGuiSampleManager.cs」では3つのTransformをインスペクター上で設定しています。
#region inspector property
/// <summary>
/// 出力コントロールの親オブジェクト
/// </summary>
public Transform OutputCharacterTransform;
/// <summary>
/// ステータス入力コントロールの親オブジェクト
/// </summary>
public Transform InputCharacterTransform;
public InputControlsParent InputCharacterData { get { return this.InputCharacterTransform.GetComponent<InputControlsParent>(); } }
/// <summary>
/// 選択コントロールの親オブジェクト
/// </summary>
public Transform ToggleTransform;
public InputControlsParent InputToggleStatus { get { return this.ToggleTransform.GetComponent<InputControlsParent>(); } }
#endregion
インスペクター上での設定はこんな感じです。
その中で「CharacterData」オブジェクトをピックアップします。
赤枠に囲まれたプロパティ名とオブジェクト名を照らし合わせてみてください。
オブジェクトとプロパティがマッピングされています。これがこのライブラリで一番重要なことになります!
この状態で「SetComponent.SetGuiComponent(this.OutputCharacterTransform, SampleCharacterData);」を呼び出すと「SampleCharacterData」のデータがUIに反映されます。
マッピングがされていなければUIにテキスト、画像が表示されることはありません。
GuiDataAttribute属性について
- DispFormat ・・・ テキスト(Text)に表示する際のフォーマット。Text以外のコンポーネント(InputField等)には対応しておりません。
表示するテキストにフォーマットを設定したい場合は「GuiDataAttribute」を各プロパティに設定してください。「属性クラス」が設定されていなくても問題はありません。
GuiDataAttribute属性が設定されて表示されるテキストはこんな感じになります。
フォーマットを変えるとこんな感じですということで差分も。
「設定された属性を変更して表示を行う。(差分表示)」
あともう一回続きます。次回はGUIから値を取得する方法を紹介します。
UnityのUIにテキスト、画像をある程度自動表示 〜紹介編〜
今回はUnityのGUIにある程度自動で設定するライブラリを作ってみました。
GUIオブジェクトを1つ1つ管理する必要が無くなるので、GUI周りの値設定に関する実装が少し楽になります!
GUIに自動で設定できる対応コンポーネントは以下の通りです。
- Text ・・・ 文字通り文字を表示します。
- Image ・・・ 画像を表示します。
- SpriteRenderer ・・・ 画像を表示します。
- InputField ・・・ テキストボックスに入力値を設定します。
- Toggle ・・・ チェックボックスの選択状態を設定します。
- DropdownBox ・・・ Dropdownを継承した派生クラス。
ちなみにこのライブラリ、GUIに値をセットすること以外に、GUIから逆に値を取得することもできます。
以下のURLからダウンロードしてみたください。READMEは近いうちに更新します。
GitHub - yunomichawan/NearlyAutoGUI
(ライブラリ名のネーミングセンスの無さよ・・・)
実際に動かしてみるとこんな感じになります。
このライブラリは内部的な処理が中心なので、見た目は特に変わりません。
オブジェクトとプロパティのマッピングが重要になります。
上の図を見てみるとわかりますが、オブジェクトの名前とクラスのプロパティの名前が一致している箇所に対して値が設定されています。
なんとなく使い方が分かった方もいらっしゃると思います。
とはいえ今回は簡単な紹介編になります。
詳しい使い方については次回!
UnityでSqliteを自動化 ~データ更新編~
テーブルクラス作成編の続きになると思います。
UnityでSqliteを自動化 ~テーブルクラス作成編~ - 湯呑み茶碗の開発日記
今回はデータ更新編です。
データベースに対して登録、更新、削除を行っていきます。
データベース周りの操作を行っている
データ登録
データの新規登録を行っている部分に着目していきます。着目するといっても「CharacterId」を採番して登録を行っているだけです。
/// <summary>
/// Insert Example
/// キャラクターデータを登録
/// </summary>
/// <param name="characterData"></param>
public static void InsertCharacterData(CharacterData characterData)
{
DataAccess.Instance.Init(typeof(CharacterData));
// Create Numbering CharacterId
// CharacterIdを採番
characterData.CharacterId = DataAccess.Instance.GetAssignNumber("CharacterId");
// Insert SQL will be issued on the basis of the argument
// 引数に基づきインサートSQL発行
DataAccess.Instance.Insert(characterData);
}
そして実行されたSqlite文がこちら。
データ更新
データの更新を行っている部分に着目し(略)
といってもプライマリキーで更新条件を自動生成しているだけです。
一応、自分で条件を指定することもできます。何も条件を指定していない場合のみ、指定した条件で更新を行います。
条件の指定方法はこちら。データ取得編で条件を指定する方法を紹介しています。
UnityでSqliteを自動化 ~データ取得条件指定編~ - 湯呑み茶碗の開発日記
/// <summary>
/// Update Example
/// キャラクターデータを更新
/// </summary>
/// <param name="characterData"></param>
public static void UpdateCharacterData(CharacterData characterData)
{
// Init
DataAccess.Instance.Init(typeof(CharacterData));
// Update SQL is issued on the basis of the argument . (NULL values are not updated .)
// 引数に基づきアップデートSQL発行。NULL値は更新されません。
DataAccess.Instance.UpdateSql(characterData);
}
そして実行されたSqlite文がこちら。
データ削除
データの削除を行っている部分に(略)
データ更新と同じく条件を指定できます。仕様は更新と同じです。
/// <summary>
/// Delete Example
/// キャラクターデータを削除
/// </summary>
/// <param name="characterData"></param>
public static void DeleteCharacterData(CharacterData characterData)
{
// Init
DataAccess.Instance.Init(typeof(CharacterData));
// Issue the Delete SQL based on the arguments .
// 引数に基づきデリートSQL発行
DataAccess.Instance.Delete(characterData);
}
そして実行されたSqlite文がこちら。
データ削除不可
あまりこういった実装を見かけることはありませんが、テーブルクラスに「DeleteImpossible」属性を設定するとデータの削除を絶対にしないテーブルクラスを作成することができます。
/// <summary>
/// Table class of MasterTable . Deletion of the data can not be
/// MasterTableのテーブルクラス。 データの削除はできません
/// </summary>
[DataAccess("MasterTable")]
[DeleteImpossible]
public class MasterData : TableBase
{
[DataProperty(3, DataPropertyAttribute.SQLITE_TYPE.TEXT, false, true)]
public string MasterId { get; set; }
[DataProperty(32, DataPropertyAttribute.SQLITE_TYPE.TEXT, false, true)]
public string MasterCategory { get; set; }
[DataProperty(64, DataPropertyAttribute.SQLITE_TYPE.TEXT, false, false)]
public string MasterName { get; set; }
[DataProperty(3, DataPropertyAttribute.SQLITE_TYPE.NUMERIC, false, false)]
public int Seq { get; set; }
[DataProperty(512, DataPropertyAttribute.SQLITE_TYPE.TEXT, true, false)]
public string Remarks { get; set; }
}
/// <summary>
/// Delete Master Data . Ensure that the data is not deleted
/// マスターデータを削除。削除されないこを確認。
/// </summary>
/// <param name="masterData"></param>
public static void DeleteMasterData(MasterData masterData)
{
DataAccess.Instance.Init(typeof(MasterData));
// Please check the log that was not deleted .
// 削除されないことをログで確認してください。
DataAccess.Instance.Delete(masterData)
}
ログを確認すると削除されていないことが確認できます。
データ更新編はここまでになります。
これでこのライブラリについての紹介はたぶん終わりです。
使っていて使いにくい部分等あると思いますが、そこは自分自身の手で改修してみてください。
要望があったらとも思いましたが、そもそもこのブログを見ている人がいるかどうか...
関数の使い方をまとめようと思いましたが、いつかはやると思います。いつかは...
終わり
UnityでSqliteを自動化 ~データ取得条件指定編~
データ取得編の記事の続きです。
UnityでSqliteを自動化 ~データ取得編~ - 湯呑み茶碗の開発日記
この記事ではデータを取得する方法について紹介しました。
今回はデータを取得する際に条件を指定したり、テーブルを結合していきたいと思います。
前回と同じく「SqliteTableService.cs」を見ていきます。
取得条件指定
データを取得する際に条件を指定している関数部分に着目していきます。
/// <summary>
/// Get to sort the master data
/// マスターデータをソートして取得
/// </summary>
/// <param name="masterCategory"></param>
/// <returns></returns>
public static List<MasterData> GetMasterDataList(string masterCategory)
{
DataAccess dataAccess = DataAccess.Instance;
// Init
dataAccess.Init(typeof(MasterData));
dataAccess.AddCondition("MasterCategory", masterCategory, typeof(MasterData), true);
// Set the sort item
// ソート項目を設定
dataAccess.AddOrderByColumns("Seq", typeof(MasterData), true);
dataAccess.AddOrderByColumns("MasterCategory", typeof(MasterData), false);
return dataAccess.GetDataList<MasterData>();
}
この関数では条件指定とソート指定を行っています。そして実行されたSqlite文がこちら。
昇順のソートと、確認のため降順ソートをしてデータを取得するとこんな感じです。
シーケンス(Seq)のソート方向でデータの取得順が変わっていることが分かります。
昇順
降順
テーブル結合
次はテーブルを結合してデータを取得している関数に着目していきます。
ここからはSqliteの構文に関する知識が若干必要になってきます。
/// <summary>
/// Get the character data that brute string to PartyId
/// パーティーテーブルに紐づくキャラクターデータを取得
/// </summary>
/// <param name="partyId"></param>
/// <returns></returns>
public static List<CharacterData> GetPartyCharacterList(string partyId)
{
DataAccess dataAccess = DataAccess.Instance;
// 最初にセレクトしたいテーブルで初期化
dataAccess.Init(typeof(PartyTable));
// It performs an internal table joins in PartyId
// PartyIdでテーブルの内部結合を行う
dataAccess.AddJoinTable(typeof(PartyTable), typeof(PartyCharacterTable), "PartyId");
// It performs an internal table joins in CharacterId
// CharacterIdでテーブルの内部結合を行う
dataAccess.AddJoinTable(typeof(PartyCharacterTable), typeof(CharacterData), "CharacterId", "CharacterId");
// Set condition
// 条件を指定する
dataAccess.AddCondition("PartyId", partyId, typeof(PartyTable), true);
// Get the bound table
// 結合したテーブルを取得
DataTable dataTable = dataAccess.GetDataTable();
// Get the PartyTable from the combined table
// 結合されたテーブルからPartyTableを取得
List<PartyTable> partyTableList = DataBinding<PartyTable>.DataTableToObjectList(dataTable);
// Get the PartyTable from the combined table
// 結合されたテーブルからCharacterDataを取得
List<CharacterData> characterDataList = DataBinding<CharacterData>.DataTableToObjectList(dataTable);
return characterDataList;
}
この関数では2つのテーブルと結合し合計3つのテーブルからデータを取得しています。そして実行されたSqlite文がこちら。
取得されたデータがこちらになります。デバッグで確認するとデータが取れていることが確認できます。
パーティーに設定されているキャラクターリストを取得することを想定しています。
ソーシャルゲームによくあるパーティー構成を想像して頂くとわかりやすいかもしれません。
もうちょっと続きます。
UnityでSqliteを自動化 ~テーブルクラス作成編~
この記事の続きです。
UnityでSqliteを簡単実行 ~準備編~ - 湯呑み茶碗の開発日記
今回はテーブルクラスの作成規則について紹介していきます。
DataAccess属性について
DataAccess属性は作成したテーブルクラスに設定してください。
DataAccessのプロパティは以下のようになっています。
- TableName ・・・ 接続するテーブル名
実装例
/// <summary>
/// Table class of CharacterTable
/// CharacterTableのテーブルクラス
/// </summary>
[DataAccess("CharacterTable")]
public class CharacterData : TableBase
{
// 各プロパティを実装
}
継承しているTableBase について
TableBaseは更新日、作成日のプロパティを持っています。これはテーブルクラスを実装する場合に必ず継承してください。
テーブルを作成する場合も必ず更新日、作成日を実装してください。
/// <summary>
/// テーブルのベースクラス
/// Base class of table
/// </summary>
public class TableBase
{
[DataProperty(15, DataPropertyAttribute.SQLITE_TYPE.DATETIME, false, true)]
public DateTime CreateDate { get; set; }
[DataProperty(15, DataPropertyAttribute.SQLITE_TYPE.DATETIME, false, true)]
public DateTime UpdateDate { get; set; }
}
テーブルクラスに実装するプロパティについて
テーブルクラスに実装するプロパティの名前は、データベースに実装されている列名と同じ名前で実装してください。
画像と合わせた実装例←雑すぎ
DataProperty属性について
DataProperty属性はテーブルクラスに実装されているプロパティに設定してください。
設定されていない場合はデータベースのテーブルに実装されていないプロパティとなります。
DataPropertyのプロパティは以下のようになっています。
- MaxLength ・・・ プロパティで持てる最大文字数。
- SqliteType ・・・ データベースで実装している型に対応する列挙値。
- NullOk ・・・ データベースでNULL値を許可するかどうか。
- IsPrimaryKey ・・・ プライマリキー設定であるかどうか。
実装例
// プライマリキーを設定する場合。
[DataProperty(5, DataPropertyAttribute.SQLITE_TYPE.TEXT, false, true)]
public string CharacterId { get; set; }
// テキストを実装する場合
[DataProperty(128, DataPropertyAttribute.SQLITE_TYPE.TEXT, false, false)]
public string Name { get; set; }
// 数値型(int,float,double等)を実装する場合
[DataProperty(6, DataPropertyAttribute.SQLITE_TYPE.NUMERIC, false, false)]
public int Hp { get; set; }
// 日付を実装する場合
[DataProperty(15, DataPropertyAttribute.SQLITE_TYPE.DATETIME, false, true)]
public DateTime UpdateDate { get; set; }
// bool型を実装する場合
[DataProperty(1, DataPropertyAttribute.SQLITE_TYPE.BOOLEAN, false, false)]
public bool ClearFlg { get; set; }
// List<string>を実装する場合。多分滅多にないと思います。
[DataProperty(16, DataPropertyAttribute.SQLITE_TYPE.ARRAY, false, false)]
public List<string> IdList { get { return _ItemIdList; } set { _ItemIdList = value; } }
public List<string> _IdList = new List<string>();
これらを踏まえて実装されているクラスが「SqliteComponent」フォルダにあります。
わからなかった場合は「SqliteComponent」フォルダのサンプルクラスを見よう見まねで試してみてください。
UnityでSqliteを自動化 ~データ取得編~
前回の記事の続きです。
UnityでSqliteを自動化 ~準備編~ - 湯呑み茶碗の開発日記
前回の記事ではライブラリを使用する準備まで行いました。
今回は実際にデータベースを操作していきます。
データベースに関する操作をまとめている「SqliteTableService.cs」を見ていきます。
このファイルにはデータの取得、登録、更新、削除などテーブルデータ操作を行う関数がまとめられています。
データベースからデータ取得
データを取得している関数部分に着目していきます。内容はコメントの通りではありますが紹介していきます。
/// <summary>
/// Select Example
/// キャラクターデータを取得
/// </summary>
/// <returns></returns&ghttp://blog.hatena.ne.jp/yunomichawan/yunomichawan.hatenablog.com/edit?entry=10328749687183772131#wysiwygt;
public static List<CharacterData> GetCharacterDataList()
{
// SelectExample1
// 1.Initialized with the table you want to select
// 1. 取得したいテーブルで初期化
DataAccess.Instance.Init(typeof(CharacterData));
// 2.Run the select statement that is automatically generated in accordance with the table. It gets the data .
// 2.テーブルに合わせて自動生成されたselect文を実行し、データを取得します。
List<CharacterData> characterDataList = DataAccess.Instance.GetDataList<CharacterData>();
// SelectExample2
// 1.Initialized with the table you want to select
// 1. 取得したいテーブルで初期化
DataAccess.Instance.Init(typeof(CharacterData));
DataTable dataTable = DataAccess.Instance.GetDataTable();
List<CharacterData> characterDataList2 = DataBinding<CharacterData>.DataTableToObjectList(dataTable);
// SelectExample3
// Run the SQL statement that was created .
// 作成されたSQL文を実行します。
List<CharacterData> characterDataList3 = DataAccess.Instance.GetDataList<CharacterData>("select * from CharacterTable");
// SelectExample4
// Run the SQL statement that was created .
// 作成されたSQL文を実行します。
DataTable dataTable2 = DataAccess.Instance.GetDataTable("select CharacterId,Name from CharacterTable");
List<CharacterData> characterDataList4 = DataBinding<CharacterData>.DataTableToObjectList(dataTable2);
return characterDataList;
}
データを取得する例として4つが挙げられています。
データ取得例その1
1つ目が、このライブラリで最もシンプルな取得方法です。
// SelectExample1
// 1.Initialized with the table you want to select
// 1. 取得したいテーブルで初期化
DataAccess.Instance.Init(typeof(CharacterData));
// 2.Run the select statement that is automatically generated in accordance with the table. It gets the data .
// 2.テーブルに合わせて自動生成されたselect文を実行し、データを取得します。
List<CharacterData> characterDataList = DataAccess.Instance.GetDataList<CharacterData>();
取得したいテーブルクラスで初期化して、データをリストで取得します。と書くだけです。
これを実行した際に作成されるSqlite文はログに出力されているので確認してみてください。
取得されたデータがこちらになります。デバッグで確認するとデータが取れていることが確認できます。
データ取得例その2
2つ目が、DataTable型にデータを入れてそこからリストに変換する方法です。
// SelectExample2
// 1.Initialized with the table you want to select
// 1. 取得したいテーブルで初期化
DataAccess.Instance.Init(typeof(CharacterData));
DataTable dataTable = DataAccess.Instance.GetDataTable();
List<CharacterData> characterDataList2 = DataBinding<CharacterData>.DataTableToObjectList(dataTable);
取得したいテーブルクラスで初期化して、DataTable型にデータを入れ、そこからリストに変換しています。
この時に作成されるSqlite文は、その1と全く同じなので省きます。
取得されたデータがこちら。データの内容はほとんど変わりません。
データ取得例その3
3つ目が、自分で作ったSqlite文を実行して、データを取得する方法です。
// SelectExample3
// Run the SQL statement that was created .
// 作成されたSQL文を実行します。
List<CharacterData> characterDataList3 = DataAccess.Instance.GetDataList<CharacterData>("select * from CharacterTable");
単純に自分で作ったSqlite文を実行するだけです。
個人的にはこの方法はお勧めしません。このやり方を様々なテーブルクラスで行ってしまうとSqlite文の管理が面倒になってしまいそうなので…
もし使用するとなった場合はサブクエリを使わないといけない状況になると思います。
取得されたデータがこちら。データの内容はほとんど変わりません。
データ取得例その4
4つ目がその2とその3を組み合わせたものです。趣向を変えてSqlite文を変更してみます。
// SelectExample4
// Run the SQL statement that was created .
// 作成されたSQL文を実行します。
DataTable dataTable2 = DataAccess.Instance.GetDataTable("select CharacterId,Name from CharacterTable");
List<CharacterData> characterDataList4 = DataBinding<CharacterData>.DataTableToObjectList(dataTable2);
今回は2つの列しかセレクト対象にしていないので、取得されたデータが変わっています。
取得されたデータがこちら。今回セレクトした「CharacterId」と「Name」以外は取得されていないことが確認できます。
単純にデータを取得するのはこんな感じでできます。次はデータ取得時に条件を指定していきたいと思います。
UnityでSqliteを自動化 ~準備編~
今回作ってみたUnityのライブラリはSqliteに関するライブラリです。今更感や出し尽くされた感じではありますが気にせず紹介していきます。
ということでまずはこちらのサイトからライブラリ一式をダウンロードしてください。
GitHub - yunomichawan/ConvenientSqliteForUnity
ライブラリに含まれているサンプルソースを見れば大体わかると思います。
いまいちやっていることがわからないという方は続きを見てみてください。
そしてUnity上に配置するとおそらくこんな感じになると思います。
フォルダー配置はそのまんまです。
オブジェクトは「DataAccess」と「SqliteTestScript」が増えています。それぞれのコンポーネントに名前に対応したクラスがアタッチされています。
Sqliteの配置に関してはこちらのサイト様で紹介されていますので、わからない方はこちらのサイトを参考にして配置してみてください。
ライブラリ一式に含まれているデータベース(Sample.db)の中身を確認してみるとこのような感じになっています。
データベースの構成、持っているデータなどに関しては紹介する用に作成されていますのでだいぶ適当です。
Sqliteを使う際にデータベースの中身を確認したいという方がいらっしゃると思います。
私は「DB Browser for SQLite」というソフトを使用しています。ソフトで使用されている言語は全て英語ではありますが直観的な操作でテーブルの作成、データ作成ができるので非常に使いやすいなーと個人的には思っています。
DB Browser for SQLite - 窓の杜ライブラリ
ひとまず準備編ということで今回はここまでとします。次はデータ取得方法をまとめていきます。