造成该异常通常有两种原因:
1. UnityLoader路径设置问题。
2. StreamingAssets文件夹目录问题。
默认发布WebGl之后,会有一个 Index.html 文件,内容大致如下:
<!DOCTYPE html>
<html lang="en-us">
<head>
<meta charset="utf-8">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Unity WebGL Player | TestWebGl</title>
<script src="Build/UnityLoader.js"></script>
<script>
var gameInstance = UnityLoader.instantiate("gameContainer", "Build/test.json");
</script>
</head>
<body>
<div id="gameContainer" style="width: 940px; height: 620px; margin: auto"></div>
</body>
</html>
在将WebGl画布嵌入到自己的 Html 内时,需要确保UnityLoader.js 地址和 UnityLoader.instantiate 传入的路径正确。
当项目中使用了 StreamingAssets 目录时,应该保证 StreamingAsset目录始终和 index.html 在同一目录。WebGl平台加载StreamingAsset目录资源时,必须使用WWW进行加载,不能够使用File.ReadAllText(path)进行读取。
using UnityEngine;
using System;
using System.Collections;
using System.Text;
public class FileLoader:MonoBehaviour
{
/// <summary>
/// 从StreamingAssets加载资源
/// Example:
/// string file = Application.streamingAssetsPath+"/test.txt";
/// LoadFile(file,(succsss,content)=>Debug.Log(success+"::"+content));
/// </summary>
/// <param name="file">文件地址</param>
/// <param name="onLoad">回调,bool-是否加载成功,string-成功时为文件内容,失败时是错误信息</param>
/// <returns></returns>
public IEnumerator LoadFile(string file,Action<bool,string> onLoad)
{
string contentOrErr = null;
bool success = true;
if (file.Contains ("://") || file.Contains (":///"))
{
using (WWW www = new WWW(file))
{
yield return www;
if (string.IsNullOrEmpty(www.error))
contentOrErr = www.text;
else
{
contentOrErr = www.error;
success = false;
}
}
}
else
{
contentOrErr = System.IO.File.ReadAllText(file,Encoding.UTF8);
}
if(onLoad != null)
onLoad(success,contentOrErr);
}
}