WooAsset-运行时扩展功能

实例化 物体

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

// 干点啥

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

AssetReference && 使用例子

  [System.Serializable]
  public class AssetReference<T> : AssetReference where T : UnityEngine.Object
  {
      public override Type type => typeof(T);
  }
    public class AssetExample : UnityEngine.MonoBehaviour
    {
        public Image image;
        public AssetReference<UnityEngine.Sprite> assetReference;
    }

资源模糊搜索


//获得所有资源路径
 public static IReadOnlyList<string> GetAllAssetPaths() ;
 //获得一个tag 的所有路径
 public static IReadOnlyList<string> GetTagAssetPaths(string tag) ;
 //获得所有资源路径
 public static IReadOnlyList<string> GetAllTags();

 //更具tag 获得唯一 资源
 public static string GetUniqueAssetPathByTag(string tag);
 //获得所有满足条件的资源
 public static IReadOnlyList<string> GetAssetPath(Func<AssetData, bool> fit);
 //获得唯一满足条件的资源
 public static string GetUniqueAssetPath(Func<AssetData, bool> fit);
 //通过名字找到名字一致的资源
 public static IReadOnlyList<string> GetAssetsByAssetName(string name) ;
//得到对应路径数据
 public static AssetData GetAssetData(string assetPath);

资源组加载

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

//准备一组资源
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 不自动卸载,到达一定大小在开始卸载
  • 如果内存不足时候,最早被使用的资源会被优先卸载
  • 内存设置的别太小,容易出现资源丢失