Unity程序基础框架__场景切换模块

2023-11-06

场景切换


泰课指路牌:https://www.taikr.com/course/1062/task/31006/show.

在研发一款游戏的时候,会涉及到很多个场景的跳转,且在场景跳转的时候很多东西是通过读取配置表去动态生成的相应的玩家场景,下一个游戏场景的相关信息就由上一个场景转换的时候传递过来。场景切换模块提供给外部一个场景切换的接口。


1 相关函数

LoadLevel Loads the level by its name or index. 加载场景,加载之前你需要把场景在Build Settings添加,场景加载后,场景中的激活物体会调用MonoBehavior:OnLevelWasLoaded().使用该方法的时候,之前场景中的物体将会被直接删除。
LoadLevelAdditive Loads a level additively.该方法不销毁当前场景中的物体,新场景中的物体将会被添加进来,这个方法在一些连续加载的场景中非常有用哈。
LoadLevelAdditiveAsync Loads the level additively and asynchronously in the background.在后台异步记载场景unity会在后台线程中加载所有的场景资源,这就允许你在加载新场景过程中播放一个进度条或者通过异步加载为玩家创造一个流程的世界该方法会返回AsyncOperation结构,结构中isDone表示是否完成,progress给出当前的播放进度。注意的是在编辑器中后台线程的性能要低于游戏中。
LoadLevelAsync Loads the level asynchronously in the background.在后台异步记载场景unity会在后台线程中加载所有的场景资源,这就允许你在加载新场景过程中播放一个进度条或者通过异步加载为玩家创造一个流程的世界该方法会返回AsyncOperation结构,结构中isDone表示是否完成,progress给出当前的播放进度。注意的是在编辑器中后台线程的性能要低于游戏中。

相关API

CreateScene (创建场景) Create an empty new Scene at runtime with the given name.
GetActiveScene(得到当前激活的场景) Gets the currently active Scene.
GetSceneAt(根据index得到一个场景) Get the Scene at index in the SceneManager’s list of loaded Scenes.
GetSceneByBuildIndex(通过BuildIndex得到一个场景) Get a Scene struct from a build index.
GetSceneByName(通过名字得到一个场景) Searches through the Scenes loaded for a Scene with the given name.
GetSceneByPath(通过路径得到一个场景) Searches all Scenes loaded for a Scene that has the given asset path.
LoadScene(加载场景) Loads the Scene by its name or index in Build Settings.
LoadSceneAsync(异步加载场景) Loads the Scene asynchronously in the background.
MergeScenes( 合并两个场景) This will merge the source Scene into the destinationScene.
MoveGameObjectToScene(把某个游戏物体移动到场景当中) Move a GameObject from its current Scene to a new Scene.
SetActiveScene (激活某个场景) Set the Scene to be active.
UnloadSceneAsync( 异步卸载某个场景) Destroys all GameObjects associated with the given Scene and removes the Scene from the SceneManager.
sceneCount 当前加载的场景总数。
sceneCountInBuildSettings Build Settings 中的场景数量。
activeSceneChanged 订阅此事件可在活动场景发生变化时收到通知。
sceneLoaded 向此事件添加委托,以在加载场景时收到通知。
sceneUnloaded 向此事件添加委托以在卸载场景时收到通知。

是否销毁:
LoadLevel和LoadLevelAsync,在加载完成后之后将会立刻销毁原先场景中的物体,而LoadLevelAdditive和LoadLevelAdditiveAsync加载后将会保留原先的场景中的物体,这种方式可以实现无缝融合的场景,只需要你在适当的位置加载后面的场景,不过你还是要考虑资源的释放问题。

同步还是异步
异步加载能够获得加载过程的进度和是否加载完成,通过这种方式你可以在切换中增减进度条或者其他表现,这种方式一般通过协程完成

代码如下(示例):

//异步加载
    public void LoadSceneAsync(string sceneName,Action Func)
    {
        MonoMgr.getInstance().StartCoroutine(LoadingSceneAsync(sceneName, Func));
    }
    public IEnumerator LoadingSceneAsync(string sceneName,Action Func)
    {
        AsyncOperation AO = SceneManager.LoadSceneAsync(sceneName);
        //判定场景是否加载完成,通过协程实现加载进度的更新,可用于其他事件,外部也可以监听
        while (!AO.isDone)
        {
            EventManager.getInstance().EventTrigger("LoadSceneProgress", AO);
            yield return AO.progress;
        }
        yield return AO;
        Func();
    }

