【Unity使用addressables制作资源热更+实时动态热更基本记录】

一、Addressables基础操作教程
1、下载Addressables插件
点击菜单Window / Package Manager,打开插件包管理界面,搜索addressables
在这里插入图片描述
Addressables的打包方式其实也是AssetBundle格式,只是在此基础上做了一层封装,方便进行管理(比如打包、加载、依赖等)。而我们知道,没有加密的AssetBundle是可以使用AssetStudio等工具轻易进行资源逆向的。

安装成功后,可以看到多出了一个Window / Asset Management / Addressables菜单,
在这里插入图片描述
2、创建Addressables Settings
点击Groups菜单,点击Create Addressables Settings按钮

在这里插入图片描述
此时工程目录中会生成一个AddressableAssetsData文件夹,里面有很多设置文件
在这里插入图片描述
我们看回Addressables Groups窗口,可以看到它默认创建了一个组:Default Local Group (Default)
在这里插入图片描述
3、给Group添加资源
创建几个预设
在这里插入图片描述
文件名字可以任意起,注意不要跟Unity默认的文件系统文件夹名字相同,比如Resources、StreamingAssets等

选中资源文件,在Inspector窗口中勾选Addressable,它会自动添加到默认的Group中,也可以手动拖拽进去
在这里插入图片描述
4、创建新的Group
在这里插入图片描述图中1是默认的,一般用作添加打到本地自资源,2用来打远程加载资源

新建看下图
在这里插入图片描述
其实每个Group都是一个配置文件,可以在AddressableAssetsData / AssetGroups目录中找到对应的文件,如下
在这里插入图片描述
继续往下,我这里给Packed Assets添加了几个预设

在这里插入图片描述
怎么打包体内资源和包体外资源?又怎么加载?往下看。。

5、设置Build Path与Load Path
在Inspector窗口中,选中Packed Assets,将Build Path改为RemoteBuildPath,将Load Path改为RemoteLoadPath,如下
在这里插入图片描述
这样Packed Assets打出的资源就在包体外,它会被打到工程目录的ServerData目录中

而加载的时候,会去远程http://[PrivateIpAddress]:[HostingServicePort]这个地址加载(这里是localhost,我们可以改成别的IP或域名地址)

在这里插入图片描述
图1是打包的路径,图中2是加载的路径

在Inspector窗口中,选中Default Local Group,默认的Build Path为LocalBuildPath,Load Path为LocalLoadPath,如下
在这里插入图片描述
这里打出的包就在包体内,打出的包在Library\com.unity.addressables里面,在Bulid Settings出项目包时,会自动把这个资源包拷贝到StreamingAssets目录下。

6、修改RemoteBuildPath和RemoteLoadPath
如果你想修改RemoteBuildPath和RemoteLoadPath,可以在Addressables Groups窗口中点击Tools/Window/Profiles菜单
在这里插入图片描述
此时会打开Addressables Profiles窗口,我们可以修改修改RemoteBuildPath和RemoteLoadPath
在这里插入图片描述
这里RemoteLoadPath修改成远程服务器地址,我这里是用本地addressables自带的Hosting服务器,所以填写的是http://[PrivateIpAddress]:[HostingServicePort],怎么使用自带的服务器,往后看

扫描二维码关注公众号,回复: 16010250 查看本文章

7、打Addressable资源包
在Addressables Groups窗口中,点击Build / New Build / Default Build Script,就会开始打Addressable资源包了,等它打包完毕即可

在这里插入图片描述
上文中我们建了两个Group,其中Default Local Group作为包体内的资源包,Packed Assets作为包体外的资源包,我们分别看看他们都build到哪去了。

在这里插入图片描述
首先看下Default Local Group,上图就可以看到在工程目录Library下

接着我们看下Remote Group打出来的资源包,在工程目录的ServerData目录下,这是打包自动新建的,这里的资源是需要放到远程服务器加载。
在这里插入图片描述
8、加载Addressable资源
我们加载资源的时候,并不需要知道目标资源到底是在哪个Group中,也不需要知道这个Group到底是本地资源包还是远程资源包,统一通过资源的Addressable Name来加载,资源的Addressable Name在哪里看呢?
比如Capsule预设,在Inspector窗口中,可以看到它的Addressable Name为d,这个名字是我们自己改的,不然就是显示默认路径。
在这里插入图片描述

开始写代码,首先引入命名空间

using UnityEngine.AddressableAssets;

然后使用Addressables.LoadAssetAsync方法加载资源,监听Completed 回调,在回调中拿到资源然后进行操作,示例:

 public Button btn;
    public InputField inp;

    public RawImage img;
    public Button freeResBtn;
    public Texture2D tex2D;

    private AsyncOperationHandle<Texture2D> handle;
    private AsyncOperationHandle<GameObject> handle1;

    private GameObject gam;
