Unity WebGL 踩同样的坑......

1、动态获取配置文件信息

配置文件一般放在StreamAssets文件夹中,这个文件夹在打包以后会在打包生成的文件夹里,方便以后更改配置信息。在代码中通过Application.streamingAssetsPath获取该文件夹的位置。

Unity WebGL 踩同样的坑......

我这里配置文件是.ini类型,直接导入插件:Advanced INI Parser就可对该类型文件进行读取与修改。

使用该插件的源码:(此时在VS中调试时还没什么问题,但是!!!!!)

   INIParser iniParser = new INIParser();
   iniParser.Open(Application.streamingAssetsPath + "/Config.ini");
   string mUrl = iniParser.ReadValue("ReadDataHttp", "http", "未获取到值时的默认值");

打包webGL在浏览器中运行时,我的配置信息呢?怎么没获取到?查帖子:WebGL平台读取StreamingAssets路径下配置文件 - 程序员大本营

原来是路径的原因,在VS中调试时,就是在PC端运行,程序可以直接获取你文件路径下的文件,但在浏览器中运行时,是不能直接靠文件路径获取的。因为获取配置文件也需要时间,不能让进程直接卡在这,所以使用了协程。上修改代码:

using System.Collections;
using UnityEngine;
using UnityEngine.Networking;
using System.IO;

public class GetConfigFile : MonoBehaviour
{
    public static string url_token = "", url_data = "";
    INIParser iniParser = new INIParser();
    private void Awake()
    {
        StartCoroutine(GetData());
    }

    IEnumerator GetData()
    {
        var uri = new System.Uri(Path.Combine(Application.streamingAssetsPath, "Config.ini"));
       // Debug.Log("Config.ini的地址:" + uri.ToString());
        UnityWebRequest www = UnityWebRequest.Get(uri);
        yield return www.SendWebRequest();

        if (www.isNetworkError || www.isHttpError)
        {
            Debug.Log(www.error);
        }
        else
        {
            string value = www.downloadHandler.text;

            iniParser.OpenFromString(value);
            url_token = iniParser.ReadValue("ReadDataHttp", "http_token", "");
            url_data = iniParser.ReadValue("ReadDataHttp", "http_data", "");
           // Debug.Log(" url_token的地址:" + url_token);
           // Debug.Log("  url_data的地址:" + url_data);
        }
    }
}

2、关于Http请求

一开始我使用的是C#中的类,引用”using System.Web;“,使用HttpWebRequest类实现请求。在使用VS附加到Unity调试时一切正常,但是打包发布到web端运行时直接报错。经过输出日志到JavaScript Console最后定位到HttpWebRequest.GetRequestStream(),可是这里怎么想也不知道错哪了,最后找各种帖子才发现webGL中不支持System.Web(Unity打包WebGL所遇到的坑!!!【附源码】_洞悉ONE_51CTO博客)。哭唧唧................

原来要使用Untiy 中提供的UnitywebRequest;使用方法参照这个帖子UnityWebgl平台与JS交互、使用UnityWebRequest对接_Sunny Blog-CSDN博客

按照这个帖子的操作(Ctrl+C) ,出问题了!!!!。报错:Unity WebGL 踩同样的坑......

 定位代码在这:Unity WebGL 踩同样的坑......

 解决方法:不要使用sendHttpmessage来开启协程StartCoroutine();哪里要调用StartCoroutine()就写在哪里;

修改代码(”将contentType和token添加到参数中“)

using System;
using System.Text;

using UnityEngine;
using UnityEngine.Events;
using UnityEngine.Networking;
using System.Collections;
using System.IO;
namespace WebApplication
{
    public class RestClient1 : MonoBehaviour
    {
        public RestClient1()
        {
            
        }
        public enum UnityWebRequestType
        {
            POST,
            GET
        }

