当前位置:   article > 正文

[游戏开发][Unity]Assetbundle加载篇(8)加载场景特殊处理_unity assetbundle加载场景

unity assetbundle加载场景
目录

打包与资源加载框架目录

前言

无论是AB模式还是编辑器模式,都可以加载不在BuildSetting目录里的场景

编辑器加载接口,可以根据场景路径加载:

UnityEditor.SceneManagement.EditorSceneManager.LoadSceneAsyncInPlayMode("Assets/Works/Res/" + _resPath, parameters);

 AB包加载接口,请注意,AB包加载的sceneName不带扩展名(.unity)

  1. string sceneName = System.IO.Path.GetFileNameWithoutExtension(_resPath);
  2. SceneManager.LoadSceneAsync(sceneName, parameters);
正文

ResourceManager获取SceneLoader的时候做个小改变,需要用户层传入 是Add还是Single

无论是AB包加载模式,还是Editor加载模式,要区分加载目标是资源是场景。

 编辑器加载代码:EditorLoadTask,重点看Tick方法里加载目标是Scene的代码

  1. #if UNITY_EDITOR
  2. using System;
  3. using System.Collections;
  4. using System.Collections.Generic;
  5. using UnityEditor;
  6. using UnityEngine;
  7. using UnityEngine.SceneManagement;
  8. public class EditorLoadTask:LoadTaskBase
  9. {
  10. /*
  11. * 使用方式:
  12. * "Works/Res/Prefabs/UIPanel/Canvas.prefab"
  13. * 要带着文件扩展名
  14. */
  15. public override void DoTask()
  16. {
  17. string path = "Assets/Works/Res/" + _loadResPath;
  18. if (_targetType != typeof(Scene))
  19. _target = AssetDatabase.LoadAssetAtPath(path, _targetType);
  20. //模拟异步下一帧加载
  21. _loadState = TaskLoadState.LoadingAsset;
  22. }
  23. public override void Tick()
  24. {
  25. if (_loadState != TaskLoadState.LoadingAsset)
  26. return;
  27. if (_targetType == typeof(Scene))
  28. {
  29. //EditorLoadTask 检查场景是否存在
  30. Scene scene = UnityEditor.SceneManagement.EditorSceneManager.GetSceneByPath("Assets/" + _loadResPath);
  31. if (scene == null) {
  32. _loadState = TaskLoadState.LoadAssetFailed;
  33. //通知ResourceLoader加载成功或失败
  34. _callback?.Invoke(null, false);
  35. }
  36. else
  37. {
  38. _loadState = TaskLoadState.LoadAssetSuccess;
  39. //通知ResourceLoader加载成功或失败
  40. _callback?.Invoke(null, true);
  41. }
  42. }
  43. else
  44. {
  45. _loadState = _target == null ? TaskLoadState.LoadAssetFailed : TaskLoadState.LoadAssetSuccess;
  46. if (_loadState == TaskLoadState.LoadAssetFailed)
  47. LogManager.LogError($"Failed to load asset object : path:{_loadResPath}, type:{_targetType.ToString()}");
  48. 通知Loader加载结果
  49. _callback?.Invoke(_target, _target != null);
  50. }
  51. }
  52. }
  53. #endif

AB加载代码代码太长,在前面的文章里已经贴过源码了,这里就不再展示。

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/102625?site
推荐阅读
相关标签
  

闽ICP备14008679号