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

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

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

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

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Unity

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

Q&A

解決済

1回答

5855閲覧

Unity Jsonセーブデータの削除とニューゲーム

Matsuri_

総合スコア15

C#

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

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Unity

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

0グッド

0クリップ

投稿2021/08/14 14:35

編集2021/08/15 14:59

前提・実現したいこと

Unityにてゲームを作っています。
ゲームクリア後に再び最初からゲームを始める際、
リスタートボタンを押したら、
セーブデータ初期化(Jsonファイルの削除など)→ニューゲーム
の実装をしたいです。

現在、Jsonファイルをセーブデータとして使っています。
書き出しと読み込みは、StreamReaderの機能を使っています。
GameManagerクラスのスクリプトにある変数の値を、
SaveDateクラスのスクリプトにそのままコピーして、
それをJsonファイルにしています。

発生している問題・エラーメッセージ

セーブデータを初期化する方法がわからず、困っています。
Jsonファイルの削除(もしくは初期値に書き換える)を行って、
データを引き継がずに最初から始める、という処理をしたいです。。
ですが、下記のように、File.Deleteメソッドを行っても、
Unityフォルダ内にあるJsonファイルが消えていません。
特にエラーメッセージも出ません。
イメージ説明
現在、ニューゲームするときは、Assetsファイルから右クリックで削除してから
始める・・・というようなことをしています。

該当のソースコード

GameManager

1 2 static SaveDate SaveDatedayo = new SaveDate(); //保存場所 3 public int money; 4 5 public void Awake() 6 { 7 DoLoad(); 8 money = SaveDatedayo.money;//お金 9 } 10//・・・中略・・・ 11 public void DoSave() //セーブ処理 12 { 13 SaveDatedayo.money = money; //お金 14     Save(SaveDatedayo); 15 } 16 17public void DoLoad() //ロード処理 18 { 19 SaveDatedayo = Load(); 20 } 21 22 public void Save(SaveDate SaveDatedayo)//セーブのためにJsonファイル書き出し 23 { 24 StreamWriter writer; 25 26 string jsonstr = JsonUtility.ToJson(SaveDatedayo); 27 28 writer = new StreamWriter(Application.dataPath + "/savedata.json", false); 29 writer.Write(jsonstr); 30 writer.Flush(); 31 writer.Close(); 32 33 } 34 35public SaveDate Load()//ロードのためにJsonファイル読み込み 36 { 37 if (File.Exists(Application.dataPath + "/savedata.json")) 38 { 39 string datastr = ""; 40 StreamReader reader; 41 reader = new StreamReader(Application.dataPath + "/savedata.json"); 42 datastr = reader.ReadToEnd(); 43 reader.Close(); 44 45 return JsonUtility.FromJson<SaveDate>(datastr); 46 } 47 48 SaveDate SaveDatedayo2 = new SaveDate(); 49 50 return SaveDatedayo2; 51 52 } 53 54 public void PushRestartButton()//リスタート(ニューゲーム)ボタン 55 { 56 if (File.Exists(Application.dataPath + "/savedata.json")) 57 { 58 File.Delete(Application.dataPath + "/savedata.json"); 59 } 60 Scene ThisScene = SceneManager.GetActiveScene(); 61 SceneManager.LoadScene(ThisScene.name); 62 }

試したこと

上記では、リスタートボタンにつける
PushRestartButtonメソッドの中で、
既存のJsonセーブデータファイルを削除しようとしています。
(が、削除されません)
セーブとロードはうまくいっています。

変数の手動での書き換えによる初期化(SaveDatedayo.money = 0など)
もやろうとしましたが、変数の数が多いので、
この方法では大変だなと思っています。

伝わりにくいかもしれませんが、教えて頂ければ幸いです。
よろしくお願いします。

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

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

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

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

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

YAmaGNZ

2021/08/15 12:19

最初と同じようにnew SaveDate()すればいいだけなのでは?
Matsuri_

