Google

2012年9月16日日曜日

Unityでコインゲー開発:保存その3

似たようなが続いてますが、セーブロード話はこれが最後です。

まずは前回1つだけ書いてなかったサーバとのデータの同期について。
高速で動作するゲームにいきなり情報を更新しようとすれば大問題になるのは当然。
ではどこでやるべきなのか?その可能性があるのはこのへんでしょう。

  1. ローディング完了直後
  2. スタートが押された直後
  3. オプションやアイテムなどの2D画面遷移時

どれをとってもユーザに迷惑となるタイミングです。
遊ぼうと思った瞬間に同期で待たされるのでは萎えてしまいますよね。

特に地下鉄やビルの中に入った瞬間に同期が始まると最悪で、UnityのWWWは全くと言っていいほどタイムアウトしてくれません。
これを防ぐには、通信制御実装クラスにおいてWWWクラスを制御する部分をタイムアウトで諦めるような造りにする必要があります。
できればサンプルで解説したい所ですが、ノウハウが出しづらい内容なのでこのへんで。


さて、コインゲームにおける永続化について今まで色々と解説してきましたが、商品のクオリティとして最も注意しなければいけないのがこの保存です。

どこに保存されるのかとか使える機能は他のブログでよく出ているので割愛。
もしUnity側でセーブを実装するなら考えることも別途発生します。
その際やっておいた方が良いという項目はこのあたり。

  1. バックグランドに遷移した際の暗黙セーブ
  2. バージョンによるデータ構造相違の管理

まずは1.のバックグランド。
MonoBiehviourにはアプリ自身が背後に遷移した際のタイミングを取るイベント関数があります。
これを使うのが便利ではないでしょうか。

 MonoBehaviour.OnApplicationPause

正確にはポーズが掛かったタイミングという意味なのですが、実際には以下に挙げるタイミングで飛んできます。

  • ホームボタンを押されてアプリが背後に回った時
  • UnityEditorのWindowが他のアプリの背後に回った時

前者は非常に嬉しいタイミングです。
ユーザへの負担もなく、安心してセーブ作業ができるのではないでしょうか。
2番目はUnity使っていると分かるのですが、Editorで実行中に別ウィンドウが被ると止まってしまうという仕様、あのタイミングです。
予期しないところで勝手に保存っていうのもテストにはよろしくないので、以下のようにプリプロセッサで閉じてしまうのがよろしいかと。

 #if UNITY_EDITOR
 void OnApplicationPause()
 {
   // ここにセーブ処理を記載する
 }

 #endif


上記を含めたUnityで使える定義などはこちらからどうぞ。

続いて2.のバージョン管理。
これは内部データ構造に変化が発生した場合に重要です。
簡単に言うと、バージョン情報を保存しておいて、データ構造が変わった際にコンバート処理をしてあげるというもの。
一見単純そうですが、これを忘れるとバージョンアップ版配布開始時にデータ不整合で遊べなくなる人が出まくって大変なことになったりします。

そしてこれを防ぐ方法は単純、セーブ情報にバージョン情報をつけること。
全てに入れなくても1個だけあれば後は不正扱いでいいんじゃないかと。
最初にチェックしてバージョンを見て、データ変換などを挟むようにしましょう。


セーブ話はここまで。
ネタも大分付きてきましたがもう少し開発の話は続きます。

0 件のコメント:

コメントを投稿