        /// <summary>
        /// 发送HTTP数据
        /// </summary>
        /// <param name="type">请求类型</param>
        /// <param name="url">请求地址</param>
        /// <param name="jsonData">传输的数据</param>
        /// <param name="sendBase64">发送数据是否需要Base64加密</param>
        /// <param name="getBase64">获取数据是否需要Base64加密</param>
        /// <param name="failureCallBack">失败回调</param>
        /// <param name="successCallBack">成功回调</param>
        /// <param name="otherHeaderName">额外添加的头名称</param>
        /// <param name="otherHeaderValue">额外添加的头值</param>
        /// <param name="ContentType">请求的ContentTyp</param>
        /// <param name="token">请求的token</param>
        public IEnumerator WebRequest(UnityWebRequestType type, string url, string jsonData, bool sendBase64, bool getBase64, UnityAction failureCallBack, UnityAction<string> successCallBack, string[] otherHeaderName, string[] otherHeaderValue,string ContentType, string token)
        {
            Debug.Log(type.ToString() + "\t" + url + "\t" + jsonData);
            if (sendBase64)
            {
                jsonData = Convert.ToBase64String(Encoding.UTF8.GetBytes(jsonData));
            }
            byte[] body = Encoding.UTF8.GetBytes(jsonData);


            UnityWebRequest unityWeb = new UnityWebRequest(@url, type.ToString());
            unityWeb.uploadHandler = new UploadHandlerRaw(body);
            unityWeb.SetRequestHeader("Content-Type", ContentType);
            if (token != "")
                unityWeb.SetRequestHeader("Authorization", "Bearer " + token);
            if (otherHeaderName != null)
            {
                for (int i = 0; i < otherHeaderName.Length; i++)
                {
                    unityWeb.SetRequestHeader(otherHeaderName[i], otherHeaderValue[i]);
                }
            }

            unityWeb.downloadHandler = new DownloadHandlerBuffer();
            yield return unityWeb.SendWebRequest();

            if (unityWeb.isNetworkError || unityWeb.isHttpError)
            {
                Debug.LogError("UnityWebRequest 请求失败:" + unityWeb.error);
               failureCallBack?.Invoke();
                yield break;
            }

            if (unityWeb.isDone)
            {
                string result = unityWeb.downloadHandler.text;
                if (getBase64)
                {
                    byte[] c = Convert.FromBase64String(result);
                    result = Encoding.UTF8.GetString(c);
                }
                Debug.Log("UnityWebRequest 请求成功:" + result);
                successCallBack?.Invoke(result);
            }


        }
    }
}

调用:

 (伪代码)
using WebApplication;   
void getdata(){
 RestClient1 mClientD1 = new RestClient1(); //获得data
  StartCoroutine(mClientD1.WebRequest(RestClient1.UnityWebRequestType.POST, url, 
body, false, false, failure, succese, name, value, "application/json",token));

}

void failure()//获取失败
{

}

void succese(string value) //获取成功,value为响应的值
{

}

3、关于Json的序列化与反序列化

这个问题烦死我了!!!!!!!!!!!!!

unity3d - Unity Json.net System.Reflection.Emit error in iOS - Stack OverflowUnity WebGL 踩同样的坑......https://*.com/questions/41582580/unity-json-net-system-reflection-emit-error-in-ios首先:我使用C#中的NewtonJson,在反序列化时报这个错。查了一下(unity-webgl使用Newtonsoft.Json序列化问题_natrace的专栏-CSDN博客)才知道要使用unity中的包。

下载位置: Releases · SaladLab/Json.Net.Unity3D · GitHub

使用:

///命名空间
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

//
  SendData mSenData;
  ...
  string Str= JsonConvert.SerializeObject(mSendData);
  class SendData
    {
        public List<QueryDbData> queries;
        public string table;
        public string type;
    }

  string Str= JsonConvert.SerializeObject(object obj);

//
  JObject obj = JsonConvert.DeserializeObject<JObject>(string str)

我遇到的坑:

在使用JsonConvert.DeserializeObject时,我的代码是:

  dynamic detailData = JsonConvert.DeserializeObject(result);

在Vs中调试的时候没问题,但是已发布就有问题。找了好久才定位到这.

解决方法就是改为

  JObject detailData = JsonConvert.DeserializeObject<JObject>(result);

在反序列化时一定要写明类型!!!!!!!!!!!!!!!!!!!

上一篇:Configure,make,make install详解


下一篇:VR看房项目总结(1)