UFL5-8——UnityWebRequest资源加载模块

前置知识点:

  1. ​UnityWebRequest​ 相关知识 —— Unity网络开发基础
  2. 泛型 相关知识 —— C#四部曲C#进阶中
  3. 协同程序 相关知识 —— Unity四部曲之Unity基础中
  4. 反射中的Type 相关知识 —— C#四部曲C#进阶中
  5. 委托 相关知识 —— C#四部曲C#进阶中

重要内容回顾

WWW​ 和 UnityWebRequest​ 都是Unity提供给我们的简单的访问网页的类,我们可以利用它们来进行数据的上传和下载
除此之外,它们都支持 file://​ 本地文件传输协议,我们可以利用该协议来异步加载本地文件

特别是在Android平台时,我们无法直接通过C#中的File​公共类加载StreamingAssets文件夹中的内容
我们需要使用 WWW​ 或 UnityWebRequest​ 类来加载

UnityWebRequest资源加载模块我们主要做什么

我们主要封装 UnityWebRequest​ 当中的

  1. 获取文本或二进制数据 方法
  2. 获取纹理数据 方法
  3. 获取AB包数据 方法

制作UWQResManager​,让外部使用UnityWebRequest​加载资源时更加方便

封装UnityWebRequest中的方法

主要将 加载文本、加载文本字节数组、加载纹理、加载AB包 的几个方法n合一,封装在一个泛型异步方法中,方便外部使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
using System;
using System.Collections;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.Networking;

public class UWQResManager : SingletonAutoMono<UWQResManager>
{
/// <summary>
/// 利用UnityWebRequest去加载资源
/// </summary>
/// <typeparam name="T">加载类型(只能是string、byte[]、Texture、AssetBundle)</typeparam>
/// <param name="path">资源路径、要自己加上协议前缀(http://、ftp://、file://)</param>
/// <param name="callBack">加载成功的回调函数</param>
/// <param name="failCallBack">加载失败的回调函数</param>
public void LoadRes<T>(string path, UnityAction<T> callBack, UnityAction failCallBack) where T : class
{
StartCoroutine(ReallyLoadRes<T>(path, callBack, failCallBack));
}

public IEnumerator ReallyLoadRes<T>(string path, UnityAction<T> callBack, UnityAction failCallBack) where T : class
{
Type type = typeof(T);
UnityWebRequest request = null;
//根据不同类型,调用不同的加载API
if (type == typeof(string) ||
type == typeof(byte[]))
request = UnityWebRequest.Get(path);
else if (type == typeof(Texture))
request = UnityWebRequestTexture.GetTexture(path);
else if (type == typeof(AssetBundle))
request = UnityWebRequestAssetBundle.GetAssetBundle(path);
//如果不能加载
else
{
failCallBack?.Invoke();
yield break;
}
//等待加载成功
yield return request.SendWebRequest();
if (request.result == UnityWebRequest.Result.Success)
{
if (type == typeof(string))
callBack?.Invoke(request.downloadHandler.text as T);
else if (type == typeof(byte[]))
callBack?.Invoke(request.downloadHandler.data as T);
else if (type == typeof(Texture))
callBack?.Invoke(DownloadHandlerTexture.GetContent(request) as T);
else if (type == typeof(AssetBundle))
callBack?.Invoke(DownloadHandlerAssetBundle.GetContent(request) as T);
}
else
failCallBack?.Invoke();
request.Dispose();
}
}

使用示例

假设要加载StreamingAssets文件夹下的test.txt,UWQResTeach.png,testAB包文件

image

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
public class Main : MonoBehaviour
{
public RawImage img;

void Start()
{
UWQResManager.Instance.LoadRes<string>($"file://{Application.streamingAssetsPath}/test.txt", (text) =>
{
Debug.Log("加载的文本消息" + text);
}, () =>
{
Debug.Log("加载失败");
});

UWQResManager.Instance.LoadRes<byte[]>($"file://{Application.streamingAssetsPath}/test.txt", (bytes) =>
{
Debug.Log("加载的二进制字节数组消息" + bytes.Length);
Debug.Log(Encoding.UTF8.GetString(bytes));
}, () =>
{
Debug.Log("加载失败");
});
UWQResManager.Instance.LoadRes<Texture>($"file://{Application.streamingAssetsPath}/UWQResMgrTeach.png", (tex) =>
{
img.texture = tex;
}, () =>
{
Debug.Log("加载失败");
});
UWQResManager.Instance.LoadRes<AssetBundle>($"file://{Application.streamingAssetsPath}/test", (ab) =>
{
Debug.Log($"ab包加载成功,名字是:{ab.name}");
}, () =>
{
Debug.Log("加载失败");
});
}
}

输出:imageimage