主なコンテンツ

〜主なコンテンツ〜

1. Unityで製作したゲームと製作Tips
  1. 三月精チャレンジ(東方Project二次創作)
    1. 作り方
  2. 英語学習2D(オリジナルスマホアプリ)
2. UE4
3. ゲームアプリ見学
4. Bitbucket & SourceTreeでの一連の流れ
  1. 前半
  2. 後半
5. Tips
  1. UnityのTips
  5. SQL文のTips
  6. Final IK
  7. GearVR+Unity
ラベル DB の投稿を表示しています。 すべての投稿を表示
ラベル DB の投稿を表示しています。 すべての投稿を表示

2016年4月22日金曜日

ScriptableObjectのListにクエリやラムダ式を使ってみる

前回ScriptableObjectを作成したが、今回はそのListから任意のデータや並び替えを行いたい。下記は実際にラムダ式を使ったクラスの一部抜粋である。名前空間にSystem.Linqが必要になるので、忘れないように注意。


14行目:FindAll

ここでは、現在選択中のカテゴリIDと一致する設問データを抽出している。カッコ内左側で任意の名前の仮引数を作り、=> の右側に条件文を書く。これが基本的なルールであり、割と気軽に使える。


18行目:OrderBy

 OrderByは任意のパラメータの昇順で並び替える。上記同様、カッコ内の左側が仮引数、右側が条件文。ここではDateTime型のパラメータで並び替えている。

OrderByは元のListを変更せずに、並び替えた仮想のリストを返してくる。この型は今の所よく分わからないのでvarで受けている IOrderedEnumerable<T>。Listに使えるメソッドは使えず、IEnumerableクラスのクエリメソッドが使える。詳しくはこちらソートが実際に行われるのはForeachなどで列挙操作が行われた時なので注意が必要。よって列挙操作なしに並び替え後の要素を取り出すことができない。

<追記>

ちなみにGuidと組み合わせることで、セキュリティ性能の高いシャッフルを実装できる(参考)。なお、UnityではSystem.Guidとする必要があった。

2016年4月21日木曜日

