Unity实现场景加载功能
作者:SOLA&AIR 发布时间:2021-09-15 12:27:45
unity场景加载分为同步加载和异步加载,供大家参考,具体内容如下
同步加载 loadScene
首先将前置工作做好。
创建一个项目工程,然后创建三个场景 loading00、loading01、loading02。每个场景分别创建一个cube、Sphere、Capsule 。然后打开File -> Build Settings, 然后将创建的 loading00、loading01、loading02拖拽到Scenes In Build中。如下图:
然后再创建一个 loading.cs 脚本,然后写上这段代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
public class loading : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
// 同步加载场景
SceneManager.LoadScene(1, LoadSceneMode.Additive);
}
// Update is called once per frame
void Update()
{
}
}
SceneManager.LoadScene(1, LoadSceneMode.Additive);
第一个参数是表示加载的场景序号,第二个参数是 加载场景后,是否删除旧场景。
场景序号就是在 BuildSettings 中的序号如下图:
当然,第一个参数也可以写场景的路径:
SceneManager.LoadScene(“Scenes/loading01”, LoadSceneMode.Additive);
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
public class loading : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
// 同步加载场景
SceneManager.LoadScene("Scenes/loading01", LoadSceneMode.Additive);
}
// Update is called once per frame
void Update()
{
}
}
与上述代码想过是一致的。
异步加载
异步加载需要先介 AsyncOperation 类
SceneManager.LoadSceneAsync(1, LoadSceneMode.Additive) 这个是异步加载的函数,其参数的用法跟同步加载的用法一致,然后,返回值 是一个 As yncOperation 类。
AsyncOperation 的用处:
AsyncOperation.isDone 这个是用来判断加载是否完成。这个属性是加载完并且跳转成功后才会变成完成
AsyncOperation.allowSceneActivation 这个是加载完后,是否允许跳转,当为false时,即使场景加载完了,也不会跳转
AsyncOperation.progress 这个时表示加载场景的进度。实际上的值时 0 - 0.9, 当值为0.9的时候,场景就已经加载完成了。
我们要异步加载场景的话,一般都是需要用协程一起工作
代码如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
public class loading : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
StartCoroutine(Load());
}
IEnumerator Load()
{
AsyncOperation asyncOperation = SceneManager.LoadSceneAsync(1, LoadSceneMode.Additive);
asyncOperation.allowSceneActivation = false; // 这里限制了跳转
// 这里就是循环输入进度
while(asyncOperation.progress < 0.9f)
{
Debug.Log(" progress = " + asyncOperation.progress);
}
asyncOperation.allowSceneActivation = true; // 这里打开限制
yield return null;
if(asyncOperation.isDone)
{
Debug.Log("完成加载");
}
}
// Update is called once per frame
void Update()
{
}
}
异步和同步的区别
异步不会阻塞线程,可以在加载过程中继续去执行其他的一些代码,(比如同时加载进度)而同步会阻塞线程,只有加载完毕显示后才能继续执行之后的一些代码。
来源:https://blog.csdn.net/qq_36361527/article/details/120653979


猜你喜欢
- 本文实例讲述了Android编程使用LinearLayout和PullRefreshView实现上下翻页功能的方法。分享给大家供大家参考,具
- 1.MediaCodec 是什么MediaCodec类可以访问底层媒体编解码器框架(StageFright 或 OpenMAX),即编解码组
- 前言: 由于前段时间,项目组长分配的任务是要完成一个在线编写SQL并要实现查询功能的需求,最终需要将查询到的数据以JSON格式显示到响应数据
- CXF简介CXF是一个开源的WebService框架。Apache CXF = Celtix + XFire,开始叫 Apache Celt
- 马云说:“未来最大的资源就是数据,不参与大数据十年后一定会后悔。”毕竟出自wuli马大大之口,今年二月份我开始了学习大数据的道路,直到现在对
- 一、BufferedImage类介绍生成验证码图片主要用到了一个BufferedImage类,如下:创建一个DrawImage Servle
- 零、动态库 System.Math.dll引入动态库 using System.Math;Math 为通用数学函数、对数函数、三角函数等提供
- 前言经过一段时间的学习Oauth2,在网上也借鉴学习了一些大牛的经验,推荐在学习的过程中多看几遍阮一峰的《理解OAuth 2.0》,经过对O
- 前言本篇文章 中写到的是 flutter 调用了Android 原生的 TextView 案例添加原生组件的流程基本上可以描述为:1 and
- 创建新的项目的时候,文件名一直追加,不分层对于刚用idea的小白,这个问题困扰了我好几天了,幸好现在还不怎么敲代码,下面给一个详细的解决方案
- Spring Aop的原理Spring的AOP就是通过 * 实现的。当为某个Bean或者某些Bean配置切面时,Spring会为其创建代理
- 本文实例讲述了linux环境下java程序打包成简单的hello world输出jar包。分享给大家供大家参考,具体如下:1. linux必
- 背景近期在调研一个开源仓库,于是将 代码 从github下载后,当IDEA sync依赖时出现Cannot resolve org.four
- 在图文混排的文档中,我们可以根据需要将文档中的文字信息或者图片提取出来,通过C#代码可以提取Word和PDF文件中的文本和图片,那么同样的,
- 本文实例讲述了Java自定义标签用法。分享给大家供大家参考,具体如下:简单例子实现一个标签分为两步:(1)继承SimpleTagSuppor
- 这篇文章主要介绍了Java调用明华RF读写器DLL文件过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,
- 本文帮助大家掌握Java多线程基础知识来对应日后碰到的问题,具体内容如下一、Java多线程面试问题1. 进程和线程之间有什么不同?一个进程是
- Hi~大家好,出来创业快3个月了,一切还不错,前一段时间用了业余时间搞了个问答类网站YQMA.想做中国的stackoverflow,哈哈,只
- 前言在开发过程中需要快速新建getXXX();setXXX()方法的时候,就会想能否批量实现呢?例如实现如下代码,一次性操作,不是一个一个码
- 本文讲述了Java实现画线、矩形、椭圆、字符串功能的实例代码。分享给大家供大家参考,具体如下:import java.awt.Frame;