1、动态获取配置文件信息
配置文件一般放在StreamAssets文件夹中,这个文件夹在打包以后会在打包生成的文件夹里,方便以后更改配置信息。在代码中通过Application.streamingAssetsPath获取该文件夹的位置。
我这里配置文件是.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) ,出问题了!!!!。报错:
定位代码在这:
解决方法:不要使用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 Overflowhttps://*.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);
在反序列化时一定要写明类型!!!!!!!!!!!!!!!!!!!