unity Addressable 使用记录

https://my.oschina.net/u/4309973/blog/4479945
先说下代码的加载方式

--------------------------------------------------------------------单个物体加载-------------------------------------------------------------------------------------

先说下普通加载单个物体

先声明一个Addressable  

引用命名空间

using UnityEngine.AddressableAssets;
using UnityEngine.ResourceManagement.AsyncOperations;

声明单个Addressable  

public AssetReference  m_AssetReference;

加载调用方法

m_AssetReference.InstantiateAsync()

当然也有回调方法

 

--------------------------------------------------------------------使用标签加载单个或者全部-------------------------------------------------------------------------------------

声明标签变量

public AssetLabelReference m_TowerLable;

异步加载事件

 void Start()
    {
        Addressables.LoadAssetsAsync<GameObject>(m_TowerLable,null).Completed += OnResourcesRetrieved;
    }

 

可以获取到数组  怎么加载你自己看咯,随便写下(这里的数组顺序不是按照标签顺序来的,是无序的)

private void OnResourcesRetrieved(AsyncOperationHandle<IList<GameObject>> obj)
    {
        Instantiate(obj.Result[0]);
        Instantiate(obj.Result[1]);
        Instantiate(obj.Result[2]);
    }

--------------------------------------------------------------------使用集合存储方式加载单个或者全部物体-------------------------------------------------------------------------------------

额 ,这里就不说了,很简单 直接上代码了

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.ResourceManagement.AsyncOperations;

public class instancetiti : MonoBehaviour
{
    public AssetReference  m_AssetReference;

    public List<AssetReference> m_Characters;
    bool m_AssetsReady = false;
    int m_ToLoadCount;
    int m_CharacterIndax = 0;

    void Start()
    {
        m_ToLoadCount = m_Characters.Count;
        //m_AssetReference.InstantiateAsync();

        foreach (var character in m_Characters)
        {
            character.LoadAssetAsync<GameObject>().Completed += OnCharacterAssetLoaded;
        }
    }

    private void Update()
    {
        
    }

    public void SpawnCharacter(int charaterType)
    {
        if (m_AssetsReady)
        {
            m_Characters[charaterType].InstantiateAsync();
        }
    }

    void OnCharacterAssetLoaded(AsyncOperationHandle<GameObject> obj)
    {
        m_ToLoadCount--;

        if (m_ToLoadCount <= 0)
            m_AssetsReady = true;
    }

    private void OnDestroy()
    {
        foreach (var character in m_Characters)
        {
            character.ReleaseAsset();
        }
    }
}

------------------------------------------------------------------------------------------------------------无关脚本--------------------------------------------------------------------------

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.ResourceManagement.AsyncOperations;

public class AddressablesManager : MonoBehaviour
{
    public IList<GameObject> m_Towers;

    public AssetLabelReference m_TowerLable;

    bool IsCompleted;

    public static GameObject fengXiang;

    void Start()
    {
        Addressables.LoadAssetsAsync<GameObject>(m_TowerLable, null).Completed += OnResourcesRetrieved;
        StartCoroutine(InstacntiateTime());
    }

    private void OnResourcesRetrieved(AsyncOperationHandle<IList<GameObject>> obj)
    {
      
        m_Towers = obj.Result;
        IsCompleted = true;

    }

    public IEnumerator InstacntiateTime()
    {
        while (true)
        {
            if (IsCompleted&&GameManager.AB_Loding)
            {
                Debug.Log("InstacntiateTime------------------------");
                foreach (var item in m_Towers)
                {
                    Instantiate(item);
                }
                fengXiang = GameObject.Find("fengxiang(Clone)");
                break;
            }
            else
            {
                yield return null;
            }
        }
    }
}

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

参考https://www.icode9.com/content-4-694479.html

 

 

Unity新的资源管理系统 Addressable

正好学习到Unity新的资源管理系统 在这里给大家分享一下最近的一些想法
如果你也在学习 那么我这里可能有你需要的内容 (也可能没有)

经历的项目中 以前都是bundle去处理资源以及依赖关系,但是当内容过多时依赖关系及其不好处理(也可能是都这个样子)
这篇文章主要是实践 而非长篇大论的理论 我始终认为实践才是一个合格程序员的正途 废话不多说直接上干货

如果你想了解更细API请参考官网

一、新建unity工程导入Addressables

我用的2018.4.12 在这里导入 Window =>Package Manager

我这里用的1.8.3版本 点安装 我这里安装好了就没有安装了 (注意:不同版本有些功能位置可能不太一样 自己可以找一下 )

二、创建一个资源

我在Hierarchy中创建了一个Image加一个Text简单的一个资源

将资源做成一个prefab放入Resource_hot文件夹

选中Image 将Inspector面板的Addresable勾选

地址可以自己改一下,我这里去掉了Asset

至此资源的制作已经完成了 使用代码就可以加载了 将脚本挂在Canvas上 address填成上面我们修改的那个地址

using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.ResourceManagement.AsyncOperations;

public class LoadGameObject : MonoBehaviour
{
    public string address;
    // Start is called before the first frame update
    void Start()
    {
        Load();
    }

    void Load()
    {
        Addressables.LoadAssetAsync<GameObject>(address).Completed +=
            (op) =>
            {
                if(op.Status == AsyncOperationStatus.Succeeded)
                {
                    Debug.Log(op.Result as GameObject);
                    var go = Instantiate(op.Result as GameObject, Vector3.zero, Quaternion.identity, transform);
                    go.transform.localPosition = Vector3.zero;
                }
            };
    }
}

但是我们是要测试本地热更资源 所以后续还会有一些内容

三、开启本地模拟服务器并配置Remote的地址

打开 Window => Asset ManageMent => Addressables => Hosting

点Create->Local Hosting
Port 填个端口,然后将Enable打勾✔

 

接下来设置RemotePath
打开Profiles窗口 Window => Asset ManageMent => Addressables => Profiles
将RemoteLoadPath改成http://[PrivateIpAddress]:[HostingServicePort]
其他地址不用修改

至此我们本地模拟服务器设置完成

四、配置资源

资源有了,模拟服务器也配置完成了 。接下来我们要配置一下资源,然后将资源放到我们要加载的路径
选中AddressableAssetSettings设置Build Path和Load Path 注意我标箭头的地方

选中Default Local Group 注意标箭头的配置

打开Groups窗口 Window => Asset ManageMent => Addressables => Groups
我这里没有将资源分组,使用的默认的分组 先将Play Mode Script 改成Use Exiting Build ,然后点Build->
New Build ->Default Build Script

到这里配置完成!接下来打个包测试一下。我图省事儿就打的exe

五、测试

打包完成运行!

完美加载!没毛病!!

说好的热更资源呢?别急! 来了!

接下来我们来做一下资源更新

首先改一下资源
然后再打开Group窗口 Window => Asset ManageMent => Addressables => Groups
点Tools->Check for Content Update Restrictions

选择后点Apply Changes
然后点Group窗口的Build->Update a Previous Build
ok 我们再运行一下exe

没毛病!

至此本地模拟热更新就ok了 如果有不明白的小伙伴欢迎私信!

谢谢大家

 

 

上面是连接内内容

经过测试  如果你把包内资源删除一个的话就热更新不了了  呜呜~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

山竹炒大蒜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值