2021/08/15 12:43 編集

書き込みありがとうございます。 最初と同じように・・・というのは、 Loadメソッドの部分の、 SaveDate SaveDatedayo2 = new SaveDate(); のことを指していますでしょうか? File.Deleteの部分を下記のように書き換えてみました。 結果はリスタートボタンを押しても変わらずで、変数の値はそのままでリセットされませんでした。 if (File.Exists(Application.dataPath + "/savedata.json")) { SaveDatedayo = new SaveDate(); } (ちなみに、上記に書き忘れていますが、 GameManagerの冒頭で、 static SaveDate SaveDatedayo = new SaveDate(); と記述しています。) 正直、newしたらどうなるか、などまだいまいち理解しきれていないので、 どうすれば正解になるのか、難しく感じています。
YAmaGNZ

2021/08/15 12:52

各変数がどのような働きをするのかは分かりませんが、Loadメソッドでセーブデータのjsonファイルがない場合というのが一番最初にゲームを始めたときなのですよね? SaveDatedayo.money = 0 と各変数をクリアするのは数が多いとのことなので、Loadメソッドで行っていることと同じようにnewして新しくインスタンスを作ればいいのではないかと。 提示されているソースの各メソッドがどのような順序で呼ばれているのかも知りませんので、そのあたりも考えて辻褄があうようにすればいいのではないですか? ファイルが消えないのが何故なのかは分かりませんが、消せないのであれば初期化後、そのデータを保存するなりして、セーブファイルを初期の状態に上書きするなりで対応できそうです
Matsuri_

2021/08/15 14:57

はい、一番最初にゲームを始めたときは、セーブデータのJsonファイルがない状態です。 最初のAwakeメソッドでLoadメソッドが呼び出されます。 そしてもしFileが存在しなかった場合、 SaveDate SaveDatedayo2 = new SaveDate(); で新しくインスタンスを作っている・・・という認識です。 変数は、上記にはmoneyだけ書いていますが、 本当はもっといっぱいあります。 Saveのメソッドはゲームの色々なポイントでこまめに呼び出しています。 以下、再び試した内容ですが、 PushRestartButtonのメソッド内に、 SaveDatedayo = new SaveDate(); というコードを追加し、 その下にSaveメソッドやLoadメソッドを追加してみました。 これはうまくいきませんでした。 現在、ニューゲームをするときは、ファイルがコードから消せないため、 AssetsファイルにあるJsonファイルを右クリックして削除し、 ゲームを最初から始める、ということをしています。 ファイルを消す方法、もしくは、初期化の方法をさらに調べてみようと思っています。。
YAmaGNZ

2021/08/15 15:02

Awakeでセーブデータが格納されているものからゲーム内で使用する変数に代入しているのであれば、その後にセーブデータを破棄して初期化しても意味ないのではないですか? そういった意味で「辻褄があうようにすればいいのではないですか?」と言いました。 ようはセーブデータ格納クラスからゲーム内で使用する変数へ代入するメソッドを用意して、Awakeやデータクリア時に呼べばいいのではないですか?
Matsuri_

2021/08/15 16:01 編集

すみません、先ほど解決致しました。 教えて頂いた通り、新しくインスタンスを作るやり方で大丈夫でした。 newを記述しても、うまく通っていなかった原因は、その前の段階で、別のコードがおかしくなっており、そのエラーメッセージが別のウインドウで出ていたことに気づかなかったことでした。 そのエラーを解決したところ、きちんと通りました。 余計な手間をかけてしまい、大変お手数おかけ致しました。 今後ともよろしくお願いいたします。
guest

回答1

0

自己解決

YAmaGNZ様に教えて頂いた通り、
new SaveDate()で
新たなインスタンスを作って、上書きする方法で無事うまくいきました。
大変お手数おかけしました。
ありがとうございました。

投稿2021/08/15 16:02

Matsuri_

総合スコア15

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問