SQL文のTips


  •  タイムスタンプが日本時間にならない

    • localtimeが必要(参考

  • Default Valueでデータを作成したい

    • INSERT INTO テーブル名(要素名) VALUES (値) を使う(参考

2016年4月20日水曜日

SQLiteの読み書き

■読み込み

前回やった内容を少し発展させ、inspectorからではなくSQLiteのデータベースファイルからidを参照する。データベースは暫定的に次のようにした。


この値を取ってくるには次のようにする。


これによりデータベースに保存されているIDの内容を表示することが可能となった。


■書き込み

メニューのボタンを押したとき、データベースを更新するようにする。ボタンを押すと、下記のSellectメソッドが呼び出されるようにした。データベースの書き換えは2~6行目で行われている。



■まとめ

ここまでで作った内容は下図である。メニューのボタンの内容はScriptableObjectを参照している。ボタンを押すとデータベースのselectingIDが更新される。ホーム画面上部にある文字はデータベースのselectingIDに応じて内容が変わる。


なお本筋は、NPOIの使い方、ScriptableObjectの使い方、SQLiteの使い方、必要となるエディタ拡張の説明なので、それ以外の部分は説明を割愛した。

2016年4月19日火曜日

SQLiteUnityKitを使う with Mac(データーベース用意編)

データベース作成


作成

SQLite対応のGUIを使った方が容易なので、今回はLitaを使用し作成する。直感的に分かりやすいインターフェイスなので説明は割愛。
テーブルの作成やパラメーターの編集が容易。ただし、作成したパラメータのNullの許容などは後から変更できない模様。

後で要素を足したりする可能性を考えて、Default Value(初期値)を設定しておいたほうが良い。後々要素を足した時にクエリ(検索)で抽出できなくなる事態を避けられる。

〜DATE型の注意点〜

SQLiteにおけるDATE型は正確には決まっていない参考)。DATE型の初期値は"2000-01-01"のような形で入力できた。


ただし、最初はLitaでも2000-01-01と表示されていたのに、途中から何故か表示されなくなった(値はちゃんと保持している)。また、SQL文で現在時刻を入力するとDouble型で入力される。型を統一しないと、C#側で使うのが非常に厄介である。

最終的にTEXT型で保存し、C#側でdatetime型に変換するようにした。この場合、現在時刻を打刻するとちゃんと"2000-01-01 00:00:00"のような形で保存される。なお、日付によるソートは、DBではなくC#側のListで行うことにした。

〜閑話休題〜

作成が終わったらExportで出力可能。ただし、このとき拡張子をつけてないとただのテキストファイルになる。ターミナルから作成した場合は不要らしい。拡張子は.dbや.sqlite3にするのが一般的とのこと。


また、Lataではデータの編集も容易なので、単純なものであればこれで作ってしまった方が早い。SQL文も使うことができ、意図した動作をしているかチェックできるので重宝する。


ターミナルについて

一応、Litaが出力したファイルがsqlite3なのか確認してみた。ターミナルはアプリケーションのユーティリティの中にある。ターミナルが起動したらsqlite3と入力した後、半角スペースを入れてからデータベースファイルのパスを入力する。

パスにスペースの含まれるフォルダが含まれているとアクセスできなかった。その場合は、デスクトップなどに一旦移すと良い。入力が終わったらエンターを押す。
これにより、Macに標準搭載されている現在のSQLiteのバージョンが確認できる。ちゃんとアクセスできている場合、.databaseを入力してエンターを押すと上図のようにfileのパスが表示される。終了する場合は.exit。

SQLiteUnityKitを使う(SQLiteUnityKit導入編)

参考

  1. 導入編
    1. Mac寄りの解説
    2. Windows寄りの解説
  2. SQLite対応のGUIの検討
    1. 過去の記事(SQLite対応のGUI)
  3. C#とSQLiteについて
    1. 過去の記事(C#によるSQLiteの操作)
  4. UnityとSQLiteについて
    1. 過去の記事(SQLiteとUnity)
  5. データベースの周辺知識
    1. 過去の記事(データベースの種類や用語)

注意

Build SettingのプラットフォームがWeb Playerだとエラーが出る(参考)。

本題


1. SQLiteUnityKitの導入

冒頭参考の「導入編」リンク先の解説に従い、SQLiteUnityKitを自身のProjectに加える。ただし、SqliteDatabase.csには知っておくべき内容があるのでチェックした方が良い。下に示すのはSqliteDatabase.csのコンストラクター(初期化)を抜粋したものである。


注意点

  1. 冒頭参考の「UnityとSQLiteについて」で語られていた内容がここに当たる
    1. Android端末はStreamingAssetsに直接アクセスできない
    2. データベースをPersistentDataPathにコピーする
    3. これによりAndroid・iOS共に同じ記述で処理できるようになる
  2. コピーが起きる条件は下記のいずれかである(上記スクリプトの9行目)
    1. 引数で受け取った名前のファイルがPersistentDataPathに無い場合
    2. ファイルの更新日を比較して、PersistentDataPathの方が古い場合

特にファイルの更新日でデータベースが上書きされてしまうのが厄介。File.Copyの第3引数のtrueは「上書き保存を許可する」の意味である。これにより、端末に保存したユーザーデータが簡単にリセットされてしまう。

コピー条件の後者は削除して、「ファイルが存在しない時のみコピー」とした方が無難。完全に書き換えたい場合は、PersistentDataPathのファイルを削除すれば良い。これにより同名のファイルが無くなるので、StreamingAssetsからコピーされる。なお、こちらのサイトでは引数を増やして対応していた。

2015年4月2日木曜日

SQLite対応のGUI


SQLiteの操作

  • create
    • intとintegerの違い
      • 参考
        • integerはrowidが作られない
        • intはrowidが作られる
        • Litaはrowidを表示しない
  • insert
    • 参考①
    • 参考②(serectサブクエリも?)
      • inset into table select 〜;
        • selectで抽出した内容を指定先にinsertする
  • select
    • 参考
      • 〜を含む行ではなく、列を返してくる?
      • コマンドは分かったがC#でどう返ってくるのかは分からず。
    • 関数による抽出
      • 参考
        • 日付はSQLで取得して保存すれば出来そう
          • insert into User(date) select current_date;でいけた!
    • order by
      • whereとorder byの両立
        • SELECT * FROM Rank  where selectable="true" order by chiID desc;でいけた!
    • 条件の複数指定
      • その他
        • command.CommandText = sql;
        • SQLiteDataReader sdr = command.ExecuteReader()
        • 条件に該当したものが配列で複数返ってくる模様。
          • これをforeachでレコード単位で抜き出す
          • カラムの要素は sdr["カラム名"] のようにやる模様。
          • これ以上は聞いた方が良さそう。
            • 驚く程情報が無い。SQLiteではなくSQLで検索すれば引っかかるのだろうか。
    • upset文
      • 参考①
      • 参考②
      • 参考③(教えてgoo)
      • これは単に制約のあるカラムに入力するとき重複でエラーが出るのを避けるためのものっぽい?
        • replace into Que (rankID, queID) VALUES (1,1);とやったら増えた。やはり制約必要そう。
        • あくまで制約のある要素が重複していたらdeleteして、入力された内容で新たにinsertしているだけのよう。(参考
    • update
    • 結合
      • 内部結合
        • 両方に指定した要素があるレコードを結合して抽出。
        • よってNULLは発生しない。
          • SELECT * FROM Que INNER JOIN Rank ON Que.rankID = Rank.rowid;でいけた!
      • 外部結合
        • LeftOuterJoin
          • 左テーブルの要素を全部抽出し終わってから、右テーブルの一致要素を結合する。
          • そのため右テーブルの内容にNULLが含まれることがある。
        • RightOuterJoin
          • 右テーブルの要素を全部抽出してから、左テーブルの一致要素と結合する。
          • そのため左テーブルに NULLが含まれることがある。
      • 結合の仕方の違い
        • 参考(説明として一番分かりやすい!)
      • その他イメージ
        • 参考(動物の分類を例にしたもの)
    • 制約
      • 参考
        • primarykey
          • テーブルに1つだけ
          • NULLを許容しない
          • AutoIncができる
        • unique
          • テーブルに複数可能
          • NULLを許容する
    〜その他〜
    • C#で.dbの作成?②
    • 海外
    • SQLite利用の基本的な流れ
      • 参考(とても分かりやすい)
    • 基本文
      • command.ExecuteNonQuery()
        • SQLの実行結果が必要ない場合に使用
      • command.ExecuteReader() 
        • 実行結果が必要な読み込み

      SQLiteとUnity


          2015年3月18日水曜日

          データベースの種類や用語

            • スキーマ(Schema)
              • DBの「構造」のこと
            • パーサ
              • 一定の構文で書かれたテキストを解析するプログラムまたは処理のこと

              2015年2月25日水曜日

              要約


              各要素
              • .assetの生成・ロード
                • AssetDatabase
                  • 生成:CreateAsset
                  • ロード:LoadAssetAtPath
                  • セーブ:CreateAsset
                  • 追加:AddObjectToAsset
              • xls/xlsxの読み書き
                • NPOI
              • xls/xlsxのインポート・更新の管理
              • ScriptableObjectの生成

              主な流れ