Files
JJBB/Assets/Plugins/Script/AssetUpdate/AssetDependencyInfo.cs
2024-08-23 15:49:34 +08:00

188 lines
5.6 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System.Collections.Generic;
using System.Text;
using UnityEngine;
/// <summary>
/// 运行时使用的资源清单代替Unity的Manifest
/// </summary>
public class AssetDependencyInfo
{
public AssetDependencyItem[] assetList;
public int version;
public static AssetDependencyInfo Create(string path)
{
var bundle = AssetBundle.LoadFromFile(path);
AssetDependencyInfo result = null;
var textAsset = bundle ? bundle.LoadAsset<TextAsset>(AssetConst.versionFile) : null;
if (bundle)
bundle.Unload(false);
if (!textAsset)
Debug.LogError(string.Format("Unable to load TextAsset from {0}!", AssetConst.versionFile));
else
{
var text = Encoding.UTF8.GetString(textAsset.bytes);
int version;
var lines = AssetUtils.TextToLines(text);
if (lines.Length < 1)
{
Debug.LogError("No data in text to create AssetDependencyInfo!");
}
else if (!int.TryParse(lines[0], out version))
{
Debug.LogError("No version number in text to create AssetDependencyInfo!");
}
else
{
var error = false;
var assetList = new List<AssetDependencyItem>();
for (var i = 1; i < lines.Length; i++)
{
var line = lines[i];
if (!string.IsNullOrEmpty(line))
{
var assetItem = AssetDependencyItem.Create(line);
if (assetItem != null)
assetList.Add(assetItem);
else
{
error = true;
break;
}
}
}
if (!error)
{
result = new AssetDependencyInfo
{
version = version,
assetList = assetList.ToArray()
};
}
}
}
return result;
}
public void Write(StringBuilder builder)
{
builder.Append(version);
foreach (var item in assetList)
{
builder.Append('\n');
item.Write(builder);
}
}
}
public class AssetDependencyItem
{
public const int paramLength = 6;
// 资源依赖文件
public string[] dependencies;
// 资源文件大小
public int fileSize;
// 资源后台下载排序参数
public int importance;
// 资源等级对应AssetLevel
public int level;
// 资源hash匹配码
public string md5;
public string name;
// 资源版本号
public int version;
public static AssetDependencyItem Create(string line)
{
AssetDependencyItem result = null;
// 机器生成的数据不会出现需要额外Trim的情况
var segments = line.Split(';');
if (segments.Length < paramLength)
{
Debug.LogError("No enough data in line: " + line);
}
else
{
// 注第一位id仅仅用于适配重用的工具的格式
var name = segments[0];
var md5 = segments[1];
int version;
int level;
int fileSize;
int importance;
if (!int.TryParse(segments[2], out version))
{
Debug.LogError("Unable to get asset version from line: " + line);
}
else if (!int.TryParse(segments[3], out level))
{
Debug.LogError("Unable to get asset level from line: " + line);
}
else if (!int.TryParse(segments[4], out fileSize))
{
Debug.LogError("Unable to get asset fileSize from line: " + line);
}
else if (!int.TryParse(segments[5], out importance))
{
Debug.LogError("Unable to get importance from line: " + line);
}
else
{
var count = segments.Length - paramLength;
var dependencies = count > 0 ? new string[count] : new string[0];
for (var i = 0; i < count; i++)
dependencies[i] = segments[i + paramLength];
result = new AssetDependencyItem
{
name = name,
md5 = md5,
version = version,
level = level,
fileSize = fileSize,
importance = importance,
dependencies = dependencies
};
}
}
return result;
}
public void Write(StringBuilder builder)
{
builder.Append(name);
builder.Append(';');
builder.Append(md5);
builder.Append(';');
builder.Append(version);
builder.Append(';');
builder.Append(level);
builder.Append(';');
builder.Append(fileSize);
builder.Append(';');
builder.Append(importance);
if (dependencies != null)
foreach (var dependency in dependencies)
{
builder.Append(';');
builder.Append(dependency);
}
}
}
public static class AssetLevel
{
// level0 = 使用时下载1 = 后台持续下载2 = 初始化下载3 = 首包资源
public const int onUse = 0;
public const int onRunning = 1;
public const int onInit = 2;
public const int inApk = 3;
}