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);
}
}