WooAsset-运行时扩展功能

实例化 物体

// 创建
  var oppp = await Assets.InstantiateAsync(path, parent);

// 干点啥

  //销毁
  //销毁时候会自动改变引用计数,不需要手动Assets.Release
  oppp.Destroy();

资源模糊搜索

public class AssetsSearch
    {

///以下是交集
        public static IReadOnlyList<string> IntersectNameAndTag(string assetName, params string[] tags);
        public static IReadOnlyList<string> IntersectTag(params string[] tags);

        public static IReadOnlyList<string> IntersectTypeAndNameAndTag(AssetType type, string assetName, params string[] tags);
        public static IReadOnlyList<string> IntersectTypeAndTag(AssetType type, params string[] tags);

///以下是并集

        public static IReadOnlyList<string> Union(params string[] nameOrTags);
        public static IReadOnlyList<string> UnionTag(params string[] tags);
        public static IReadOnlyList<string> UnionName(params string[] names);
        public static IReadOnlyList<string> UnionNameAndTag(string assetName, params string[] tags);
        public static IReadOnlyList<string> UnionTypeAndNameAndTag(AssetType type, string assetName, params string[] tags);
        public static IReadOnlyList<string> UnionTypeAndTag(AssetType type, params string[] tags);

        public static IReadOnlyList<string> AssetPathByType(AssetType type);

    }

资源组加载

何时使用:某些地方必须需要同步加载资源(先准备一下)/ 一次型加载配置表,读取到内存之后,卸载

//准备一组资源
string[] groups ;
var assets= await Assets.PrepareAssets(groups)
//或者按照 tag 准备一组资源
var assets=Assets.PrepareAssetsByTag(tag)



///加载对应的资源方法一
string path;
var asset = assets.FindAsset(path)
///加载对应的资源方法二
var asset = Assets.LoadAssetAsync(path)
///注意:方式二会增加引用计数,需要在合适的地方 Assets.Release(asset)
///方式一不会增加引用计数



///把整组资源全都卸载了
assets.Release();


///配合资源模糊搜索一起使用
//使用场景,进入战斗场景之前把战斗需要的资源全加载

方便的资源卸载

基础方式

  • 场景
  • 一个ui界面上面有一个image
  • 运行时候需要不停的替换image的sprite
  • 界面关闭的时候需要把image的sprite卸载
///所有的设置图片都走这个方法
public static async void SetSprite(Image image, string path)
{
    var asset = await Assets.LoadAssetAsync(path);
    if (asset.isErr) return;
    image.sprite = asset.GetAsset<Sprite>();
    Assets.AddBridge(new GameObjectBridge(image.gameObject,asset));
}
///在合适的时候调用一次即可(比如:切换场景时候)
public static void ReleaseUselessBridges()
{
    Assets.ReleaseUselessBridges();
}

其他类型的资源/组件,可以 继承 AssetBridge< T > 自行实现即可

更加方便的方式(有风险)

public class LocalSetting : AssetsSetting
{
    public override IAssetLife GetAssetLife()
    {
      /// 参数是缓存的内存大小,超过这个数字会自动卸载最早的资源
        return new LRULife(1024 * 50);
    }
}
Assets.SetAssetsSetting(new LocalSetting());
  • 可以实现 bundle 不自动卸载,到达一定大小在开始卸载
  • 如果内存不足时候,最早被使用的资源会被优先卸载
  • 内存设置的别太小,容易出现资源丢失