前段时间做了项目,甲方给了个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;
}
}
写的不怎么样,能凑合用,希望如果有大佬碰巧看见的话能提出点改进的意见