【问题标题】:Convert liste of vector3 to Json [duplicate]将vector3列表转换为Json [重复]
【发布时间】:2020-01-02 08:48:48
【问题描述】:

我正在尝试获取我所有的线条渲染位置并将其添加到 vector3 列表中,然后将其转换为 Json,以便我可以将其保存在 firebase 中。我正在使用JsonUtility,但问题是我的 jsondata 始终为空,即使 vecor3 的列表不是。

这是我的代码,然后我正在使用:

 public class Path : MonoBehaviour
 {
     [SerializeField] private List<Transform> checkpoints = new List<Transform>();
     private LineRenderer linerenderer;
     public Material TheLineMateriel;

    public static bool _ispressed = false;
     private string DATA_URL = "https://kataraproject-a233a.firebaseio.com/";
     private DatabaseReference reference;

     public string hello = "khraaa" ;



     // Start is called before the first frame update
     void Start()
     {
         FirebaseApp.DefaultInstance.SetEditorDatabaseUrl(DATA_URL);
         reference = FirebaseDatabase.DefaultInstance.RootReference;

         GameObject lineObject = new GameObject();
         this.linerenderer = lineObject.AddComponent<LineRenderer>();
         this.linerenderer.startWidth = 0.05f;
         this.linerenderer.endWidth = 0.05f;
         this.linerenderer.positionCount = checkpoints.Count;
         this.linerenderer.material = TheLineMateriel;
     }

     // Update is called once per frame
     void Update()
     {
         this.DrawLine();

     }

     private void DrawLine()
     {

         Vector3[] checkpointsArray = new Vector3[this.checkpoints.Count];
         for (int i = 0; i < this.checkpoints.Count; i++) {
             Vector3 checkpointPos = this.checkpoints[i].position;
             checkpointsArray[i] = new Vector3(checkpointPos.x, checkpointPos.y, 0f);
         }
          Vector3[] newPos = new Vector3[linerenderer.positionCount];
         this.linerenderer.SetPositions(checkpointsArray);

         linerenderer.GetPositions(newPos);


         //for (int i = 0; i < linerenderer.positionCount ; i++)
         //{

         //    newPos[i] = i;
         //}

         if ( _ispressed == true)
         {
             string jsonData = JsonUtility.ToJson(checkpointsArray);

             //reference.Child("Position"  + Random.Range(0,1000000)).SetRawJsonValueAsync(jsonData);
             Debug.Log(jsonData);
             _ispressed = false;
         }
     }


    public void Save ()
     {
         _ispressed = true;
     }
 }

有人可以帮帮我吗?

【问题讨论】:

    标签: json firebase unity3d firebase-realtime-database


    【解决方案1】:

    您可以创建一个简单的类来处理 Unity 类型的序列化,例如:

    [Serializable]
    public class SerializedVector3
    {
        public float x;
        public float y;
        public float z;
    
        public SerializedVector3(float x, float y, float z)
        {
            this.x = x;
            this.y = y;
            this.z = z;
        }
    
        public SerializedVector3(Vector3 vector3)
        {
            x = vector3.x;
            y = vector3.y;
            z = vector3.z;
        }
    }
    
    public static class Vector3Extensions
    {
        public static Vector3 ToVector3(this SerializedVector3 serializedVector3)
        {
            return new Vector3(serializedVector3.x, serializedVector3.y, serializedVector3.z);
        }
    
        public static SerializedVector3 FromVector3(this Vector3 vector3)
        {
            return new SerializedVector3(vector3);
        }
    }
    

    【讨论】:

    • 我宁愿直接使用隐式运算符而不是扩展方法,这样您就可以交换使用这两种类型。此外,这仍然不能解决 Unity 中数组的(反)序列化问题。
    • 这就是我在一个项目中正在做的事情,我将事物实例化/保存到 json。您只需在序列化之前/之后进行转换。如果你这样做,它是否是一个数组并不重要。至少这就是我这样做的原因,它正在解决我的问题
    • 我只是创建了一个类名 Player [Serializable] public class Player { public Vector3[] Position;然后我用它听到 Player playerInstance = new Player(); playerInstance.Position = newPos;字符串 jsonData = JsonUtility.ToJson(playerInstance); reference.Child("Position" + Random.Range(0, 1000000)).SetRawJsonValueAsync(jsonData);
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-16
    • 2013-05-07
    • 1970-01-01
    相关资源
    最近更新 更多