前提
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; 24 } 25} 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と表示されたりとよく理解できませんでした。
回答1件
あなたの回答
tips
プレビュー