実行時のために最適なデータ構造を作成しよう

14,124 views

Published on

メガUnityミートアップ2012 ライトニングトーク
「実行時のために最適なデータ構造を作成しよう」

Published in: Technology
0 Comments
31 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
14,124
On SlideShare
0
From Embeds
0
Number of Embeds
902
Actions
Shares
0
Downloads
69
Comments
0
Likes
31
Embeds 0
No embeds

No notes for slide

実行時のために最適なデータ構造を作成しよう

  1. 1. 実行時のために最適なデータ構造を作成しよう泥臭い世界と決別するためのエディタースクリプト活用法
  2. 2. リソースのロードとセットアップの話キャラクターの顔画像 ( 連番 ) ファイルをプログラムで制御して表示したいCSV や XML ファイルに吐いたデータをゲームで利用したい
  3. 3. 普通に考えると実行時に画像ファイルを取得 “/hoge/fuga/chara_%s/face_%d.png” ← キャラ ID と表情 ID を入れ ればいいから簡単じゃない?CSV/XML テキストデータを TextAsset として取得 実行時にパースして読み込み
  4. 4. ちょっとまったー!
  5. 5. それってゲーム内でやりたいですか?テキストのパース=ゴミ出まくりゲーム中のデータ構造が元データに制約される遅いワークフローにも影響ありまくりビルド時に問題を発見出来ない
  6. 6. わがままを成立させたい実行時:ゲームシステムから使いやすいこと、速いこと、シンプルなことが重要ファイル管理:作る時のワークフローが簡単なこと、複雑なルールがないこと、すぐ反映出来ることが重要 どちらも満たすって難しい!
  7. 7. そもそも違う問題なのです「ファイルをどこに置くか、どれを読むか」= アセットパイプラインの問題「ゲームで使うデータ構造 ( クラス構造 ) 」=ゲーム設計の問題 一挙に解決するのが難しいのはこれが理由 しかし!
  8. 8. 一挙に解決する必要などない!
  9. 9. 実行時:理想のデータ構造でどうぞファイル管理:エディタースクリプトで!ファイル管理:エディタースクリプトで!
  10. 10. XmlToCustomAsset( サンプル )https://github.com/unity3d-jp/XmlToCustomAsset
  11. 11. Demo
  12. 12. AssetPostProcessor を使おう!拡張子に関係なく対応!ここからデータを読んで、プログラムから .assets を作ればよい!CSV や XML のパースはエディターで!
  13. 13. OnPostprocessAllAssets static void OnPostprocessAllAssets ( string[]importedAssets, string[] deletedAssets, string[]movedAssets, string[] movedFromAssetPaths) { foreach (string str in importedAssets) {if(str.LastIndexOf(".xml" ) != -1) {Debug.Log("Reimporting:"+str);XMLToCustomAsset.CreateCustomAssetFromXml(str); } }
  14. 14. .assets って何?.assets とは、本当はシリアライズされたインスタンスのコンテナAssetDatabase から作成なんでも保存出来ちゃう!中身も見られる
  15. 15. 実行時のデータ構造t { public Color color; public string messages; public MyCustomAss ロード処理の必要なし!
  16. 16. 実行時の利用法 public MyCustomAsset myData; publicGUIText guiText; // Update is called once perframe void Update () { if(null != myData) { guiText.text = myData.messages; } } 面倒な処理なし、 D&D も可能
  17. 17. .asset からのオブジェクトの読みだしObject objCustom = AssetDatabase.LoadAssetAtPath(save_path,typeof(MyCustomAsset)); AssetDatabase から、アセットのパスと読み出したい型を指定して LoadAssetAtPath を呼ぶことで、そのアセットファイルに保存されている 任意の型のデータを取ってくることが出来ます。
  18. 18. オブジェクトの追加とセーブext(ta); if(null != a) { AssetDatabase.CreateAsset( a, save_pass ic in a.inner) { AssetDatabase.AddObjectToAsset(ic, save_path
  19. 19. リプレースではなく変更しようシーン内のオブジェクトから .asset 内のオブジェクトを参照している時に、 .asset のオブジェクトを削除&再作成すると参照が切れてしまいますすでにあるオブジェクトは、これを取得して編集・保存するようにしますオブジェクトがすでに存在するかは、 AssetDatabase.Contains() を使う事でチェックできます
  20. 20. ScriptableObject を使おう ScriptableObject.CreateInstance<MyCustomAsset> () - .asset に保存するオブジェクトで、 Unity のクラスを継承しな いようなものは、 .asset に保存可能にするために ScriptableObject を継承します。 - ScriptableObject の生成に は、 ScriptableObject.CreateInstance() を使用します。
  21. 21. Happy game development ! :)

×