赞
踩
异步加载的方式:
[加载分配的Sprite或Atlas的方法].Completed+ = [加载Sprite后要执行的代码];
[加载指定的Sprite或Atlas的方法]随Sprite类型和分配方法而变化。
[Sprite加载后将执行的代码]可以是委托,也可以是lambda表达式(在较简单的情况下)。
用加载sprite为例
using UnityEngine; using System.Collections; using UnityEngine.AddressableAssets; using UnityEngine.ResourceManagement.AsyncOperations; using UnityEngine.U2D; public class SpriteLoader : MonoBehaviour { public AssetReferenceSprite newSprite; private SpriteRenderer spriteRenderer; // Use this for initialization void Start() { spriteRenderer = gameObject.GetComponent<SpriteRenderer>(); newSprite.LoadAssetAsync().Completed += SpriteLoaded; } private void SpriteLoaded(AsyncOperationHandle<Sprite> obj) { switch (obj.Status) { case AsyncOperationStatus.Succeeded: spriteRenderer.sprite = obj.Result; break; case AsyncOperationStatus.Failed: Debug.LogError("Sprite load failed."); break; default: //case AsyncOperationStatus.None: break; } } }
using UnityEngine; using System.Collections; using UnityEngine.AddressableAssets; using UnityEngine.ResourceManagement.AsyncOperations; using UnityEngine.U2D; public class SpriteLoadFromPath : MonoBehaviour { public string newSpriteAddress; public bool useAddress; public AssetReferenceSprite newSprite; private SpriteRenderer spriteRenderer; // Use this for initialization void Start() { spriteRenderer = gameObject.GetComponent<SpriteRenderer>(); if (useAddress) Addressables.LoadAssetAsync<Sprite>(newSpriteAddress).Completed += SpriteLoaded; else newSprite.LoadAssetAsync().Completed += SpriteLoaded; } private void SpriteLoaded(AsyncOperationHandle<Sprite> obj) { switch (obj.Status) { case AsyncOperationStatus.Succeeded: spriteRenderer.sprite = obj.Result; break; case AsyncOperationStatus.Failed: Debug.LogError("Sprite load failed."); break; default: break; } } }
加载图集
Unity官方:
如果同时将Sprite Atlas和源Sprite
Textures标记为可寻址,则最终的AssetBundle将包含重复的数据。有一个Addressables
Analyze规则可以检测到这一点。在这种情况下,我们建议仅将Sprite Atlas标记为可寻址。
using UnityEngine; using System.Collections; using UnityEngine.AddressableAssets; using UnityEngine.ResourceManagement.AsyncOperations; using UnityEngine.U2D; public class SpriteAtlasLoader : MonoBehaviour { public AssetReferenceAtlasedSprite newAtlasedSprite; public string spriteAtlasAddress; public string atlasedSpriteName; public bool useAtlasedSpriteName; private SpriteRenderer spriteRenderer; // Use this for initialization void Start() { //① //spriteRenderer = gameObject.GetComponent<SpriteRenderer>(); //if (useAtlasedSpriteName) //{ // string atlasedSpriteAddress = spriteAtlasAddress + '[' + atlasedSpriteName + ']'; // Addressables.LoadAssetAsync<Sprite>(atlasedSpriteAddress).Completed += SpriteLoaded; //} //else // Debug.Log(newAtlasedSprite.editorAsset.name); // newAtlasedSprite.LoadAssetAsync<Sprite>().Completed += SpriteLoaded; //② spriteRenderer = gameObject.GetComponent<SpriteRenderer>(); Addressables.LoadAssetAsync<SpriteAtlas>(spriteAtlasAddress).Completed += SpriteAtlasLoaded; } private void SpriteLoaded(AsyncOperationHandle<Sprite> obj) { switch (obj.Status) { case AsyncOperationStatus.Succeeded: spriteRenderer.sprite = obj.Result; break; case AsyncOperationStatus.Failed: Debug.LogError("Sprite load failed."); break; default: break; } } private void SpriteAtlasLoaded(AsyncOperationHandle<SpriteAtlas> obj) { switch (obj.Status) { case AsyncOperationStatus.Succeeded: Debug.Log(obj.Result.spriteCount); spriteRenderer.sprite = obj.Result.GetSprite(atlasedSpriteName); break; case AsyncOperationStatus.Failed: Debug.LogError("Sprite load failed. Using default Sprite."); break; default: // case AsyncOperationStatus.None: break; } } }
加载场景
public AssetReference Scene; //加载场景 Scene.LoadSceneAsync().Completed += SceneLoaded; private void SceneLoaded(AsyncOperationHandle<SceneInstance> obj) { switch (obj.Status) { case AsyncOperationStatus.None: break; case AsyncOperationStatus.Succeeded: Scene.LoadSceneAsync(UnityEngine.SceneManagement.LoadSceneMode.Additive); break; case AsyncOperationStatus.Failed: break; } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。