🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C#

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

Q&A

解決済

1回答

1744閲覧

ゲームオブジェクトの状態を保存したい

papas1888

総合スコア6

C#

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

0グッド

0クリップ

投稿2021/03/29 16:35

編集2021/03/30 20:24

現在2Dの脱出ゲームを作っていて、その中でセーブ機能を実装したく質問させていただきました。
理想としては、落ちているアイテムを拾う→アイテム欄に拾ったアイテム表示&落ちていたアイテムのオブジェクトを非表示、この状態でセーブしてロードするとそのままアイテム欄のアイテムは表示されたままで落ちていたアイテムは非表示のまま、という感じに考えています。
実装するにあたって色々セーブについて調べました。単純にスコアだけを保存するなら playerprefsといったようなものでいいと思ったのですが、フラグみたいなのを複数管理するならJson形式で保存するのがいい?と思い、以下のscriptをサイトをいくつか参照しながら作成しました。しかし、値の保存はできているのですがゲームオブジェクトの状態の保存まではできないでいます。どうすればゲームオブジェクトの状態まで保存できるのでしょうか?お時間がありましたらご教授お願いします。

コード1 [System.Serializable] public class FlagData { public int a; } public class ObjControll : MonoBehaviour {  public GameObject obj;//アイテム欄に表示されるアイテム public GameObject obj_drop;//フィールドに落ちているアイテム public Toggle obj_toggle; public void Save(FlagData saveData)//セーブ { StreamWriter writer; string jsonstr = JsonUtility.ToJson(saveData); writer = new StreamWriter(Application.dataPath + "/savedata.json", false); writer.Write(jsonstr); writer.Flush(); writer.Close(); } void Update() { FlagData saveData = new FlagData(); if(saveData.a!=0){ obj.SetActive(true); obj_drop.SetActive(false); } public void onTap() { FlagData saveData = new FlagData();//セーブデータのインスタンス obj.SetActive(true); obj_drop.SetActive(false); saveData.a++; Save(saveData);//セーブ }
コード2 public class SaveD : MonoBehaviour { public FlagData Load() { if (File.Exists(Application.dataPath + "/savedata.json")) { string datastr = ""; StreamReader reader; reader = new StreamReader(Application.dataPath + "/savedata.json"); datastr = reader.ReadToEnd(); reader.Close(); return JsonUtility.FromJson<FlagData>(datastr); } FlagData saveData = new FlagData(); return saveData; } public void PushLoadButton() { FlagData saveData = Load(); SceneManager.LoadScene("GamePart"); } }

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

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

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

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

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

guest

回答1

0

ベストアンサー

C#

1 writer = new StreamWriter(Application.dataPath + "/savedata.json", false);

Application.dataPathは何かを保存するディレクトリではありません。
エディタ上とか一部のプラットフォームでは動作するのかもしれませんが、Application.persistentDataPathを使うべきでしょう。

C#

1 FlagData saveData = Load(); 2 SceneManager.LoadScene("GamePart");

上記で、saveDataはどこにも使われていません。
saveDataをメンバー変数などに格納しないと何も使えませんが、何がしたいのでしょうか。

また、SceneManager.LoadScene(~);は、デフォルトでは前のシーンの全てのゲームオブジェクトが削除されます、
DontDestroyOnLoadやstatic変数を使って削除されないようにする、もしくはLoadSceneMode.Additiveを引数に指定して追加での読み込みにする必要があります。

投稿2021/03/31 02:32

fiveHundred

総合スコア10152

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

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

papas1888

2021/04/19 09:35

ベストアンサーをするのに遅れました。無事セーブを実装できましたありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問