void Start()
    {
    
    
        btn.onClick.AddListener(() => BtnClick(inp.text));
        freeResBtn.onClick.AddListener(() => BtnShif(inp.text));
        BtnClick("d");
    }
 private void BtnClick(string name)
    {
    
    

        //不能用这个方式加载,用它加载不能完全释放不能动态新增资源
        //Addressables.LoadAssetAsync<GameObject>(name).Completed += (obj) =>
        //{
    
    
        //    gam = obj.Result;
        //    Instantiate(gam);
        //};

        //用这个方式加载资源
        handle1 = Addressables.LoadAssetAsync<GameObject>(name);
        handle1.Completed += OnLoadCompleted1;
    }
     void OnLoadCompleted1(AsyncOperationHandle<GameObject> obj)
    {
    
    
        if (obj.Status == AsyncOperationStatus.Succeeded)
        {
    
    
            gam = obj.Result;
            gam=Instantiate(gam);
        }
        else
        {
    
    
            Debug.LogError("Failed to load asset: " + obj.OperationException.ToString());
        }

    }

把脚本挂在场景中,运行Unity,可以看到,正常加载了Capsule并实例化了
在这里插入图片描述
9、Addressable资源三个加载模式
上面是默认从Asset Database加载的,Addressables系统为了方便我们在Editor环境下方便测试,默认都是直接从Asset Database加载的,我们可以在Addressables Groups窗口的Play Mode Script中进行切换,建议编辑器环境下使用Use Asset Database (fastest)即可
在这里插入图片描述
Use Asset Database (fastest) 直接加载文件而不打包,快速但Profiler获取的信息较少
Simulate Groups (advanced) 在不打包的情况下模拟AssetBundle的操作
Use Exising Build(requires built groups) 实际上是从AssetBundle打包和加载

9.1、Use Asset Database (fastest)
在这个模式下,Addressables系统会直接从AssetDatabase加载资源,我们 不需要 Build打Addressable资源包,这个加载速度最快,建议在项目开发阶段使用这个模式,加载速度快

9.2、Simulate Groups (advanced)
这个模式下,也是不需要 Build打Addressable资源包的,是模拟资源包加载

9.3、Use Exising Build(requires built groups)
这个模式下,需要先执行Build打出Addressable资源包,它会根据Load Path去加载真正的AssetBundle文件并读取资源。如果不先Build,运行时会报错

10、加载远程Addressable资源
我们上面的Packed Assets是打成包外资源的,我们想要在Editor环境下测试远程加载,这个时候就需要先搭建一个Web服务器了,支持通过http请求来获取资源。Addressable系统已经帮我们做了一个Hosting Services工具,方便我们快速启动一个Web服务器。

点击菜单Window / Asset Management / Addressables / Hosting
在这里插入图片描述
接着点击Create / Local Hosting,创建一个本地Web服务器
在这里插入图片描述
然后勾选Enable
在这里插入图片描述

这样我们就开启了一个本地的服务器了,IP地址是我本机的局域网IP,我可以通过localhost进行访问,注意这里的端口号是58719。
我们可以看到,它对我们上文中提到的两个文件夹目录进行了Hosting

11、加载远程的资源
上面我们已经打了build资源包,这里直接改代码加载远程资源Cube,也就是名字c。

void Start()
    {
    
    
        //btn.onClick.AddListener(() => BtnClick(inp.text));
        //freeResBtn.onClick.AddListener(() => BtnShif(inp.text));
        BtnClick("c");
    }

运行效果,加载了远程资源c
在这里插入图片描述
12、看看Addressables是如何知道去哪里加载资源
我现在把资源托管到服务器上,我把RemoteLoadPath改为服务器的地址
在这里插入图片描述
这个打开方式
在这里插入图片描述
13、Group里的设置项和使用
在这里插入图片描述
图中1,如果要在程序运行状态下实时的更新刷新资源,就要把AssetBundleCRC选择Disables
图中2,BundleMode中有三个选项,第一个是把资源打到一起,第二个是把资源分开打成单个,第三个是根据Labels去打包,同一个Labels打到一起
图中3,BundleNamingMode是打出资源的名字,默认是第二个是按哈希值出包名,选第一个Filename是按自定义名字打包

14、打远程资源热更包
想要支持热更新,需要先开启Catalog,选中AddressableAssetSettings,然后勾选Build Remote Catalog
在这里插入图片描述
图中1,是定义打出的Catalog的自定义名字,不填就是哈希值
图中2,要远程资源热更需要勾选,选择自己定义的路径

实时动态热更和资源释放看这个

好了,后面在加其他的。。。。。

猜你喜欢

转载自blog.csdn.net/CPCM_VN/article/details/131127916