Bootstrap

Addressable学习

AssetsBundle是Unity的资源管理机制,将资源打包到AssetsBundle资源包并提供接口能从ab包里面加载资源出来。有了这个机制以后,我们要做资源管理,还需要做:

  a: 根据项目需求,编写编辑器扩展,提供指定资源打入对应bundle包工具策略;

  b: 根据项目的需求,资源包的依赖,提供ab包资源加载与释放的策略;

  c: 根据项目版本管理,更新需求,提供ab包的更新与增量下载策略;

  d: 项目资源加密的策略;

上面出现了两个频繁的词汇”机制,策略”, 机制提供的功能給上层使用,策略是基于机制,来实现具体怎么用。AssetsBundle 属于底层的资源加载与管理的机制。而我们框架中做的编辑器扩展,资源管理是基于机制的使用策略

 

Unity引擎考虑到上面a, b, c, d等策略对普通开发者实现有难度,于是帮我们实现了Addressable,它基于AssetsBundle机制, 实现的上述a, b, c, d等功能的一整套资源管理策略。没有错,Addressable是基于AssetsBundle的

 

AssetsBundle 是机制,Addressable是具体实现的一种资源管理的策略,AssetsBundle做资源管理并没有过时。Addressable是一种资源管理策略,如果策略不满足你项目的需求,你也可以用原来自己开发的基于AssetsBundle的资源管理策略而不用Addressable。比如你对加密有自己特殊的要求,比如你觉得Addressable还没有之前项目扩展的资源管理策略符合项目需求,你就可以不使用Addressable。

using UnityEngine.AddressableAssets;
using DG.Tweening;

public AssetReference baseCube;      

  Addressables.LoadAssetAsync<GameObject>("Assets/Prefabs/New Folder/Capsule.prefab").Completed += (handle) =>
        {
            GameObject prefab = handle.Result;
            GameObject boxObj = Instantiate(prefab);
            boxObj.transform.DOPath(new Vector3[] { Vector3.zero, -Vector3.one * 10, Vector3.zero }, 1f, PathType.CatmullRom);
        };

        //baseCube.InstantiateAsync().Completed += (handle) =>
        //{
        //    GameObject obxPrefabs = handle.Result;
        //    //GameObject cubObj = Instantiate(obxPrefabs);

        //    obxPrefabs.transform.DOPath(new Vector3[] { Vector3.zero, Vector3.one * 10, Vector3.zero }, 1f, PathType.CatmullRom);
        //};

学习自:Unity Addressable资源管理方案实战详解 - rain4414 - 博客园

跳过启动画面

#if !UNITY_EDITOR
using UnityEngine;
using UnityEngine.Rendering;
using UnityEngine.Scripting;

[Preserve]
public class SkipUnityLogo
{
    [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSplashScreen)]
    private static void BeforeSplashScreen()
    {
        System.Threading.Tasks.Task.Run(() => 
        {
            SplashScreen.Stop(SplashScreen.StopBehavior.StopImmediate);
        });
    }
}
#endif


using UnityEngine;
using UnityEngine.Rendering;

public abstract class SkipSplashScreen
{
    [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSplashScreen)]
    private static void Skip()
    {
        System.Threading.Tasks.Task.Run(AsyncSkip);
    }


    private static void AsyncSkip()
    {
        SplashScreen.Stop(SplashScreen.StopBehavior.StopImmediate);
    }
}

;