AssetManager

资产管理是游戏开发过程中经常会使用的模块,因为你需要读很多配置数据,你需要将Art提供给你的各种模型,贴图等资源显示出来。在Unity中,最经常使用的资产就是Prefab(预制体),下面以Prefab为例来说明AssetManger的使用方式。

首先看一下资产管理相关的接口

// 资产管理接口
public interface IAssetManager : IService
{
    string AssetVersion { get; }
    IAsset Load(string path, AssetType type);
    LoadAsync(string path, AssetType type, Action<IAsset> handler);
    IAsset LoadScene(string path, LoadSceneMode mode);
    void LoadSceneAsync(string path, LoadSceneMode mode, Action<IAsset> handler);
    void GC();
    void UpdateAsync(Action callback);
}

// 资产接口
public interface IAsset : IDisposable
{
    T Cast<T>();
}

// 资产类型
public enum AssetType
{
    Unknown = -1,
    Text,       // 文本
    Texture,    // 纹理
    Bytes,      // 二进制
    SpriteAtlas,// 精灵集,多用于2D和UI
    Prefab,     // 预制体
    AudioClip,  // 音频
    Scene,
    AnimationController,
}

样例1:显示Cube

在场景中创建一个Cube,在工程中创建Resources目录,再创建子目录Prefab,将场景中的Cube拖到Prefab目录上。

第一步:获取IAssetManager接口

详细获取服务方式参见GameBox使用

var assetManager = ServiceCenter.GetService<IAssetManager>();

第二步:使用Load同步创建Cube

using (var asset = assetManager.Load("Prefab/Cube.prefab", AssetType.Prefab)) // 指定Prefab类型
{
    var go = GameObject.Instantiate(asset.Cast<GameObject>());
}

这里有几点需要注意

  1. 资产路径相对于Resources目录,详细参看3D引擎Unity
  2. 资产的名字必须要带有扩展名
  3. 使用C#关键字using是为了超出作用域后主动调用Dispose方法释放资源

当然如果资源很大,则需要考虑使用异步装载方法LoadAsync,防止游戏卡顿。

assetManager.LoadAsync("Prefab/Cube.prefab", AssetType.Prefab, asset =>
{
    var go = GameObject.Instantiate(asset.Cast<GameObject>());
    asset.Dispose(); // 主动释放资源
});

样例二:读取文本文件

在Resources目录下创建子目录Data,放一个文本文件,例如config.txt。

第一步:获取IAssetManager接口

详细获取服务方式参见GameBox使用

var assetManager = ServiceCenter.GetService<IAssetManager>();

第二步:使用Load同步读取文本内容

using (var asset = assetManager.Load("Data/config.txt", AssetType.Text)) // 指定文本类型
{
    var text = asset.Cast<string>(); // 获取文本内容
    Debug.Log(text);
}

注意事项同样例一。

results matching ""

    No results matching ""