同步加载:

public void LoadScene(string sceneName,Action Func)
    {
        SceneManager.LoadScene(sceneName);
        Func();
    }

完整代码:

public class SceneLoadManager : SignleBaseManager<SceneLoadManager>
{
    //同步加载
    public void LoadScene(string sceneName,Action Func)
    {
        SceneManager.LoadScene(sceneName);
        Func();
    }

    //异步加载
    public void LoadSceneAsync(string sceneName,Action Func)
    {
        MonoMgr.getInstance().StartCoroutine(LoadingSceneAsync(sceneName, Func));
    }
    public IEnumerator LoadingSceneAsync(string sceneName,Action Func)
    {
        AsyncOperation AO = SceneManager.LoadSceneAsync(sceneName);
        //判定场景是否加载完成,通过协程实现加载进度的更新,可用于其他事件,外部也可以监听
        while (!AO.isDone)
        {
            EventManager.getInstance().EventTrigger("LoadSceneProgress", AO);
            yield return AO.progress;
        }
        yield return AO;
        Func();
    }
}

模块的使用:

public class TestSceneLoad : MonoBehaviour
{
    private bool IsLoadScene = false;
    private void Start()
    {
        EventManager.getInstance().AddEventListener("LoadSceneProgress", LoadProgress);
    }
    private void LoadProgress(object loadProgressInfo)
    {
        Debug.Log($"场景加载进度-------{(loadProgressInfo as AsyncOperation).progress}");
    }
    void Update()
    {
        if (Input.GetMouseButtonDown(0) && !IsLoadScene)
        {
            SceneLoadManager.getInstance().LoadSceneAsync("TestLoadScene", Func);
            IsLoadScene = true;
        }
    }
    private void Func()
    {
        Debug.Log("场景加载完成-------");
    }
}

