您当前的位置: 首页 >  Peter_Gao_ unity

Unity存档用 LitJson  不支持float类型

Peter_Gao_ 发布时间:2020-04-15 19:36:47 ,浏览量:5


 
在进行类转json字符串时,报错JsonException: Max allowed object depth reached while trying to export from type System.Single。

 LitJson实际上是类的属性中有json不能识别的数据类型,这里就是float。什么类型是允许的呢?

在JsonData类中找到了答案。

        public JsonData(bool boolean);
        public JsonData(double number);
        public JsonData(int number);
        public JsonData(long number);
        public JsonData(object obj);
        public JsonData(string str);

所以去掉float,或者 float转成double。 

float x1 = 0.01F;
            double y = Convert.ToDouble(0.01F);
这时候y会变成0.09999992341……
可以用Math.Round进行四舍五入,或者先将float转为字符串再用double.Parse转成double,避免精度错误。

 

下面以游戏地图节点位置vector是float类型转为double可存档类型为例说明:

// 地图节点管理器

public class MapNodeManager
{

        ///
        /// 地图节点数据
        ///
        public List MapNodes { private set; get; }
}

 

// 将要进行存档的内容

 class MapNode

{

        ///
        /// 位置
        ///
    public Vector2 LocalPos { private set; get; }
}

 

// 实际存档的数值

class MapNodeArchive

{

        ///
        /// 位置
        ///
        public Vector2Archive LocalPos;

}

 

// 存档管理器

class GameArchiveManager

{

            Debug.Log("清空存档所有地图列表对象的数据");

            ga.List_MapNodesArchives.RemoveAll(j => true);

            // 得到manager的save

            MapNodeManager mapNodesSave = ManagerController.Instance.MMapNodeManager;

            // 得到n列节点的save

            List mapNodesColumns = mapNodesSave.MapNodes;

            if (mapNodesColumns != null)
            {
                for (int i = 0; i < mapNodesColumns.Count; i++)
                {
                    Debug.Log(" 得到一列节点的存档");
                    MapColumnNodeArchive mnal = CreateMapNodeArchiveList(mapNodesColumns[i]);
                    ga.List_MapNodesArchives.Add(mnal);

                }
            }

           

   public MapNodeArchive CreateMapNodeArchive(MapNode mapANode)
        {
            if (mapANode != null)
            {
                MapNodeArchive asmna = new MapNodeArchive();
                asmna.NodeId = mapANode.NodeId;

                // 节点位置
                asmna.LocalPos = CreateVector3Archive(mapANode.LocalPos);

                }

                return asmna;
            }
                return null;

        }

        public Vector3Archive CreateVector3Archive(Vector2 v2)
        {
            Vector3Archive v3a = new Vector3Archive();
            v3a.x = double.Parse(v2.x.ToString());
            v3a.y = double.Parse(v2.y.ToString());
            return v3a;
        }

}

先将float转为字符串再用double.Parse转成double,避免精度错误

 

关注
打赏
查看更多评论

Peter_Gao_

暂无认证

  • 5浏览

    0关注

    534博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文
立即登录/注册

微信扫码登录