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

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

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

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

Unity

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

Q&A

1回答

1667閲覧

unityでのjsonを使ったセーブ機能の使い方がわからない

haru_ehoshi

総合スコア1

JSON

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

Unity

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

0グッド

0クリップ

投稿2021/11/01 05:42

前提・実現したいこと

unityでセーブ機能を追加したいと思い色々調べてとりあえず下のようなスクリプトを書いてみたのですが、これをどう用いればいいのかわからず困っています。

具体的には、チャプターセレクトなどで進行度をに応じて章を選択できるようにしたり音量などの情報を自動でjsonファイルに書き込み呼び出し、適宜使用できるようにしたいのです。

using System.Collections; using System.Collections.Generic; using UnityEngine; using System.IO; [System.Serializable] public class Savedata { public int scene = 1; public int progress = 1; public int volume = 50; } public class Save : MonoBehaviour { void Start() { Savedata savedata = loadPlayerData(); } public void savePlayerData(Savedata savedata) { StreamWriter writer; string jsonstr = JsonUtility.ToJson(savedata); writer = new StreamWriter(Application.dataPath + "/savedata.json", false); writer.Write(jsonstr); writer.Flush(); writer.Close(); } public Savedata loadPlayerData() { string datastr = ""; StreamReader reader; reader = new StreamReader(Application.dataPath + "/savedata.json"); datastr = reader.ReadToEnd(); reader.Close(); return JsonUtility.FromJson<Savedata>(datastr); } }

試したこと

現時点で試したことは
・シーン内に空のオブジェクトを作って上のスクリプトをアタッチ
https://xr-hub.com/archives/11782 を参考に、スクリプトを下のように書き換えてUIなどを作成

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.UI; 5 6public class Button_TITLE : MonoBehaviour 7{ 8 [SerializeField] GameObject P_main; 9 [SerializeField] GameObject P_chapter; 10 [SerializeField] GameObject P_chapter_n; 11 [SerializeField] GameObject P_option; 12 [SerializeField] GameObject P_description; 13 14 Save save; 15 16 // Start is called before the first frame update 17 void Start() 18 { 19 BackToP_main(); 20 save = new Save(); 21 } 22 23 public void GoChapterselect() 24 { 25 if (save.progress = 1) 26 { 27 P_main.SetActive(false); 28 P_chapter.SetActive(true); 29 } 30 else 31 { 32 P_main.SetActive(false); 33 P_chapter_n.SetActive(true); 34 } 35 } 36 public void GoOption() 37 { 38 P_main.SetActive(false); 39 P_description.SetActive(false); 40 P_option.SetActive(true); 41 } 42 43 public void GoDescription() 44 { 45 P_option.SetActive(false); 46 P_description.SetActive(true); 47 } 48 49 public void BackToP_main() 50 { 51 P_main.SetActive(true); 52 P_chapter.SetActive(false); 53 P_chapter_n.SetActive(false); 54 P_option.SetActive(false); 55 } 56}

としたのですが、動いてくれません。

発想としては、セーブデータを読み込むためのオブジェクトを作ってそれでシーンごとにデータを読み込み、それを参照してシーンないでデータを取り扱う、というものだと考えているのですが、これは正しいでしょうか?

初心者故説明不足な点も多々あると思われます。すみません。

よろしくお願いします。

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

unity 2021.2

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

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

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

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

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

guest

回答1

0

savePlayerData()を呼ばないと、保存されません。
この程度のプログラムであれば自力で読めるようになるべきですが、自分で読んでみましたか?

あとこのコードですが、newするものにMonoBehaviourを継承している点で正しくないです。
また、Application.dataPathを使うとAndroidなどではセーブができなくなるので、Application.persistentDataPathにしないのもおかしいです。
自分も人のことは言えませんが、あまりいいコードではないので、参考程度にしたほうがいいですね。

投稿2021/11/01 12:22

fiveHundred

総合スコア10152

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問