关于WebGL连接Json接口问题

1 篇文章 0 订阅
1 篇文章 0 订阅

       前段时间做了项目,甲方给了个Json接口,项目需要发布成WebGL版本的,在unity编辑器下运行很正常,发布成WebGL之后连接数据的地方就会出现问题,当时一步一步的DeBug,找了一天,依然没有找到问题所在,因为在unity编辑器下运行很正常,所以只能在WebGL版本下想办法输出,后来终于找到原因了。网页版并不支持C#代码,但是我们unity基本上都是用的C#,所以才会出现发布WebGL时速度很慢的情况,发布过程中unity会自动把C#代码转化为C++,然后把C++转成Java,所以说发布WebGL的时候会特别慢,那么问题来了,在C#中的代码到了Java中还能照常运行吗,显然是不能的。我遇到的bug应该就是这个问题导致的,后来看到一句话确定了我的想法。

  .NET网络类(System.Net命名空间中的一切,特别是System.Net.Sockets)在WebGL中不能工作。UnityEngine.Network* 类也是这样,编译WebGL时将找不到这些类。如果你需要在WebGL使用网络通信,你现在可以选择使用unity的WWW 或UnityWebRequest 类或则支持webGL的新的Unity 网络通信特性。或在JavaScript中使用WebSockets或WebRTC实现你自己的网络通信。 

然后更换代码,发布之后发现还是不能用,在项目的控制台发现了是权限的问题。当你遇到这个问题的时候你就要很坚定的告诉数据库那边,必须要CORS授权,没有第二种办法。下面附加一段我在连接Json时的一段代码


using System.Collections;
using UnityEngine;


public class JsonDataCon : MonoBehaviour
{
    //可能在一个项目中需要好几个地方需要连接数据的,所以我们就把前面相同的部分摘出来
    private string url_1 = "http://3d5i3.zcwjvr.com/";


    //解析Json后内容存放的数组
    private string[] J_Str;


    public static JsonDataCon J_JsonDataCon;


    void Awake()
    {
        if (J_JsonDataCon == null)
        {
            J_JsonDataCon = this;
        }
        else
        {
            Destroy(this.gameObject);
        }
        DontDestroyOnLoad(this.gameObject);
    }


    /// <summary>
    /// 类型①
    /// </summary>
    /// <param name="url_2=>连接Json的后半部分链接"></param>
    /// <param name="node=>需要的数据前面的节点名称"></param>
    /// <param name="cont=>节点名称"></param>
    public void ContentJson_1(string url_2, string node, string cont)
    {
        string url = url_1 + url_2;
        StartCoroutine(WaitForJsonData_1(url, node, cont));
    }


    /// <summary>
    /// 类型②
    /// </summary>
    /// <param name="url_2"></param>
    /// <param name="node"></param>
    /// <param name="cont_1"></param>
    /// <param name="cont_2"></param>
    /// <param name="index=>Json相当于一个数组,当Json结构比较复杂时就需要使用数组下标来解决"></param>
    public void ContentJson_2(string url_2, string node, string cont_1, string cont_2, int index)
    {
        string url = url_1 + url_2;
        StartCoroutine(WaitForJsonData_2(url, node, cont_1, cont_2, index));
    }


    IEnumerator WaitForJsonData_1(string url, string node, string cont)
    {
        WWW www = new WWW(url);
        yield return www;


        Newtonsoft.Json.Linq.JObject jo = (Newtonsoft.Json.Linq.JObject)Newtonsoft.Json.JsonConvert.DeserializeObject(www.text);
        Newtonsoft.Json.Linq.JArray jar = Newtonsoft.Json.Linq.JArray.Parse(jo[cont].ToString());
        J_Str = new string[jar.Count];
        for (int i = 0; i < jar.Count; i++)
        {
            J_Str[i] = jar[i][node].ToString();
        }
        print(jar.ToString());
    }
    IEnumerator WaitForJsonData_2(string url, string node, string cont_1, string cont_2, int index)
    {
        WWW www = new WWW(url);
        yield return www;


        Newtonsoft.Json.Linq.JObject jo = (Newtonsoft.Json.Linq.JObject)Newtonsoft.Json.JsonConvert.DeserializeObject(www.text);
        Newtonsoft.Json.Linq.JArray jar = Newtonsoft.Json.Linq.JArray.Parse(jo[cont_1].ToString());
        print(jar[0].ToString());
        Newtonsoft.Json.Linq.JArray newJar = Newtonsoft.Json.Linq.JArray.Parse(jar[index][cont_2].ToString());
        J_Str = new string[newJar.Count];
        for (int i = 0; i < newJar.Count; i++)
        {
            J_Str[i] = newJar[i][node].ToString();
        }
    }


    /// <summary>
    /// 得到需要的内容后通过此方法返回数组
    /// </summary>
    /// <returns></returns>
    public string[] ReturnJsonData()
    {
        return J_Str;
    }

}


写的不怎么样,能凑合用,希望如果有大佬碰巧看见的话能提出点改进的意见

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值