unity学习24:场景scene相关生成,加载,卸载,加载进度,异步加载场景等
目录
1 场景数量 SceneManager.sceneCount
2 直接代码生成新场景 SceneManager.CreateScene
3 场景的加载
3.1 用代码加载场景,仍然build setting里先加入配置
3.2 卸载场景 SceneManager.UnloadSceneAsync();
3.3 同步加载场景 SceneManager.LoadScene
3.3.1 两种加载方式
3.4 异步加载场景
3.5 测试代码
3.5.1 有问题的测试代码
(代码创建的新Scene 需要手动去build Setting添加?)
3.6 场景的叠加效果
4 同步和异步
4.1 同步和异步
4.2 多线程 协程
4.2.1 多线程
4.2.2 协程
4.3 异步加载场景UnityEngine.SceneManagement;
4.3.1 除了默认的,还需要额外导入其他包
4.3.2 测试异步跳转场景,可成功
4.3.3 详细代码和注释
4.3.4 注释内容
5 加载进度
5.1 对应的协程的进度 operation1.progress
5.2 关于进度的数值
5.3 对应代码
5.4 如何做个显示的UI进度条
6 按条件跳转新地图
6.1 延迟跳转
6.2 测试代码
1 场景数量 SceneManager.sceneCount
- //统计已经加载的场景数量
- Debug.Log(SceneManager.sceneCount);
2 直接代码生成新场景 SceneManager.CreateScene
- // 代码里可以创建新场景:直接用代码
- Scene scene3=SceneManager.CreateScene("Scene3");
3 场景的加载
3.1 用代码加载场景,仍然build setting里先加入配置
- 也是要注意,新场景的加载模式
- 用代码创建的Scene也可以现在build setting里先加入配置
Scene 'Scene3' couldn't be loaded because it has not been added to the build settings or the AssetBundle has not been loaded.
To add a scene to the build settings use the menu File->Build Settings...
UnityEngine.SceneManagement.SceneManager:LoadScene (string)
SceneTest:Start () (at Assets/SceneTest.cs:43)
3.2 卸载场景 SceneManager.UnloadSceneAsync();
- 卸载场景
- SceneManager.UnloadSceneAsync("Scene3");
3.3 同步加载场景 SceneManager.LoadScene
- //同步加载场景,卡顿,等待
- SceneManager.LoadScene("Scene3");
- SceneManager.loadScene("scene3",LoadSceneMode.Single);
- SceneManager.loadScene("scene3",LoadSceneMode.Additive);
3.3.1 两种加载方式
只加载1个,替换之前的Scene
- SceneManager.LoadScene("Scene2")
- 默认方式是 LoadSceneMode.Single
- SceneManager.LoadScene("Scene2",LoadSceneMode.Single)
新的场景加载,老的也在,相当于同时都加载生效
- SceneManager.LoadScene("Scene2",LoadSceneMode.Additive)
3.4 异步加载场景
- //异步加载场景
- //SceneManager.loadSceneAsync("scene3");
3.5 测试代码
3.5.1 有问题的测试代码
(代码创建的新Scene 需要手动去build Setting添加?)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;public class SceneTest : MonoBehaviour
{// Start is called before the first frame updatevoid Start(){///先查看当前Scene//获取当前场景Scene scene1=SceneManager.GetActiveScene();//场景名称Debug.Log(scene1.name);//场景路径Debug.Log(scene1.path); //场景索引Debug.Log(scene1.buildIndex); GameObject[] gb1=scene1.GetRootGameObjects();Debug.Log(gb1.Length);//跳转场景//SceneManager.LoadScene(2);//SceneManager.LoadScene("Scene2");//调用异步的Start1Start1();//统计已经加载的场景数量Debug.Log(SceneManager.sceneCount);//创建新场景:直接用代码Scene scene3=SceneManager.CreateScene("Scene3");//卸载场景//SceneManager.UnloadSceneAsync("Scene3");//同步加载场景,卡顿,等待SceneManager.LoadScene("Scene3");//SceneManager.loadScene("scene3",LoadSceneMode.Single);//SceneManager.loadScene("scene3",LoadSceneMode.Additive);//异步加载场景//SceneManager.loadSceneAsync("scene3");}async void Start1(){AsyncOperation asyncLoad = SceneManager.LoadSceneAsync(2);// 等待场景加载完成while (!asyncLoad.isDone){await System.Threading.Tasks.Task.Yield();}// 场景加载完成后获取信息Debug.Log(SceneManager.GetActiveScene().name);//获取当前场景//新定义1个scene2 Scene scene2=Scene scene2=SceneManager.GetActiveScene();//场景是否已经加载, 但是可能还没有激活新的SceneDebug.Log(scene2.isLoaded); ///再次查看当前Scene//场景名称Debug.Log(scene2.name);//场景路径Debug.Log(scene2.path); //场景索引Debug.Log(scene2.buildIndex); GameObject[] gb2=scene2.GetRootGameObjects();Debug.Log(gb2.Length);}// Update is called once per framevoid Update(){}
}

