IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> Unity游戏开发文档(3.2.1):异步加载游戏场景 -> 正文阅读

[游戏开发]Unity游戏开发文档(3.2.1):异步加载游戏场景

前言
?
?? 该文档为《Unity游戏开发文档(3):Dancing Line》的附属文档,亦可看作是单独的技术总结文档。


?
?

综述

当游戏需要从一个 场景(Sence) 跳转到另外一个场景时,如果下一个场景需要加载的资源很多,那么游戏会便会卡在上一个场景不动,直到下一个场景完成加载后游戏才会进入。对于玩家来说,每次在加载新场景的时候都要等一大段时间有什么都做不了,是很令人不爽的,游戏体验也大打折扣了。

所以基本所有的游戏在加载大场景之前,都会先让游戏进入一个可以瞬间完成加载的小场景中,在小场景中显示加载进度条,或者播放一些小动画,更有甚者会内嵌一个小游戏,同时并行地加载大场景。当大场景完成加载后,游戏便跳出当前的小场景,进入到大场景中,继续执行正常的游戏流程。这样便可以避免等待场景切换带来的低游戏体验了。

?


?

异步加载场景

异步加载场景的逻辑如下:

  1. 假设有三个场景,A场景是游戏当前所在场景,B场景是过渡场景,C场景是最终需要进入的场景。
  2. 在A场景时,我们首先加载并进入到B场景。
  3. 随后在B场景中,我们创建一个协程,并命令协程加载C场景。在C场景加载的这段时间里,游戏会继续执行B场景的游戏逻辑。
  4. C场景完成加载后会协程返回到B场景的主线逻辑,B场景的主线逻辑得知协程退出后,会立刻进入C场景。
  5. 游戏开始执行C场景逻辑。

Dancing Line 中,我们需要做的是从 Menu 场景经过 Load 场景的过渡,进入到 Game场景。具体的代码实现如下:

  • 在A场景中,由于我们是通过点击按钮触发场景切换,所以代码还包含了按钮监听点击事件的逻辑
using UnityEngine.SceneManagement;

private Button button;

void Start() {
    button = transform.GetComponent<Button>();
    button.onClick.AddListener(LoadGameScene);
} 

public void LoadGameScene() {
    Destroy(this);
    SceneManager.LoadScene(load_scene);				// Load the "load_scene" scene
}
  • B场景加载C场景的实现代码
using UnityEngine.SceneManagement;

void Start () {
    StartCoroutine(LoadScene());                    // Begin to asynchronous load game scene
}

IEnumerator LoadScene()                             // Asynchronous load game scene
{
    async = SceneManager.LoadSceneAsync(GlobalData.game_scene);
    yield return async;
}

?


?

显示加载进度

在过渡场景中游戏应该做些什么来为玩家排闷解乏,那就需要开发者发挥各自的想象力了,萝卜青菜各有所爱。在这里我们会介绍最常见也是最基本的形式,即为玩家显示加载百分比进度以及进度条。

百分比进度可以用 Unity GUI 内置的 TextTextMeshPro 组件实现,我们在每一帧获取场景当前的加载进度,然后把数值更新到文本内容上即可。

在这里插入图片描述

红框处即是用于显示进度的组件,由于未进行游戏,所以没有对应的信息显示
?

进度条可以用 Unity GUI 内置的 Image 组件实现。我们首先需要准备长条形的图片,把它设为 Unity Image。然后在每一帧,通过我们获取得到的场景加载进度来设置图片的可显示部分,即可实现进度条功能。

在这里插入图片描述

红框处即是进度条组件
?

下方是具体的代码实现:

private int progress = 0;
private Image progress_bar;
private TextMeshProUGUI progress_text;
private AsyncOperation async = null;


void OnGUI() {
    progress_text.text = progress + "%";            // Update the text for displaying realtime progress of scene loading
    progress_bar.fillAmount = progress / 100f;      // Update the progress bar base on the loading progress
    if (progress == 100) {
        progress_text.text = "OK";                  // Display "OK" when scene loading is complete 
    }
}

void Start () {
    StartCoroutine(LoadScene());                    // Begin to asynchronous load game scene
}

void Update() {
    progress = (int)(async.progress * 100);
}

?


?

最终效果

在这里插入图片描述

额…要加载的游戏场景不是很大,一下子就完成加载了,所以最终我们只能看到过渡的场景闪了一下就跳到游戏场景了。

?


?

参考资料

异步加载游戏场景与异步加载游戏资源进度条: http://www.xuanyusong.com/archives/1427
Unity 中场景切换:https://www.cnblogs.com/zsb517/p/4113538.html
LoadSceneAsync出现的问题:https://blog.csdn.net/qq_43040880/article/details/108695349
SceneManager.LoadScene调用后新场景会变暗的问题:https://blog.csdn.net/qq_42965798/article/details/89670818

  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2021-09-09 12:07:03  更:2021-09-09 12:07:25 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/17 19:23:30-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码