Unity 网络系统

本文介绍了一个使用Unity进行网络请求的系统实现,包括HttpGet、HttpPost、文件上传等功能,并提供了URL编码及参数处理的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using UnityEngine;
using UnityEngine.Networking;

namespace Framework {
	class NetworkSystem : Singleton<NetworkSystem> {
		private const string FORMAT_COMMAND = "{0}/{1}";
		private const string FORMAT_ARG = "{0}?{1}";
		private const string FORMAT_ARGS = "{0}={1}&";

		/// <summary>
		/// Http请求回调
		/// </summary>
		public static event Action<UnityWebRequest> OnHttpRequest;

		/// <summary>
		/// Http返回回调
		/// </summary>
		public static event Action<UnityWebRequest> OnHttpReturn;

		/// <summary>
		/// 请求Http Get
		/// </summary>
		/// <param name="url">地址</param>
		/// <param name="callback">回调</param>
		/// <param name="command">命令</param>
		/// <param name="args">参数</param>
		public static void RequestHttpGet (string url, Action<UnityWebRequest> callback, string command, params string[] args) {
			RequestHttp (url, UnityWebRequest.kHttpVerbGET, callback, null, command, args);
		}

		/// <summary>
		/// 请求HttpPost
		/// </summary>
		/// <param name="url">地址</param>
		/// <param name="callback">回调</param>
		/// <param name="data">数据</param>
		/// <param name="command">命令</param>
		/// <param name="args">参数</param>
		public static void RequestHttpPost (string url, Action<UnityWebRequest> callback, string data, string command, params string[] args) {
			RequestHttp (url, UnityWebRequest.kHttpVerbPOST, callback, data, command, args);
		}

		/// <summary>
		/// URL编码
		/// </summary>
		/// <param name="str">字符串</param>
		/// <returns></returns>
		public static string ToUrlString (string str) {
			return WWW.EscapeURL (str);
		}

		/// <summary>
		/// Url 参数列表拼成字符串格式
		/// </summary>
		/// <param name="args">参数</param>
		/// <returns></returns>
		public static string ToUrlParams (params string[] args) {
			//检查参数
			if (args == null || args.Length <= 0) {
				return "";
			}

			//遍历参数
			string argStr = string.Empty;
			for (int i = 0; i < args.Length; i += 2) {
				if (i + 1 > args.Length) { break; }

				string key = ToUrlString (args[i]);
				string value = ToUrlString (args[i + 1]);
				argStr += string.Format (FORMAT_ARGS, key, value);
			}

			argStr = argStr.Remove (argStr.Length - 1); // 删除最后的&
			return argStr;
		}

		/// <summary>
		/// 请求文件上传
		/// </summary>
		/// <param name="url">地址</param>
		/// <param name="callback">回调</param>
		/// <param name="command">命令</param>
		/// <param name="data">数据</param>
		/// <param name="info">信息</param>
		/// <param name="args">参数</param>
		public static void RequestWWWUpload (string url, Action<WWW, string> callback, string command, byte[] data, string info, params string[] args) {
			if (!string.IsNullOrEmpty (command)) {
				url = string.Format (FORMAT_COMMAND, url, command);
			}

			url = string.Format (FORMAT_ARG, url, ToUrlParams (args));

			Core.Instance.StartCoroutine (WWWUpload (url, callback, info, data));
		}

		/// <summary>
		/// www 上传文件
		/// </summary>
		/// <param name="url">地址</param>
		/// <param name="callback">回调</param>
		/// <param name="fileName">文件名</param>
		/// <param name="data">数据</param>
		/// <returns></returns>
		private static IEnumerator WWWUpload (string url, Action<WWW, string> callback, string fileName, byte[] data) {
			WWWForm form = new WWWForm ();
			form.AddField ("type", "file");
			form.AddBinaryData ("log_file", data, fileName);

			WWW w = new WWW (url, form);
			yield return w;

			//回调
			if (callback != null) {
				callback.Invoke (w, w.text);
			}
			yield return null;
		}

		/// <summary>
		/// Http请求
		/// </summary>
		/// <param name="url"></param>
		/// <param name="method"></param>
		/// <param name="callback"></param>
		/// <param name="data"></param>
		/// <param name="command"></param>
		/// <param name="args"></param>
		private static void RequestHttp (string url, string method, Action<UnityWebRequest> callback, string data, string command, params string[] args) {
			if (!string.IsNullOrEmpty (command)) {
				url = string.Format (FORMAT_COMMAND, url, command);
			}

			//参数整理
			var urlParams = ToUrlParams (args);

			if (!string.IsNullOrEmpty (urlParams)) {
				url = string.Format (FORMAT_ARG, url, urlParams);
			}

			//提交协程处理
			Core.Instance.StartCoroutine (HttpCoroutine (url, method, data, callback));
		}

		/// <summary>
		/// Http协程
		/// </summary>
		/// <param name="url">地址</param>
		/// <param name="method">方法</param>
		/// <param name="data">数据</param>
		/// <param name="callback">返回回调</param>
		/// <returns>返回迭代器</returns>
		private static IEnumerator HttpCoroutine (string url, string method, string data, Action<UnityWebRequest> callback) {
			UnityWebRequest request = null;
			if (method == UnityWebRequest.kHttpVerbPUT) {
				request = UnityWebRequest.Put (url, data);
			} else if (method == UnityWebRequest.kHttpVerbPOST) {
				request = UnityWebRequest.Post (url, data);
			} else {
				request = UnityWebRequest.Get (url);
			}

			if (OnHttpRequest != null) {
				OnHttpRequest.Invoke (request);
			}

			yield return request.SendWebRequest ();

			try {
				if (OnHttpReturn != null) {
					OnHttpReturn.Invoke (request);
				}

				if (callback != null) {
					callback.Invoke (request);
				}
				request.Dispose ();
			} catch (Exception e) {
				Debug.LogError ("http回调错误!" + url + " " + e.ToString ());
			}
		}
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值