質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

3回答

2356閲覧

unity アプリクラッシュ時にセーブが巻き戻る

sakuman

総合スコア8

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2018/10/10 08:49

編集2018/10/11 05:20

前提・実現したいこと

unityで作成したゲームアプリがクラッシュした時、
前回終了時の状態までセーブが巻き戻るという報告が複数上がっており対策を行いたい

試したこと

セーブにはPlayerPrefsを使用しています。
PlayerPrefs.Save();
を一定間隔で実行していますが(実行間隔はおよそ2分毎+シーン切り替えがある度に実行)
それにもかかわらずクラッシュでセーブが巻き戻ります。
クラッシュ以外ではセーブに問題は発生していません。

そもそもクラッシュしないようにするべきなのは承知しており、現在対応中ですが
あらゆる環境で確実にクラッシュしないようにするのは当方技術的に厳しいので
せめてセーブの巻き戻りだけでも発生しない、あるいは巻き戻りの発生頻度を下げる対策を行いたいです。

なお、セーブをオンラインで管理に変更するという案は×とさせてください。
よろしくお願いします。

###コード

unity

1public class functions : MonoBehaviour { 2 //変数定義、他の関数は今回の質問とは無関係なので省略 3 //他の全てのクラスはこのfunctionsを継承させています 4 public void save(){ 5 6 //セーブ時は必ずこの関数を使用します 7 //int配列を扱うためPlayerPrefsを拡張しています。(PlayerPrefsX) 8 int[] savedata = new int[675]; 9 // 10 //ここでsavedataに値をセット。内容は省略 11 // 12 PlayerPrefs.SetString("uuid",uuid); 13 PlayerPrefsX.SetIntArray("systemdata",savedata); 14 PlayerPrefs.Save(); 15 16 } 17}

補足情報(FW/ツールのバージョンなど)

Unity 2018.1.0f2 Personal(64bit)
使用言語 c#

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

(※初心者が気になってちょっと調べたぐらいなので、間違っていたらごめんなさいな回答です)

引用元: PlayerPrefs.Save - Unity Documentation
By default Unity writes preferences to disk during OnApplicationQuit(). In cases when the game crashes or otherwise prematuraly exits, you might want to write the PlayerPrefs at sensible 'checkpoints' in your game. This function will write to disk potentially causing a small hiccup, therefore it is not recommended to call during actual gameplay.

スクリプトリファレンスを見た感じ、ゲーム中に呼び出すのはあまり推奨されていないような気がします。
causing a small hiccup とあり、PlayerPrefs.Saveを使っても正しく保存されないことがあるのではないでしょうか。
(※英語苦手なので認識が違ったら申し訳ない)

それゆえ、2時間前の正しく保存されたデータまで巻き戻るとか。

次のような感じで調査してみてはどうでしょう(※解決方法ではない):
2分ごとにセーブされるデータをとっておき、しばらくしてわざとクラッシュさせ、そこで巻き戻っていれば、その前に取った2分ごとのセーブデータが正しく保存されたものか確認する。

具体的な解決方法は、自前でセーブすることぐらいしか思いつきませんが、
セーブ間隔を伸ばしてみたりして試行錯誤するか、Unityに問い合わせてみるかとか、そういう方法もあるかもしれません。

投稿2018/10/29 12:22

編集2018/10/29 12:25
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sakuman

2018/11/03 16:15

回答ありがとうございます。 おっしゃる通り、自力で解決を図るならばそのように検証するしかないかなと思っていました。急を要する問題では無いので、時間をかけてみようと思います。 残念ながら今回は問題の解決には至りませんでしたが、問題解決に向けたアドバイスを頂けた点からベストアンサーに選ばせていただきます。
guest

0

そのセーブを行う際、ファイルクローズは行ってますか?
クラッシュやエラーでクローズが行われない場合はファイル操作は無効となる場合があります
#必ずしもそうなるわけでもない

投稿2018/10/10 08:54

y_waiwai

総合スコア87719

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sakuman

2018/10/10 12:33

PlayerPrefsの話でしょうか? 申し訳ございませんがリファレンスや技術系ブログを探してもそれらしい記述が見つけられなかったので、 詳しく教えて頂けると助かります。
guest

0

PlayerPrefsを変更した直後にPlayerPrefs.Save();を行っておりますでしょうか?
(ちなみに、それ以外で実行する必要はありません。そもそも変更が無いので無意味です)

投稿2018/10/11 03:28

fiveHundred

総合スコア9774

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sakuman

2018/10/11 05:08 編集

はい。 PlayerPrefs.Save();についてしか言及していませんでしたが、 値の更新とSaveは全てセットで毎回行っています。 ここで言う巻き戻りとは、およそ2分間隔でセーブを行っているにも関わらず、クラッシュで数時間分のアクションが無かったことになってしまう(前回アプリ終了時の状態まで戻る)現象の事をさしています。クラッシュせずに正しい手順でアプリを終了させた場合はセーブが正常に行われているので、基本的なPlayerPrefsの使用法は守れていると思います。 ※使用しているコードを質問文に追記しました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問