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了 如果有不明白的小伙伴欢迎私信!
谢谢大家
上面是连接内内容
经过测试 如果你把包内资源删除一个的话就热更新不了了 呜呜~