3.6 场景的叠加效果
- 多个场景一起生效,叠加,效果
- 从 Hierarchy 窗口里可以看到
- 现在有3个场景,同时生效了,场景内的gb也都显示出来了

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;public class SceneTest : MonoBehaviour
{// Start is called before the first frame updatevoid Start(){///先查看当前Scene//获取当前场景Scene scene1=SceneManager.GetActiveScene();//场景名称Debug.Log(scene1.name);//场景路径Debug.Log(scene1.path); //场景索引Debug.Log(scene1.buildIndex); GameObject[] gb1=scene1.GetRootGameObjects();Debug.Log(gb1.Length);//跳转场景//SceneManager.LoadScene(2);//SceneManager.LoadScene("Scene2");//调用异步的Start1Start1();//统计已经加载的场景数量Debug.Log(SceneManager.sceneCount);//创建新场景:直接用代码Scene scene3=SceneManager.CreateScene("Scene3");//卸载场景//SceneManager.UnloadSceneAsync("Scene3");//同步加载场景,卡顿,等待SceneManager.LoadScene("Scene3");//SceneManager.loadScene("scene3",LoadSceneMode.Single);//SceneManager.loadScene("scene3",LoadSceneMode.Additive);//异步加载场景//SceneManager.loadSceneAsync("scene3");}async void Start1(){AsyncOperation asyncLoad = SceneManager.LoadSceneAsync(2,LoadSceneMode.Additive);// 等待场景加载完成while (!asyncLoad.isDone){await System.Threading.Tasks.Task.Yield();}// 场景加载完成后获取信息Debug.Log(SceneManager.GetActiveScene().name);//获取当前场景//新定义1个scene2 Scene scene2=Scene scene2=SceneManager.GetActiveScene();//场景是否已经加载, 但是可能还没有激活新的SceneDebug.Log(scene2.isLoaded); ///再次查看当前Scene//场景名称Debug.Log(scene2.name);//场景路径Debug.Log(scene2.path); //场景索引Debug.Log(scene2.buildIndex); GameObject[] gb2=scene2.GetRootGameObjects();Debug.Log(gb2.Length);}// Update is called once per framevoid Update(){}
}
4 同步和异步
4.1 同步和异步
- 同步: 纯线性
- 异步: 也是线性,但是只是逻辑上还是线性。但是有了分支,把消耗时间的操作,放到其他线程里去执行
下面几个图都是网上找的参考的



