unity 多图集ab加载获取其中的sprite

Unity图集精灵管理

这玩意简单 直接上脚本蛤:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class SpriteManager 
{
    private static  Dictionary<string, Object[]> m_pAtlasDic= new Dictionary<string, Object[]>();//图集的集合  
   
    //加载图集上的一个精灵  
    public static Sprite LoadAtlasSprite(string _spriteAtlasPath, string _spriteName)
    {
        Sprite _sprite = FindSpriteFormBuffer(_spriteAtlasPath, _spriteName);
        if (_sprite == null)
        {
            AssetBundle modelAb = GameManager.Instance.abLoadManger.Load_assetBundle("item.unity3d");
            Object[] _atlas = modelAb.LoadAllAssets();// Resources.LoadAll(_spriteAtlasPath);
            m_pAtlasDic.Add(_spriteAtlasPath, _atlas);
            _sprite = SpriteFormAtlas(_atlas, _spriteName);
        }
        return _sprite;
    }
    //删除图集缓存  
    public static void DeleteAtlas(string _spriteAtlasPath)
    {
        if (m_pAtlasDic.ContainsKey(_sprit
<think>好的,用户想了解在Unity中如何加载AssetBundle,需要教程和示例。首先,我需要回忆一下Unity中AssetBundle的基本概念和流程。根据用户提供的引用内容,引用[2]提到了创建和构建AssetBundle的步骤,引用[3]和[4]涉及具体的加载方法以及协程的使用。 首先,应该分步骤讲解,从创建AB包开始,包括资源标记和构建过程。然后,加载部分需要覆盖本地和网络两种方式,可能还要提到同步和异步加载的区别。用户提到的示例代码可能需要用Python,但Unity主要用C#,所以要注意代码的正确性。 然后,考虑用户可能的误区,比如协程的使用,引用[4]提到有人可能过度依赖协程,但实际上Unity的异步操作可以用async/await或者回调函数。需要解释不同方法的优缺点,比如Update驱动的加载可能影响性能,而协程更简洁。 还需要注意引用的正确应用,比如在说明加载方法时引用对应的资料。例如,加载本地包用引用[2],加载图集用引用[3],异步加载的注意事项用引用[4]。 用户可能还需要知道如何卸载AB包,避免内存泄漏,引用[1]提到卸载机制,这部分要补充。最后,生成相关问题时,要覆盖性能优化、热更新、内存管理等方面,帮助用户深入理解。 检查是否有遗漏的步骤,比如构建AB包时的路径设置,加载后的实例化,以及错误处理。确保代码示例正确,比如使用UnityWebRequest加载网络资源,正确使用Unload方法。 总结:分步骤讲解创建、加载(本地和网络)、卸载,提供代码示例,并解释注意事项,引用对应的资料,最后生成相关问题。</think>### Unity AssetBundle 加载教程与示例 #### **一、AssetBundle 创建与构建** 1. **资源标记** 在 Unity 编辑器中选择资源(如预制体、纹理等),在 Inspector 窗口底部设置 AssetBundle 名称和变体,例如:`environment/terrain`[^2]。 2. **构建 AssetBundle** 使用脚本调用 `BuildPipeline.BuildAssetBundles` 方法生成 AB 包: ```csharp using UnityEditor; using System.IO; public class BuildAB : EditorWindow { [MenuItem("Tools/Build AssetBundles")] static void Build() { string outputPath = Path.Combine(Application.streamingAssetsPath, "AssetBundles"); if (!Directory.Exists(outputPath)) Directory.CreateDirectory(outputPath); BuildPipeline.BuildAssetBundles(outputPath, BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows64); } } ``` 生成的 AB 包会保存在 `StreamingAssets/AssetBundles` 目录下[^2]。 --- #### **二、AssetBundle 加载方法** ##### **1. 本地加载** - **同步加载** ```csharp AssetBundle localBundle = AssetBundle.LoadFromFile(Path.Combine(Application.streamingAssetsPath, "AssetBundles/environment/terrain")); GameObject terrainPrefab = localBundle.LoadAsset<GameObject>("DesertTerrain"); Instantiate(terrainPrefab); localBundle.Unload(false); // 卸载 AB 包但不销毁已加载资源 ``` - **异步加载(协程)** ```csharp IEnumerator LoadLocalABAsync() { var bundleLoadRequest = AssetBundle.LoadFromFileAsync(path); yield return bundleLoadRequest; AssetBundle bundle = bundleLoadRequest.assetBundle; var assetLoadRequest = bundle.LoadAssetAsync<GameObject>("DesertTerrain"); yield return assetLoadRequest; Instantiate(assetLoadRequest.asset); bundle.Unload(false); } ``` 通过协程避免主线程阻塞[^4]。 ##### **2. 网络加载** ```csharp using UnityEngine.Networking; IEnumerator LoadWebAB() { string url = "http://example.com/ab/environment_terrain"; UnityWebRequest request = UnityWebRequestAssetBundle.GetAssetBundle(url); yield return request.SendWebRequest(); if (request.result == UnityWebRequest.Result.Success) { AssetBundle webBundle = DownloadHandlerAssetBundle.GetContent(request); GameObject terrain = webBundle.LoadAsset<GameObject>("DesertTerrain"); Instantiate(terrain); } else { Debug.LogError("加载失败: " + request.error); } } ``` ##### **3. 加载图集资源** 若图集中的 Sprite 单独打包,可使用 `LoadAllAssets`: ```csharp AssetBundle atlasBundle = AssetBundle.LoadFromFile(atlasPath); Sprite[] sprites = atlasBundle.LoadAllAssets<Sprite>(); // 获取指定名称的 Sprite Sprite targetSprite = System.Array.Find(sprites, s => s.name == "icon_sword"); atlasBundle.Unload(false); ``` 此方法适合动态加载 UI 元素[^3]。 --- #### **三、关键注意事项** 1. **内存管理** - 加载后通过 `Unload(false)` 释放 AB 包文件内存,但保留已实例化的资源。 - 彻底卸载需调用 `Unload(true)`,但会销毁所有关联资源[^1]。 2. **异步加载优化** - 使用 `Addressables` 或 `AssetBundleManager` 替代原生 API,简化依赖管理和版本控制[^4]。 - 避免在 Update 中频繁调用加载逻辑,优先使用协程或异步任务。 3. **依赖关系** 若 AB 包依赖其他包,需先加载依赖包: ```csharp AssetBundle manifestBundle = AssetBundle.LoadFromFile(manifestPath); AssetBundleManifest manifest = manifestBundle.LoadAsset<AssetBundleManifest>("AssetBundleManifest"); string[] dependencies = manifest.GetAllDependencies("environment/terrain"); foreach (string dep in dependencies) AssetBundle.LoadFromFile(Path.Combine(path, dep)); ``` --- #### **四、完整示例:加载并显示模型** ```csharp using UnityEngine; using System.Collections; public class ABLoader : MonoBehaviour { IEnumerator Start() { string path = Path.Combine(Application.streamingAssetsPath, "AssetBundles/characters/knight"); AssetBundleCreateRequest request = AssetBundle.LoadFromFileAsync(path); yield return request; AssetBundle bundle = request.assetBundle; GameObject knightPrefab = bundle.LoadAsset<GameObject>("Knight_Red"); Instantiate(knightPrefab, transform.position, Quaternion.identity); bundle.Unload(false); } } ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值