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

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

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

解決済

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

syosn938
syosn938

総合スコア4

1回答

0グッド

0クリップ

192閲覧

投稿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と表示されたりとよく理解できませんでした。

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

YAmaGNZ

2022/12/06 07:25

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

2022/12/08 04:22

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

回答1

0

自己解決

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

投稿2022/12/08 04:23

syosn938

総合スコア4

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

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

ただいまの回答率
86.12%

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

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

質問する

関連した質問

同じタグがついた質問を見る