1、情况说明
由于安全性的影响,JavaScript代码没有直接访问IP套接字来实现网络连接。因此,该.NET网络类(System.Net命名空间中的一切,特别是System.Net.Sockets)在WebGL中不能工作。UnityEngine.Network* 类也是这样,编译WebGL时将找不到这些类。如果你需要在WebGL使用网络通信,你现在可以选择使用unity的WWW 或UnityWebRequest 类或则支持webGL的新的Unity 网络通信特性..
此处使用UnityWebRequest 进行POST请求
2、远程服务器配置
WebGl支持WWW和unitywebrequest类。他们在JavaScript里使用XMLHttpRequest类实现,使用浏览器来处理网络请求。这对访问跨域资源施加了一些安全限制。基本上对于服务器的任何WWW请求不同于托管服务器的是WebGL内容需要通过你试图访问的服务器授权。在WebGL的跨域访问WWW资源,您试图访问的服务器需要使用CORS授权。如果你使用WWW或unitywebreqest试图访问内容,但是远程服务器没有CORS系统设置或没有正确配置,你会在浏览器控制台看到类似这样的错误:
Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http://myserver.com/. This can be fixed by moving the resource to the same domain or enabling CORS.
CORS表示跨域资源共享。基本上,服务器需要向它发送的HTTP响应里添加一些访问控制头,这将告诉浏览器允许它访问服务器上的内容。这是一个控制头设置的例子,将允许unity WebGL访问来源于任何Web服务器资源,通过常见的请求头和使用HTTP GET,POST或OPTIONS方法:
“Access-Control-Allow-Credentials”: “true”,
“Access-Control-Allow-Headers”: “Accept, X-Access-Token, X-Application-Name, X-Request-Sent-Time”,
“Access-Control-Allow-Methods”: “GET, POST, OPTIONS”,
“Access-Control-Allow-Origin”: “*”,
注意,www.responseheaders限于实际响应标头的一个子集,根据7.1.1的CORS规范。还要注意XMLHttpRequest不允许使用数据流,因此WebGL的WWW类只会处理下载完成的数据(所以assestbundles不能像其他平台上那样解压和加载)
远程服务器添加跨越设置,以IIS为例,在Web.Config文件中添加如下代码:
<system.webServer> <httpProtocol> <customHeaders> <add name="Access-Control-Allow-Origin" value="*" /> <add name="Access-Control-Allow-Methods" value="GET, PUT, POST, DELETE, HEAD, OPTIONS" /> <add name="Access-Control-Allow-Credentials" value="true"/> <add name="Access-Control-Allow-Headers" value="X-Requested-With, origin, content-type, accept" /> </customHeaders> </httpProtocol> </system.webServer>
3、Unity3D发布web项目路径下添加web.config文件,否则直接放到IIS服务端,Chrome打开会报错
<configuration> <system.webServer> <staticContent> <remove fileExtension=".mem" /> <remove fileExtension=".data" /> <remove fileExtension=".unity3d" /> <remove fileExtension=".jsbr" /> <remove fileExtension=".membr" /> <remove fileExtension=".databr" /> <remove fileExtension=".unity3dbr" /> <remove fileExtension=".jsgz" /> <remove fileExtension=".memgz" /> <remove fileExtension=".datagz" /> <remove fileExtension=".unity3dgz" /> <remove fileExtension=".json" /> <remove fileExtension=".unityweb" /> <mimeMap fileExtension=".mem" mimeType="application/octet-stream" /> <mimeMap fileExtension=".data" mimeType="application/octet-stream" /> <mimeMap fileExtension=".unity3d" mimeType="application/octet-stream" /> <mimeMap fileExtension=".jsbr" mimeType="application/octet-stream" /> <mimeMap fileExtension=".membr" mimeType="application/octet-stream" /> <mimeMap fileExtension=".databr" mimeType="application/octet-stream" /> <mimeMap fileExtension=".unity3dbr" mimeType="application/octet-stream" /> <mimeMap fileExtension=".jsgz" mimeType="application/x-javascript; charset=UTF-8" /> <mimeMap fileExtension=".memgz" mimeType="application/octet-stream" /> <mimeMap fileExtension=".datagz" mimeType="application/octet-stream" /> <mimeMap fileExtension=".unity3dgz" mimeType="application/octet-stream" /> <mimeMap fileExtension=".json" mimeType="application/json; charset=UTF-8" /> <mimeMap fileExtension=".unityweb" mimeType="application/octet-stream" /> </staticContent> <directoryBrowse enabled="true" /> </system.webServer> </configuration>
4、Unity代码注意事项
1).发布报错:程序中出现DLL调用的情况,删除调用DLL相关代码。
2).WebGL无法通过IO流读取本地json文件:改成TextAsset绑定json来读取。
3).原版解析json使用JsonDotNet但是无法在WebGL上使用:使用Unity自带的JsonUtility类进行解析。
4).使用JsonUtility解析时报错:用于解析json的类以及子类需要[Serializable]序列化。
5).解析json时有个别json文件报错:对应的json文件有格式错误,多了逗号,就删除多余的逗号。但是JsonDotNet并没有报错。
6).方向键无法执行相关的步骤:原因是JsonUtility解析的数据与原本JsonDotNet解析的数据有不同的地方,比如JsonUtility解析空数据时List会有实例,但是Count为0,而JsonDotNet解析的时候回没有实例为Null,这样源码有判断是否为Null的时候就出现问题了,解决办法是将JsonUtility解析不同的数据改成原版一样的。
7).点击保存按钮出错:保存使用了IO流,注释掉相关代码,改为临时保存。
8).无法解析二维数组的json文件:JsonUtility无法解析带二维数组的json文件,改成一维数组去解析,解析后一维数组转回二维数组。JsonUtility无法用字典去解析,创建一个解析的数据类,解析完后把数据转换回需要的数据。
9).由于之前删除了绘图插件的DLL,导致无法绘图:使用新的绘图方式替换。
已有 7280 位网友参与,快来吐槽:
发表评论