Unity打包webgl主要有以下几个方面需要注意:
1、数据库无法像PC端那样直连,需要通过后台接口对数据库进行访问,再由Unity去调用后台接口,目前我们项目用的是JAVA后台,Unity调用后台接口必须要使用
携程(IEnumerator),并通过
StartCoroutine去调用执行该携程函数,
携程(IEnumerator)与主线程是异步进行的,所以界面中有需要初始化或者显示的地方,需要将代码写在
携程(IEnumerator)数据读取完后,不然无法正常初始化数据。调用方式如下图所示。
public void OnClick()
{
string userName = GameObject.Find("BP2/UserName/InputField").GetComponent<InputField>().text;
string password = GameObject.Find("BP2/Password/InputField").GetComponent<InputField>().text;
Text text = txtError.GetComponent<Text>();
if (string.IsNullOrEmpty(userName))
{
text.text = "用户名不能为空!";
return;
}
else if (string.IsNullOrEmpty(password))
{
text.text = "请输入正确的密码!";
return;
}
string json = JsonParamUtils.geUserLogin(userName, password);
Debug.Log(json);
StartCoroutine(login(string.Format("http://{0}/user/login",UtilsClass.WEBURL), json));
}
IEnumerator login(string _url, string _jsonStr)
{
Text text = txtError.GetComponent<Text>();
Debug.Log(_url);
byte[] bytes = Encoding.UTF8.GetBytes(_jsonStr);
UnityWebRequest request = new UnityWebRequest(_url, UnityWebRequest.kHttpVerbPOST)
{
uploadHandler = new UploadHandlerRaw(bytes),
downloadHandler = new DownloadHandlerBuffer()
};
request.SetRequestHeader("Content-Type", "application/json;charset=utf-8");
yield return request.SendWebRequest();
if (request.isHttpError || request.isNetworkError)
{
Debug.LogError(request.error);
}
else//200
{
PostValueResult postValueResult = JsonMapper.ToObject<PostValueResult>(request.downloadHandler.text);
if (postValueResult.success)
{
//User userInfo = JsonMapper.ToObject<User>(postValueResult.data.ToJson());
User userInfo = postValueResult.data;
if (userInfo != null)
{
//SceneManager.LoadSceneAsync("SampleScene");
StartCoroutine(LoadLevel());
}
else
{
text.text = "用户名或密码错误!";
}
}
else
{
Debug.Log(postValueResult.msg);
text.text = postValueResult.msg;
}
}
}
//用户POST请求参数传递
string
geUserLogin(string userName,string passWord)
{
JsonData jd= new JsonData();
jd["userName"] =
userName;
jd["
passWord"] =
passWord;
string jsonData = JsonMapper.ToJson(jd);
return jsonData;
}
2、Unity中Text自带默认的字体为
Arial,此字体在WEBGL中无法显示,所以需要导入其它字体进行替换,目前我们项目中用的是
微软雅黑(msyh.ttc)
3、如果项目中使用了AssetBundle,那么初始化的时候也需要使用
携程(IEnumerator)的方式去进行初始化,调用方式可继续使用PC端的单例模式。初始化代码如下。
void Start()
{
StartCoroutine(LoadUIAssetBundle());
StartCoroutine(LoadObjAssetBundle());
StartCoroutine(LoadTextureAssetBundle());
}
/// <summary>
/// UI携程
/// </summary>
/// <returns></returns>
IEnumerator LoadUIAssetBundle()
{
AssetBundleUtils.path = Application.streamingAssetsPath + "/WebGL/ui.unity3d";
UnityWebRequest www = UnityWebRequestAssetBundle.GetAssetBundle(AssetBundleUtils.path, 0);
yield return www.SendWebRequest();
if (www.isNetworkError || www.isHttpError)
{
Debug.LogError(www.error);
}
else
{
AssetBundleUtils.obj = DownloadHandlerAssetBundle.GetContent(www);
}
}
4、Unity中的
PDFRenderer插件,无法在WEBGL中使用,通过文档可以看到是支持WEBGL,但在使用测试中,是无法再WEBGL中正常显示PDF内容的,不知道是因为我们使用阉割版的问题还是什么,正版的是需要付费购买;最终选择在WEBGL中新打开网页页签的形式查看PDF,代码如下,UtilsClass.filePath + fileName为你PDF的路径。
Application.ExternalEval("window.open('" + UtilsClass.filePath + fileName + "','_blank')");
如果文件存储在服务器,则可以通过下方的形式打开文件,url为后台给的文件访问路径
Application.OpenURL(url)