4.2 多线程 协程
- 多线程
- 协程
4.2.1 多线程
多线程是一种同时运行多个执行路径的技术,每个执行路径称为一个线程。
多个线程可以在多核CPU上真正并行运行,或者在单核CPU上通过时间片轮转模拟并发。多线程通过操作系统调度,能够充分利用计算资源,在处理I/O密集型和CPU密集型任务时具有优势。
特点:
每个线程都有独立的栈空间和执行路径。
线程之间可以共享内存数据,因此需要进行同步控制,以避免数据竞争和死锁问题。
线程调度由操作系统控制,可能涉及上下文切换,带来一定的开销。4.2.2 协程
协程是一种比线程更轻量级的并发实现方式。
与多线程不同,协程不是由操作系统调度,而是由编程语言或运行时环境来管理。
协程可以在需要时暂停自身,并将控制权交还给调用方,稍后再恢复执行。
它们适用于处理需要频繁暂停和恢复的任务,如异步I/O操作。
特点:
协程不会并行运行,单个线程中可以运行多个协程。
协程之间共享执行线程,但不需要上下文切换,切换开销非常小。
协程适用于I/O密集型任务,如网络请求、文件读写等,能够实现高效的异步操作。
4.3 异步加载场景UnityEngine.SceneManagement;
4.3.1 除了默认的,还需要额外导入其他包
using UnityEngine;
using UnityEngine.SceneManagement;
4.3.2 测试异步跳转场景,可成功

