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

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

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

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

JSON

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

Unity

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

Q&A

解決済

2回答

968閲覧

セーブデータのロード

nanakaka

総合スコア1

C#

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

JSON

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

Unity

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

0グッド

0クリップ

投稿2021/11/02 03:09

編集2021/11/02 03:18

SaveDataのロード

JSON形式でデータを保存することはできたのですが、保存されているデータをデシリアライズ?することができません。
ロードしたときに"SaveData"クラスの変数に値が入っていません。

どこをどのように直したらよいでしょうか?

"SaveLoadFile"の"Load"は別のシーンのButtonに追加されています。

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

なし

該当のソースコード

C#

1using UnityEngine; 2using System.Collections; 3using UnityEngine.UI; 4using System.IO; 5using System.Runtime.Serialization.Formatters.Binary; 6using System; 7using UnityEngine.SceneManagement; 8 9public class SaveLoadFile : MonoBehaviour 10{ 11 12 // 入力フィールド 13 [SerializeField] 14 public string inputField; 15 16 [SerializeField] 17 public float HPdata; 18 [SerializeField] 19 public float playerxdata; 20 [SerializeField] 21 public float prayerydata; 22 23 // ファイルストリーム 24 private FileStream fileStream; 25 // バイナリフォーマッター 26 private BinaryFormatter bf; 27 28 29 public player PlayerSclipt; 30 public DamageCheckSclipt HPSclipt; 31 32 33 public SaveData saveData; 34 35 36 void Start() 37 { 38 } 39 40 void Updata() 41 { 42 43 } 44 45 46 public void SaveData() 47 { 48 PlayerPrefs.SetString("PlayerData", saveData.GetJsonData()); 49 } 50 51 public void Save() 52 { 53 54 HPdata = HPSclipt.HP(); 55 playerxdata = PlayerSclipt.X(); 56 prayerydata = PlayerSclipt.Y(); 57 58 59 saveData.SetHp(HPdata); 60 61 saveData.SetPlayerX(playerxdata); 62 63 saveData.SetPlayerY(prayerydata); 64 65 66 inputField = saveData.GetJsonData(); 67 68 69 bf = new BinaryFormatter(); 70 fileStream = null; 71 72 73 74 75 try 76 { 77 // ゲームフォルダにfiledata.datファイルを作成 78 fileStream = File.Create(Application.dataPath + "/filedata.dat"); 79 // クラスの作成 80 Data data = new Data(); 81 // 入力フィールドのテキストをクラスのデータに保存 82 data.dataText = inputField; 83 // ファイルにクラスを保存 84 bf.Serialize(fileStream, data); 85 } 86 catch (IOException e1) 87 { 88 Debug.Log("ファイルオープンエラー"); 89 } 90 finally 91 { 92 if (fileStream != null) 93 { 94 fileStream.Close(); 95 } 96 } 97 } 98 99 public void Load() 100 { 101 bf = new BinaryFormatter(); 102 fileStream = null; 103 104 if (PlayerPrefs.HasKey("PlayerData")) 105 { 106 var Data = PlayerPrefs.GetString("PlayerData"); 107 JsonUtility.FromJsonOverwrite(Data, saveData); 108 } 109 110 try 111 { 112 // ファイルを読み込む 113 fileStream = File.Open(Application.dataPath + "/filedata.dat", FileMode.Open); 114 // 読み込んだデータをデシリアライズ 115 Data data = bf.Deserialize(fileStream) as Data; 116 } 117 catch (FileNotFoundException e1) 118 { 119 Debug.Log("ファイルがありません"); 120 } 121 catch (IOException e2) 122 { 123 Debug.Log("ファイルオープンエラー"); 124 } 125 finally 126 { 127 if (fileStream != null) 128 { 129 fileStream.Close(); 130 } 131 } 132 133 } 134 // 保存するデータクラス 135 [Serializable] 136 class Data 137 { 138 public string dataText; 139 } 140}

C#

1using UnityEngine; 2using System.Collections; 3using System; 4 5[Serializable] 6public class SaveData : object 7{ 8 [SerializeField] 9 public float SplayerX; 10 [SerializeField] 11 public float SplayerY; 12 13 [SerializeField] 14 public float Shp; 15 16 public void SetHp(float SHP) 17 { 18 this.Shp = SHP; 19 } 20 21 public void SetPlayerX(float SPLAYERX) 22 { 23 this.SplayerX = SPLAYERX; 24 } 25 26 public void SetPlayerY(float SPLAYERY) 27 { 28 this.SplayerY = SPLAYERY; 29 } 30 31 32 public float GetHp() 33 { 34 return Shp; 35 } 36 37 public float GetPlayerX() 38 { 39 return SplayerX; 40 } 41 42 public float GetPlayerY() 43 { 44 return SplayerY; 45 } 46 47 48 49 50 51 public string GetJsonData() 52 { 53 return JsonUtility.ToJson(this); 54 } 55 56}

C#

1using UnityEngine; 2using System.Collections; 3using UnityEngine.UI; 4using UnityEngine.SceneManagement; 5 6public class ProcessingUI : MonoBehaviour 7{ 8 9 public bool C = false; 10 11 12 void Start() 13 { 14 15 } 16 17 public void StartingSampleScene() 18 { 19 SceneManager.LoadScene("SampleScene"); 20 PlayerPrefs.DeleteKey("PlayerData"); 21 C = false; 22 } 23 24 public void LoadingSampleScene() 25 { 26 SceneManager.LoadScene("SampleScene"); 27 C = true; 28 } 29 30 public bool Continue() 31 { 32 return C; 33 } 34 35 public void LoadingTitleScene() 36 { 37 SceneManager.LoadScene("TitleScene"); 38 39 } 40 41 42 43}

参考資料

//Unityでゲームデータのセーブ・ロードを行う方法
https://gametukurikata.com/program/savedata

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

Unity 2020.3.9f1

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

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

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

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

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

coco_bauer

2021/11/02 04:29

オブジェクトをJSON形式の文字列に変換する時に行ったことを逆に行う感じです。 JSON形式の文字列の構造を理解して、それをクラスの構造に当てはめていくような。
退会済みユーザー

退会済みユーザー

2021/11/03 04:58 編集

このコメントは回答欄に移しました
YAmaGNZ

2021/11/03 08:17 編集

JsonUtility.FromJsonOverwrite(Data, saveData); ここが実行されているのでしょうか?
退会済みユーザー

退会済みユーザー

2021/11/09 02:12

質問者さん、無言ですが、コメント、回答が付いているのでそれらに対するフィードバックを書こう。役に立った/立たなかったぐらいはすぐ返せるのでは? 役に立たなかったらどこが期待と違うかなどを書くと、よりあなたの期待に近い回答が得られるかも。とにかく無言で放置は NG です。
nanakaka

2021/11/09 03:22

どうしようかと考えていたら返信を忘れてしまいました。すみません... 回答の内容も含め、いろいろ調べてみたのですが、どこが間違っているかすらわかっていないのでプログラムを修正することができませんでした。 今、別の方法で再チャレンジ中ですので、解決するのはもう少し後になりそうです。
guest

回答2

0

自己解決

今まで複数だったプログラムを一つにまとめて、シーン読み込み時に毎回ロードするようにしてみたらすんなりと行けました。

↓参考にしたサイト
https://www.sejuku.net/blog/50432

回答ありがとうございました!

C#

1using UnityEngine; 2using System.Collections; 3using UnityEngine.UI; 4using System.IO; 5using System.Runtime.Serialization.Formatters.Binary; 6using System; 7using UnityEngine.SceneManagement; 8 9 10[Serializable] 11public class SaveData1 : object 12{ 13 public float SplayerX = 1f; 14 public float SplayerY = 1f; 15 public float Shp = 20f; 16} 17 18public class SaveLoad : MonoBehaviour 19{ 20 public player PlayerSclipt; 21 public DamageCheckSclipt HPSclipt; 22 23 public float HPdata; 24 public float playerxdata; 25 public float playerydata; 26 27 public float splayerx; 28 public float splayery; 29 public float shp; 30 31 32 public SaveData1 savedata; 33 34 private StreamWriter writer; 35 36 public string datastr, jsonstr; 37 38 39 void Awake() 40 { 41 datastr = ""; 42 StreamReader reader; 43 reader = new StreamReader(Application.dataPath + "/savedata.json"); 44 datastr = reader.ReadToEnd(); 45 reader.Close(); 46 47 savedata = JsonUtility.FromJson<SaveData1>(datastr); 48 49 splayerx = savedata.SplayerX; 50 splayery = savedata.SplayerY; 51 shp = savedata.Shp; 52 53 Debug.Log(savedata.Shp); 54 Debug.Log(savedata.SplayerX); 55 Debug.Log(savedata.SplayerY); 56 Debug.Log(shp); 57 Debug.Log(splayerx); 58 Debug.Log(splayery); 59 60 } 61 62 public void Save() 63 { 64 65 HPdata = HPSclipt.HP(); 66 playerxdata = PlayerSclipt.X(); 67 playerydata = PlayerSclipt.Y(); 68 69 savedata = new SaveData1(); 70 savedata.Shp = HPdata; 71 savedata.SplayerX = playerxdata; 72 savedata.SplayerY = playerydata; 73 74 75 76 jsonstr = JsonUtility.ToJson(savedata); 77 78 writer = new StreamWriter(Application.dataPath + "/savedata.json", false); 79 writer.Write(jsonstr); 80 writer.Flush(); 81 writer.Close(); 82 } 83 84 85 public void DeleteData() 86 { 87 savedata.Shp = 20f; 88 89 savedata.SplayerX = 1f; 90 91 savedata.SplayerY = 1f; 92 93 jsonstr = JsonUtility.ToJson(savedata); 94 95 writer = new StreamWriter(Application.dataPath + "/savedata.json", false); 96 writer.Write(jsonstr); 97 writer.Flush(); 98 writer.Close(); 99 } 100 101 102 public float GetSaveDataPlayerX() 103 { 104 return splayerx; 105 } 106 107 public float GetSaveDataPlayerY() 108 { 109 return splayery; 110 } 111 112 public float GetSaveDataHp() 113 { 114 return shp; 115 } 116 117}

投稿2021/11/15 04:46

nanakaka

総合スコア1

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

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

0

保存されているデータをデシリアライズ?することができません。

https://teratail.com/questions/365849#reply-497216 ←参考になりませんか?

上の文のデシリアライズできないという所だけ見て返事してますのでハズレかもしれませんが・・・

投稿2021/11/03 04:56

編集2021/11/03 04:57
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

nanakaka

2021/11/09 03:28

"Visual Studio の機能を使って C# のクラス定義を生成する" 試してみたのですが、実行結果は変わらなかったので問題はほかの場所にありそうです。 単純に自分が理解できていない可能性もありますが...
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問