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

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

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

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

Q&A

解決済

1回答

1449閲覧

オブジェクトの座標をjsonに保存

gamigami2022

総合スコア2

Unity

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

0グッド

0クリップ

投稿2022/01/25 04:38

編集2022/01/25 04:43

前提・実現したいこと

クリックで生成したオブジェクトの座標をjsonに保存させ、それをクリックした場所通りロードするようにしたいです。

ソースコード

using System.Collections; using System.Collections.Generic; using UnityEngine; public class Creator_Prefab : MonoBehaviour { public GameObject prefab; private Vector3 mousePosition; public int count_Preafab =0; private int count = 0; public static List<GameObject> Prefab_List = new List<GameObject>(); void Update() { Onprefab(); } public void Onprefab() { if (Input.GetMouseButtonDown(0))//左クリック { count++; if (count <= count_Preafab) { mousePosition = Input.mousePosition; mousePosition.z = 10.0f;//z軸を修正 Instantiate(prefab, Camera.main.ScreenToWorldPoint(mousePosition), Quaternion.identity); var obj = Instantiate(prefab) as GameObject; Prefab_List.Add(obj); Vector3 position = Prefab_List[i].transform.position; Debug.Log(position); } } } }

ソースコード

using UnityEngine; using UnityEngine.UI; using System.IO; using System.Collections.Generic; public class save_data : MonoBehaviour { [SerializeField] InputField inputArea; Creator_Prefab Creator; [System.Serializable] public class Stage_Data { public int ID; public string StageName; public List<Vector2> Prefab_List_Save = new List<Vector2>(); } void Start() { Creator = GetComponent<Creator_Prefab>(); } Stage_Data myData = new Stage_Data(); public void SavePlayerData() { StreamWriter writer; var StageName = inputArea.text; myData.StageName = StageName; string jsonstr = JsonUtility.ToJson(myData); writer = new StreamWriter(Application.dataPath + "/save" + StageName + ".json", false); writer.Write(jsonstr); writer.Flush(); writer.Close(); Debug.Log(myData.StageName + "のデータを保存しました"); } public void LoadPlayerData() { string datastr = ""; var StageName = inputArea.text; StreamReader reader; reader = new StreamReader(Application.dataPath + "/save" + StageName + ".json"); datastr = reader.ReadToEnd(); reader.Close(); myData = JsonUtility.FromJson<Stage_Data>(datastr); Debug.Log(myData.StageName + "のデータをロードしました"); } }

試したこと

Stage_Dataの中に、Listを作りその中に格納するっという事を試してみました。
サイトや自分で試行錯誤してみましたが、実現できませんでした。
(頭よくないので、ここまでしかできませんでした。)

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

2021.1.7f1

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

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

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

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

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

guest

回答1

0

ベストアンサー

もうあと数行というところで他の部分はちゃんとできてるっぽいので、もうすでに解決済みかもしれませんが
こんな感じでどうでしょうか。

cs

1 public void SavePlayerData() 2 { 3 StreamWriter writer; 4 var StageName = inputArea.text; 5 myData.StageName = StageName; 6 7 //▼追加ここから------------------ 8 for (int i = 0; i < Creator_Prefab.Prefab_List.Count; i++) 9 { 10 var position = Creator_Prefab.Prefab_List[i].transform.position; 11 myData.Prefab_List_Save.Add(position); 12 } 13 //▲追加ここまで------------------ 14 15 string jsonstr = JsonUtility.ToJson(myData); 16 17 writer = new StreamWriter(Application.dataPath + "/save" + StageName + ".json", false); 18 writer.Write(jsonstr); 19 writer.Flush(); 20 writer.Close(); 21 22 Debug.Log(myData.StageName + "のデータを保存しました"); 23 } 24 25 public void LoadPlayerData() 26 { 27 string datastr = ""; 28 var StageName = inputArea.text; 29 StreamReader reader; 30 31 reader = new StreamReader(Application.dataPath + "/save" + StageName + ".json"); 32 datastr = reader.ReadToEnd(); 33 reader.Close(); 34 35 myData = JsonUtility.FromJson<Stage_Data>(datastr); 36 37 //▼追加ここから------------------ 38 for (int i = 0; i < myData.Prefab_List_Save.Count; i++) 39 { 40 var position = myData.Prefab_List_Save[i]; 41 var instantiated = Instantiate(Creator.prefab, position, Quaternion.identity); 42 Creator_Prefab.Prefab_List.Add(instantiated); 43 } 44 //▲追加ここまで------------------ 45 46 Debug.Log(myData.StageName + "のデータをロードしました"); 47 }

セーブ追加部:Prefab_List_Saveに生成したオブジェクトの座標を入れて保存
ロード追加部:新しくInstantiate()したプレハブをPrefab_List_Saveから読みだした座標で書き換え

投稿2022/01/29 07:55

Fatahat_Sepone

総合スコア13

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

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

gamigami2022

2022/02/01 04:13

返信が遅くなり大変申し訳ありません Fatahat_Sepone様に教えていただいた、部分でNULLが返ってきました。
Fatahat_Sepone

2022/02/01 09:46 編集

どこでnullが出ているのかにもよりますが、見た限りでは記載されたコード外の話になると思うのでそこから先はこちらで特定するのは難しいですね…。 このコード内で一番可能性が高そうなのはCreator変数のCreator_PrefabインスタンスがNullになっている場合ですが、提示されたコードを見る限りsave_dataコンポーネントのStart()内でGetComponent()しているので、 void Start() {  Creator = GetComponent<Creator_Prefab>();  Debug.Log(Creator); //←追加部:ちゃんとCreater_Prefabコンポーネントが取得されているかチェック } するなどして、GetComponentが正しく成功しているかのチェックをするとか、そのあたりでしょうか。 (これでDebug.Logの結果がNullなのであれば、GetComponentがインスタンスが取得できていない → save_dataコンポーネントと同じゲームオブジェクトにCreator_Prefabコンポーネントがアタッチされていない可能性があります) もう一つNullが出そうな場所はLoadの方のCreator.prefabで、この場合はCreator_Prefabコンポーネントのインスペクターでprefabをセットし忘れているパターンです。 2つをまとめると、SavePlayerDataまたはLoadPlayerDataを呼び出したときに  ① save_dataのCreatorにちゃんとインスタンスが入っている  ② Creator_Prefabのprefabにちゃんとプレハブがセットされている の2つの条件がクリアされているかの確認ですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問