読者です 読者をやめる 読者になる 読者になる

【24sec】セーブ問題解決したっぽい!

これはッ!?  前進したっぽいです。セーブ問題!

少なくとも理解は進んだ。すべては、ここのコメントで詳しい状況を書いてくださった方のおかげです。ありがとうございます。

以下に問題の概要と、残った課題をまとめます。

 

Unity開発の初心者はきっとハマる保存の罠

 

巻き戻り問題の原因は、どうもUnityのPlayerPrefという仕組みのようです。このPlayerPrefの弱点はちゃんと補うメソッドが用意されているが、それがEasySave2というアセットで手軽に代用してしまった初心者には、いっそう見えなくなってしまっていた。

Playerprefsを確実に保存する - テラシュールブログ

UnityのPlayerPrefsでデータをセーブする - スマゲ

そもそも、UnityにPlayerPrefという保存機構がありながら、初心者はなぜEasySave2を使ったか。それはPlayerPrefの保存できるデータ型が少なく、EasySave2は多様だからだ。特にたくさんの数値や文字をふくんだ配列を使えるのが大きい。

EasySave2では、その保存先は結局PlayerPrefであるということは明言されていた。暗号化をふくめ、保存の行為がとても楽なのであると。しかし、PlayerPrefは、アプリが終了するときにファイルを更新する仕組みであり、Unityがクラッシュした場合にはデータが破棄されてしまうのだ。そこで、PlayerPrefには、普段使うデータ型と項目名を指定してSaveメソッドとは別に、ファイル更新を命じるメソッドがちゃんと用意されていた。

ファイル更新は、動作速度の問題があるからわざわざ別のメソッドにしているんだろうけれど、利用者の「保存」という概念から言えば、PlayerPrefは「項目別保存」と「ファイル更新」をセット考える仕組みだったんだ。だからEasySave2で項目を保存したら、必要に合わせ、PlayerPref.Save()できっちりファイル更新をしなくてはいけなかったのだと思う。WebPlayerではこれを使って初めて、セーブしたいときにセーブができる。ということのはずだ。

 

オンラインセーブの仕組み完成直後

このことがわかったのは、今日、オンライン保存の仕組みが完成し、ひと通り、自分なりのデバッグが終わったところだった。オンライン保存可能なデータをプレビューアップロードしつつ、次の課題としていた保存バグの究明を再開しはじめたところで氷解。以前は見つけられなかった情報があっさり見つかってしまった。

f:id:joe_sub:20150614234614j:plain

なので、このオンライン保存も公開しようか迷ったのが、バグが無いとも言い切れない。マニュアルセーブなどの保存精度は上がり、巻き戻りは起きづらくなったと思うので、その様子見期間も必要なため、まずはいったんお蔵入りに。

そもそも、保存バグとは別にオンライン保存は考えていたことなので、いずれは公開したいが、急ぐ理由が無ければ、じっくり検討し、間違いの無い形にしたい。

 

あと一つ、残っている課題

今回の更新で巻き戻り問題が減ったと仮定しても、データ関係ではじつはあと一つ、課題が残っている。オンラインの対戦データを管理者で覗いて見ると、名前が「Player」になっている人が若干名いる。これはデフォルトに僕が設定した名前で、本来はKongregateに来た時点でサインインしたユーザ名か、ゲストならGuestといったものに自動置き換えされるはず。それができていないということは、やはりクラッシュなどの何かを原因に特殊な状況に陥ってしまったものと思われる。全体の人数からするとごくわずかだが、原因を引き続き調べたい。

ただ、あまりこの事に因われすぎても、カードセット更新などの大切なゲーム部分が遅れてしまうので、いったんセーブ問題は頭の片隅に置いて、今後はゲーム内容更新に力を向けたい。

 

お詫び

ご迷惑をおかけした方々、本当にすみませんでした。初制作とはいえ、保存関係の詰めが甘かったと思います。マニュアルセーブおよび重要な場面などで PlayerPref.Save() を入れたので、おそらく、安定性は高まったと思います。ただ、EasySave2のサイトにその辺の記述が見つからないので、まだ確証がありません。もしも、また何かありましたらお手数ですがお知らせください。よろしくお願いします。

そしてすみません。 PlayerPref.Save() が無いゆえに、今回のデータ更新作業のとき、プレイ中だった方に巻き戻りが発生した可能性があるかもしれません。お詫びいたします。 m(_ _)m