去掉各种注释的代码如下
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//导入场景管理类
using UnityEngine.SceneManagement;public class AsyncTest : MonoBehaviour
{void Start(){StartCoroutine(loadScene());}IEnumerator loadScene(){// 异步的协程AsyncOperation operation1=SceneManager.LoadSceneAsync(2);yield return operation1;}// Update is called once per framevoid Update(){}
}
4.3.3 详细代码和注释
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//导入场景管理类
using UnityEngine.SceneManagement;public class AsyncTest : MonoBehaviour
{//异步,需要先声明SceneManager.LoadSceneAsync(2)的返回值//AsyncOperation operation1;// Start is called before the first frame updatevoid Start(){//协程不能直接LoadScene(),必须新建一个协程方法StartCoroutineStartCoroutine(loadScene());}//以协程的方法来异步加载场景//必须单独写一个 loadScene()方法,而不能用Application.LoadScene()方法//这个异步的方法,有返回值,返回值是固定的IEnumeratorIEnumerator loadScene(){// 异步的协程// SceneManager.LoadSceneAsync()有返回值,返回值类型AsyncOperationAsyncOperation operation1=SceneManager.LoadSceneAsync(2);yield return operation1;}// Update is called once per framevoid Update(){}
}
4.3.4 注释内容
//异步,需要先声明SceneManager.LoadSceneAsync(2)的返回值
// 也是可以在函数内,使用 operation1 时当时声明, 但是函数内声明的,函数外就无法条用operation1,所以为了外面可以调用,还是在外面声明
//AsyncOperation operation1;
// Start is called before the first frame update
void Start()
{
//协程不能直接LoadScene(),必须新建一个协程方法StartCoroutine
StartCoroutine(loadScene());
}
//以协程的方法来异步加载场景
//必须单独写一个 loadScene()方法,而不能用Application.LoadScene()方法
//这个异步的方法,有返回值,返回值是固定的IEnumerator
IEnumerator loadScene()
{
// 异步的协程
// SceneManager.LoadSceneAsync()有返回值,返回值类型AsyncOperation
// 也可以在函数外,最开始声明
AsyncOperation operation1=SceneManager.LoadSceneAsync(2);
yield return operation1;
}
5 加载进度
5.1 对应的协程的进度 operation1.progress
- operation1.progress
- 适合放在 void Update() 方法里去实现,因为逐帧加载。
5.2 关于进度的数值
- unity里,输出进度 0-0.9,其中0.9 在unity里就是100%
- 实际游戏里
- 有的0.9-100%飞速,有的是按比例0.9折算到100%
- 场景小异步加载也就很快

5.3 对应代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//导入场景管理类
using UnityEngine.SceneManagement;public class AsyncTest : MonoBehaviour
{//异步,需要先声明SceneManager.LoadSceneAsync(2)的返回值AsyncOperation operation1;// Start is called before the first frame updatevoid Start(){//协程不能直接LoadScene(),必须新建一个协程方法StartCoroutineStartCoroutine(loadScene());}//以协程的方法来异步加载场景//必须单独写一个 loadScene()方法,而不能用Application.LoadScene()方法//这个异步的方法,有返回值,返回值是固定的IEnumeratorIEnumerator loadScene(){// 异步的协程// SceneManager.LoadSceneAsync()有返回值,返回值类型AsyncOperationoperation1=SceneManager.LoadSceneAsync(2);yield return operation1;}// Update is called once per framevoid Update(){Debug.Log(operation1.progress);}
}
5.4 如何做个显示的UI进度条
。。。。是个问题,学到了再说
6 按条件跳转新地图
6.1 延迟跳转
- 跳转地图也可以不是即可生效的
- 可以加定时器, 按任意键跳转,下面的例子可以实现10秒后跳转
- 除了延迟跳转新地图,也可以设置其他条件:比如 响应键盘,UI等等
6.2 测试代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//导入场景管理类
using UnityEngine.SceneManagement;public class AsyncTest : MonoBehaviour
{//异步,需要先声明SceneManager.LoadSceneAsync(2)的返回值AsyncOperation operation1;float timer1=0;// Start is called before the first frame updatevoid Start(){//协程不能直接LoadScene(),必须新建一个协程方法StartCoroutineStartCoroutine(loadScene());}//以协程的方法来异步加载场景//必须单独写一个 loadScene()方法,而不能用Application.LoadScene()方法//这个异步的方法,有返回值,返回值是固定的IEnumeratorIEnumerator loadScene(){// 异步的协程// SceneManager.LoadSceneAsync()有返回值,返回值类型AsyncOperationoperation1=SceneManager.LoadSceneAsync(2);operation1.allowSceneActivation=false;yield return operation1;}// Update is called once per framevoid Update(){Debug.Log(operation1.progress);timer1=timer1+Time.deltaTime;if (timer1>10){operation1.allowSceneActivation=true;}}
}
相关文章:
unity学习24:场景scene相关生成,加载,卸载,加载进度,异步加载场景等
目录 1 场景数量 SceneManager.sceneCount 2 直接代码生成新场景 SceneManager.CreateScene 3 场景的加载 3.1 用代码加载场景,仍然build setting里先加入配置 3.2 卸载场景 SceneManager.UnloadSceneAsync(); 3.3 同步加载场景 SceneManager.LoadScene 3.3.…...
四.4 Redis 五大数据类型/结构的详细说明/详细使用( zset 有序集合数据类型详解和使用)
四.4 Redis 五大数据类型/结构的详细说明/详细使用( zset 有序集合数据类型详解和使用) 文章目录 四.4 Redis 五大数据类型/结构的详细说明/详细使用( zset 有序集合数据类型详解和使用)1. 有序集合 Zset(sorted set)2. zset 有序…...
S4 HANA税码科目确定(OB40)
本文主要介绍在S4 HANA OP中税码科目确定(OB40)相关设置。具体请参照如下内容: 税码科目确定(OB40) 在以上界面维护“Transaction Key”的记账码。 在以上界面进一步维护“Transaction Key”确定科目的规则。 Chart of Account:用于明确该规则适用于什么科目表。 …...
DeepSeek的崛起与OpenAI的守擂:AI大模型时代的竞争新格局
DeepSeek的崛起与OpenAI的守擂:AI大模型时代的竞争新格局 近年来,全球生成式AI领域风起云涌,中国初创公司DeepSeek(深度求索)凭借一系列创新动作异军突起,引发行业热议。从发布对标GPT-4的MoE模型到开源轻量…...
CSDN的历史
CSDN(中国开发者网络,China Software Developer Network)是中国最具影响力的IT技术社区之一,其历史可追溯至1999年。以下是其发展历程和关键节点: --- **一、创立背景(1999年)** - **创始人**:蒋涛(国内知名技术人,曾参与金山软件早期开发)。 - **初衷**:为国内程…...
vim的特殊模式-可视化模式
可视化模式:按 v进入可视化模式 选中 y复制 d剪切/删除 可视化块模式: ctrlv 选中 y复制 d剪切/删除 示例: (vim可视化模式的进阶使用:vim可视化模式的进阶操作-CSDN博客)...
鸿蒙HarmonyOS实战-ArkUI动画(页面转场动画)_鸿蒙arkui tab 切换动画
PageTransitionExit({type?: RouteType,duration?: number,curve?: Curve | string,delay?: number}) 在HarmonyOS中,PageTransitionEnter和PageTransitionExit是用于控制页面切换动画的参数。它们分别表示页面进入和退出时的动画。1. type(动画类型…...
UE5制作视差图
双目深度估计开源数据集很多都是用UE制作的,那么我们自己能否通过UE制作自己想要的场景的数据集呢。最近花了点时间研究了一下,分享给需要的小伙伴。 主要使用的是UnrealCV插件,UnrealCV是一个开源项目,旨在帮助计算机视觉研究人…...
根据每月流量和市场份额排名前20 的AI工具列表
ChatGPT:由Open AI研发,是一款对话式大型语言模型。它能够理解自然语言输入,生成连贯且符合逻辑的回复。可用于文本创作,如撰写文章、故事、诗歌;还能解答各种领域的知识问题,提供翻译、代码解释等服务&…...
前端学习-事件委托(三十)
目录 前言 课前思考 for循环注册事件 语法 事件委托 1.事件委托的好处是什么? 2.事件委托是委托给了谁,父元素还是子元素 3.如何找到真正触发的元素 示例代码 总结 前言 才子佳人,自是白衣卿相 课前思考 1.如果同时给多个元素注册事件&…...
记忆化搜索(5题)
是什么? 是一个带备忘录的递归 如何实现记忆化搜索 1.添加一个备忘录(建立一个可变参数和返回值的映射关系) 2.递归每次返回的时候把结果放到备忘录里 3.在每次进入递归的时候往备忘录里面看看。 目录 1.斐波那契数列 2.不同路径 3.最…...
【游戏设计原理】96 - 成就感
成就感是玩家体验的核心,它来自完成一件让自己满意的任务,而这种任务通常需要一定的努力和挑战。游戏设计师的目标是通过合理设计任务,不断为玩家提供成就感,保持他们的参与热情。 ARCS行为模式(注意力、关联性、自信…...
Java小白入门教程:内置数据类型(四类八种)和引用数据类型
目录 一、内置数据类型(四类八种) 1. 整数类型(四种子类型) 2. 浮点类型(两种子类型) 3. 字符类型(一种子类型) 4. 布尔类型(一种子类型) 二、引用数据类…...
【设计测试用例自动化测试性能测试 实战篇】
🌈个人主页:努力学编程’ ⛅个人推荐: c语言从初阶到进阶 JavaEE详解 数据结构 ⚡学好数据结构,刷题刻不容缓:点击一起刷题 🌙心灵鸡汤:总有人要赢,为什么不能是我呢 设计测试用例…...
20-30 五子棋游戏
20-分析五子棋的实现思路_哔哩哔哩_bilibili20-分析五子棋的实现思路是一次性学会 Canvas 动画绘图(核心精讲50个案例)2023最新教程的第21集视频,该合集共计53集,视频收藏或关注UP主,及时了解更多相关视频内容。https:…...
抽象类与抽象方法详解
目录 一、 基本概念 1.抽象类(Abstract Class): 2.抽象方法(Abstract Method): 二、示例代码 抽象类 抽象方法 三、抽象类的使用场景 四、 抽象类与接口的对比 五、注意事项 六、总结 一、 基本概…...
受击反馈HitReact、死亡效果Death Dissolve、Floating伤害值Text(末尾附 客户端RPC )
受击反馈HitReact 设置角色受击标签 (GameplayTag基本了解待补充) 角色监听标签并设置移动速度 创建一个受击技能,并应用GE 实现设置角色的受击蒙太奇动画 实现角色受击时播放蒙太奇动画,为了保证通用性,将其设置为一个函数,并…...
应用程序中处理文件上传的方法
在应用程序中处理文件上传通常涉及以下几个步骤: 一、前端准备 前端负责收集文件,并通过 HTTP 请求将其发送到服务器。常见的方法包括: ①HTML <form>; 表单:使用 enctype="multipart/form-data" 属性指定表单支持文件上传。 ②JavaScript (AJAX):可以使…...
Java进阶six junit单元测试,反射,注解,动态代理
前言 Java进阶课程的第六篇,也是最后一篇,junit单元测试,反射,注解,动态代理相关内容 包含知识点 junit单元测试 反射 1.内部类Student: 包含私有/公共字段和方法 包含默认构造器和私有构造器 2.获取Class对象的三种方式: .…...
STM32 LED呼吸灯
接线图: 这里将正极接到PA0引脚上,负极接到GND,这样就高电平点亮LED,低电平熄灭。 占空比越大,LED越亮,占空比越小,LED越暗 PWM初始化配置 输出比较函数介绍: 用这四个函数配置输…...
栈和队列特别篇:栈和队列的经典算法问题
图均为手绘,代码基于vs2022实现 系列文章目录 数据结构初探: 顺序表 数据结构初探:链表之单链表篇 数据结构初探:链表之双向链表篇 链表特别篇:链表经典算法问题 数据结构:栈篇 数据结构:队列篇 文章目录 系列文章目录前言一.有效的括号(leetcode 20)二.用队列实现栈(leetcode…...
用一个例子详细说明python单例模式
单例模式是一种设计模式,它确保一个类只有一个实例,并提供一个全局访问点来访问该实例。这在需要控制资源(如数据库连接、文件系统等)的访问时非常有用。 下面是一个使用Python实现单例模式的例子: class Singleton:…...
Kotlin 委托详解
Kotlin 委托详解 引言 Kotlin 作为一种现代化的编程语言,在 Android 开发等领域得到了广泛的应用。在 Kotlin 中,委托(Delegation)是一种强大的特性,它可以让我们以更简洁的方式实现代码的复用和扩展。本文将详细解析…...
什么是词嵌入?Word2Vec、GloVe 与 FastText 的区别
自然语言处理(NLP)领域的核心问题之一,是如何将人类的语言转换成计算机可以理解的数值形式,而词嵌入(Word Embedding)正是为了解决这个问题的重要技术。本文将详细讲解词嵌入的概念及其经典模型(Word2Vec、GloVe 和 FastText)的原理与区别。 1. 什么是词嵌入(Word Em…...
2024年数据记录
笔者注册时间超过98.06%的用户 CSDN 原力是衡量一个用户在 CSDN 的贡献和影响力的系统,笔者原力值超过99.99%的用户 其他年度数据...
DBO优化最近邻分类预测matlab
蜣螂优化算法(Dung Beetle Optimizer,简称 DBO)作为一种新兴的群智能优化算法,于 2022 年末被提出,其灵感主要来源于蜣螂的滚球、跳舞、觅食、偷窃以及繁殖等行为。 本次使用的数据为 Excel 格式的分类数据集。该数据…...
Harbor 部署
harbor镜像仓库搭建 版本v2.10.3 文章目录 一. docker 安装 harbor1. harbor 配置http访问1.1 下载harbor二进制包1.2 修改配置文件1.3 运行1.4 访问 2.【可选】harbor 配置https访问2.1 自签证书2.1 修改配置文件2.3 修改hosts文件2.4 运行2.5 访问 二. k8s 安装harbor1 .安装…...
PSpice for TI体验
前言 基于 从零开始学 PSpice for TI 仿真工具 - 手把手操作实训课程_哔哩哔哩_bilibili 体验PSpice for TI的功能,并记录下来。文章内容大部分都参考自视频,可以理解成图文版。目前发现是没有支持中文语言,而且部分仿真,时间消耗…...
数据结构与算法 —— 常用算法模版
数据结构与算法 —— 常用算法模版 二分查找素数筛最大公约数与最小公倍数 二分查找 人间若有天堂,大马士革必在其中;天堂若在天空,大马士革必与之齐名。 —— 阿拉伯谚语 算法若有排序,二分查找必在其中;排序若要使用…...
苯乙醇苷类化合物的从头生物合成-文献精读108
Complete pathway elucidation of echinacoside in Cistanche tubulosa and de novo biosynthesis of phenylethanoid glycosides 管花肉苁蓉中松果菊苷全生物合成途径解析及苯乙醇苷类化合物的从头生物合成 摘要 松果菊苷(ECH)是最具代表性的苯乙醇苷…...