相关链接
Unity程序基础框架__单例基类模块
Unity程序基础框架__缓存池模块
Unity程序基础框架__事件中心模块
Unity程序基础框架__公共Mono模块
Unity程序基础框架__场景切换模块
Unity程序基础框架__资源加载模块
Unity程序基础框架__输入控制模块
Unity程序基础框架__事件中心模块基类优化
Unity程序基础框架__音效管理模块
Unity程序基础框架__UI管理模块

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Unity程序基础框架__场景切换模块 的相关文章

  • UE4 解决景深效果闪烁问题

    原因 1 模型的垂直竖线 造成抗锯齿算法对竖线的渲染计算 处于一种不稳定的状态 因此闪烁 解决办法 使用LOD 用贴图去替代线条模型 2 材质的法线贴图 当法线贴图含有垂直竖线的纹理效果 也会造成闪烁 比如这种幕墙材质 解决办法 关闭或动态
  • Unity 粒子特效、材质发光 HDR ShaderGraph图文教程[完成lit发光设置]

    效果如图 准备工作 在hdr模式下 关闭Directional Light 相机设置 移动球挂一个点光源作为子节点 设置自行调节 0 创建移动球的材质及shader shader gt 在Project Create Shader Grap
  • FBX导入Unity中模型没有材质的处理

    一 3dMax导出FBX时的注意事项 导出时 确保maps文件存在 里面放着fbx用到的image 二 在Unity中的设置 1 文件拖入Unity的Assets文件夹中 2 查看模型的材质是否存在 如下所示 材质为None 此时拖入sce
  • Unity之获取游戏物体对象或组件的几个方法

    文章目录 前言 通过物体名称获取对象 GameObject Find Transform Find 通过物体标签获取对象 GameObject FindWithTag GameObject FindGameObjectWithTag Gam
  • Unity与Android的Back键冲突解决

    Unity与Android的Back键冲突解决 上一篇的最后留下了两个问题 Unity视图下横屏闪退 Unity视图下Android无法响应back返回上一activity 对于第一个问题 应该是Unity横屏下视图的某些设置跟Androi
  • unity后台加密时间锁

    前言 在做一些项目的时候 有些不良甲方在给完项目后会有不给尾款的情况 之前都是加一些水印啥的 感觉不是很方便 第一不美观 第二如果甲方给完尾款后还得重新打包去水印 然后又做过一个本地的时间锁 等到时间 程序直接退出 但是感觉还是不方便 有时
  • unity工程崩溃资源找回

    1 Unity死机未保存场景 当你在Unity中编辑场景 突然死机时 可以在项目文件目录中找到Temp文件夹 双击文件夹 找到 Backupscenes文件夹 把后缀为 backup的文件后缀改为 unity 然后拖进Unity的Proje
  • 【IMGUI】 各种辅助类 EditorGUIUtility、EditorUtility、GUIUtility、GUILayoutUtility

    EditorGUIUtility class in Editor 继承自 GUIUtility EditorGUI 的各种辅助程序 EditorGUIUtility currentViewWidth 我尝试打印了下这个值和position
  • VLC for unity 插件如何使用

    VLC for unity 插件如何使用 先去下载一个VLC播放器 安装完成后 然后导入插件链接https download csdn net my 这个插件我的另一个上传资源里有 或者到商店去下载 这个插件链接下载完是一个txt文档 里面
  • unity 性能查看工具Profiler

    文章目录 前言 profiler工具介绍 菜单栏 帧视图 模块视图 模块详细信息 通过profiler分析优化游戏性能 最后 前言 每次进行游戏优化的时候都用这个工具查看内存泄漏啊 代码优化啊之类的东西 真的好用 但是之前也就是自己摸索一下
  • Unity打包WebGL的优化常用操作?

    1 贴图部分优化 如果贴图格式时2048 在不影响画面效果的情况下 改成1024或者5 12 还可以缩小包体 2 压缩和解压缩问题 WebGL打包的时候分三种压缩情况 gzip 比Brotli文件打 但打包快 http和https都支持 B
  • unity3d 自定义的图片无法放入source image中

    须将图片的texture type改为 sprite
  • unity3d image组件不显示

    需要将UI组件放到画布下面
  • mixamo根动画导入UE5问题:滑铲

    最近想做一个跑酷游戏 从mixamo下载滑铲动作后 出了很多动画的问题 花了两周时间 终于是把所有的问题基本上都解决了 常见问题 1 动画序列 人物不移动 2 动画序列 人物移动朝向错误 3 蒙太奇 人物移动后会被拉回 4 蒙太奇 动画移动
  • unity小球跟随音乐节奏放大缩小和改变颜色

    放在小球身上 设置对应组件即可 using System Collections using System Collections Generic using Unity VisualScripting using UnityEngine
  • 【Unity】如何让Unity程序一打开就运行命令行命令

    背景 Unity程序有时依赖于某些服务去实现一些功能 此时可能需要类似打开程序就自动运行Windows命令行命令的功能 方法 using UnityEngine using System Diagnostics using System T
  • 【Unity】运行时创建曲线(贝塞尔的运用)

    Unity 运行时创建线 贝塞尔的运用 1 实现的目标 在运行状态下创建一条可以使用贝塞尔方法实时编辑的网格曲线 2 原理介绍 2 1 曲线的创建 unity建立网格曲线可以参考 Unity程序化网格体 的实现方法 主要分为顶点 三角面 U
  • Unity学习笔记

    一 旋转欧拉角 四元数 Vector3 rotate new Vector3 0 30 0 Quaternion quaternion Quaternion identity quaternion Quaternion Euler rota
  • U3D游戏开发中摇杆的制作(UGUI版)

    在PC端模拟摇杆 实现玩家通过控制摇杆让玩家移动 以下是完整代码 using System Collections using System Collections Generic using UnityEngine using Unity
  • 游戏开发常见操作梳理之小地图的制作

    游戏中一般存在小地图系统 实际上就是设置一个新的摄像机放置在玩家的正上方 然后在小地图上显示新摄像机看见的东西就可以了 在小地图上一般存在放大地图和缩小地图的按钮可以方便放大和缩小地图 这些操作是如何实现的呢 接下来直接上核心代码 usin

随机推荐