UH3L8——编辑器功能—设置默认资源

前置知识点

  • C#文件操作
  • Unity编辑器相关 [MenuItem()]​、Selection​、AssetDatabase​

为何要设置默认资源

发布后,让不需要更新的AB包或者第一次启动必须要使用的AB包不从服务器上下载,直接从StreamingAssets文件夹内读取

目标

将编辑器中选中的AB包资源文件(无后缀名的文件),复制到StreamingAssets文件夹内,打包后可以随游戏程序一起发布作为默认资源

实现流程

  • 使用特性为菜单栏添加一个选项AB包工具/移动选中资源到StreamingAssets中​,从选项里触发该功能MoveABToStreamingAssets()

  • MoveABToStreamingAssets​内

    1. 通过编辑器Selection​类中的方法,获取在Project窗口选中的资源,如果未选中资源就不执行后续逻辑直接返回出去
    2. 遍历选中的资源对象,通过AssetDatabase.GetAssetPath​获取资源的路径,根据该路径截取文件名
    3. 检查该文件名是否有'.'​,如果有说明有后缀名,说明不是AB包,跳过该文件,检查下一个文件
    4. 使用AssetDatabase.CopyAsset​来讲AB包文件复制到StreamingAssets文件夹下
    5. 读取所有赋值到StreamingAssets文件夹下的AB包文件,获取其文件名,大小,MD5码,生成默认资源对比文件到StreamingAssets文件夹
    6. 刷新编辑器窗口
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
using System.IO;
using UnityEditor;
using UnityEngine;

public class MoveABToSA
{
[MenuItem("AB包工具/移动选中资源到StreamingAssets中")]
private static void MoveABToStreamingAssets()
{
//通过编辑器Selection类中的方法,获取在Project窗口选中的资源
Object[] selectedAsset = Selection.GetFiltered(typeof(UnityEngine.Object), SelectionMode.DeepAssets);
if (selectedAsset.Length == 0)
return;
//用于拼接本地默认AB包资源消息的字符串
string abCompareInfo = "";
//遍历选中的资源对象
foreach (Object asset in selectedAsset)
{
//通过AssetDatabase类获取资源的路径
string assetPath = AssetDatabase.GetAssetPath(asset);
//截取路径当中的文件名,用于作为StreamingAsset中的文件名
string fileName = assetPath.Substring(assetPath.LastIndexOf('/'));
//如果文件名有'.',说明有后缀名,也就不是AB包,因此我们需要忽略掉
if (fileName.IndexOf('.') != -1)
continue;
//利用AssetDatabase中的API将选中文件复制到目标路径
AssetDatabase.CopyAsset(assetPath, "Assets/StreamingAssets" + fileName);
//获取拷贝到StreamingAssets文件夹中的文件的全部信息
FileInfo fileInfo = new FileInfo(Application.streamingAssetsPath + fileName);
abCompareInfo += fileInfo.Name + " " + fileInfo.Length + " " + CreateABCompare.GetMD5(fileInfo.FullName);
abCompareInfo += "|";
}
//去掉最后一个|符号,为了之后拆分字符串方便
abCompareInfo = abCompareInfo.Substring(0, abCompareInfo.Length - 1);
//将本地默认资源的对比消息存入文件
File.WriteAllText(Application.streamingAssetsPath + "/ABCompareInfo.txt", abCompareInfo);
AssetDatabase.Refresh();
}
}