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

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

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

Q&A

解決済

1回答

591閲覧

座標値がリストに格納されない

syosn938

総合スコア4

0グッド

0クリップ

投稿2022/12/06 07:04

前提

Unityでハンドトラッキングを利用したシステムを作っています。
設置したボタンを押したタイミングで人差し指の先の三次元座標をリストに順次格納し、json形式でファイルに書き出そうとしています。
リスクをjsonで扱うためにラッパーを試みています。
勉強中で調べながらのコーディングのため拙いかとは思いますがご教授いただければ幸いです。

実現したいこと

  • 座標を格納したリストをjson形式にしてファイルに書き出す

‐他のシーンでそのファイルから座標データを読み出す

発生している問題

おそらく座標値がリストに格納されていないようです。
画像左下のメモ帳の様に座標値の入っていない外枠だけがjson形式に変換されています。
ラッパーのコード周りで修正が必要なのだろうとは思っていますがそこまでしか分かりませんでした。
イメージ説明

該当のソースコード

C#

1//PositionList.cs 2using System.Collections; 3using System.Collections.Generic; 4using UnityEngine; 5using System.IO; 6using System; 7using System.Runtime.Serialization; 8using System.Runtime.Serialization.Json; 9using System.Runtime.Serialization.Formatters.Binary; 10using System.Linq; 11 12[Serializable] 13public class Position 14{ 15 float x; 16 float y; 17 float z; 18 19 public Position(float X, float Y, float Z) 20 { 21 x = X; 22 y = Y; 23 z = Z; 2425} 26 27[Serializable] 28public class SaveDataWrapper 29{ 30 public List<Data> data; 31 32 public SaveDataWrapper() 33 { 34 data = new List<Data>(); 35 } 36} 37 38[Serializable] 39public class Data 40{ 41 42 public Data(List<Position> Ex) 43 { 44 test = Ex; 45 } 46 47 public List<Position> test; 48} 49 50public class PositionList : MonoBehaviour 51{ 52 public GameObject obj; 53 List<Vector3> posList = new List<Vector3>(); 54 public SaveDataWrapper sdw = new SaveDataWrapper(); 55 56 [SerializeField] 57 public string json; 58 59 // Update is called once per frame 60 public void ButtonClickSet() 61 { 62 Transform myTransform = this.transform; 63 Vector3 worldPos = myTransform.position; 64 float x = worldPos.x; 65 float y = worldPos.y; 66 float z = worldPos.z; 67 68 Instantiate(obj, new Vector3(x, y, z), Quaternion.identity); 69 Position pos = new Position(x,y,z); 70 List<Position> positions = new List<Position>(); 71 positions.Add((Position)pos.DeepCopy()); 72//Debug.Log(positions); 73 Data data = new Data(positions); 74//Debug.Log(data); 75 sdw.data.Add((Data)data.DeepCopy()); 76 } 77 public void Check() 78 { 79 StreamWriter writer; 80 json = JsonUtility.ToJson(sdw); 81 writer = new StreamWriter(Application.dataPath + "/savedata.json"); 82 writer.Write(json); 83 writer.Flush(); 84 writer.Close(); 85 Debug.Log("check"); 86 } 87} 88 89public static class Extention 90{ 91 //参照渡し回避用(オブジェクトのコピー) 92 public static object DeepCopy(this object target) 93 { 94 object result; 95 BinaryFormatter b = new BinaryFormatter(); 96 MemoryStream mem = new MemoryStream(); 97 98 try 99 { 100 b.Serialize(mem, target); 101 mem.Position = 0; 102 result = b.Deserialize(mem); 103 } 104 finally 105 { 106 mem.Close(); 107 } 108 return result; 109 } 110}

試したこと

Debug.Log()でどの段階でミスが生じているのか確認してみましたが、コンソールでDebug.Log(positions)はPositionsと表示されたり、Debug.Log(data)もDataと表示されたりとよく理解できませんでした。

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

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

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

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

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

YAmaGNZ

2022/12/06 07:25

Positionクラスの各値が外に公開されていないからではないでしょうか
syosn938

2022/12/08 04:22

初歩的な部分での盲点でした。 ありがとうございます。
guest

回答1

0

自己解決

Position クラスのx y z をpublic にした。

投稿2022/12/08 04:23

syosn938

総合スコア4

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問