Unity 中场景切换

2023-11-06

Unity游戏开发中,单个Scene解决所有问题似乎不可能,那么多个Scene之间的切换是必然存在。如果仅仅是切换,似乎什么都好说,但是在场景比较大的时候不想让玩家等待加载或者说场景与场景之间想通过一些画面、动画表现出一些让玩家期待的东西,大家就要去认真考虑。这篇文章主要介绍两种增加切换中如何播放画面或者动画等等,提高玩家的浸入感,当然你也可以做成无缝的场景

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给出当前的播放进度。注意的是在编辑器中后台线程的性能要低于游戏中。
 
是否销毁

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

同步还是异步
     异步加载能够获得加载过程的进度和是否加载完成,通过这种方式你可以在切换中增减进度条或者其他表现,这种方式一般通过协程完成:
public class ExampleClass : MonoBehaviour 
{
    IEnumerator Start() 
    {
        AsyncOperation async = Application.LoadLevelAsync("MyBigLevel");
        yield return async;
        Debug.Log("Loading complete");
    }
}
 
需要注意的是:在使用之前需要在Build Settings 添加Scene。
 

2 切换画面实现方法

场景切换中实现画面或者动画的方式有很多种,我现在看到的主要有两种,这里大致做下两种方式:

第一种方式:增加新场景

增加新场景的方式可以参考雨松的博客:Unity3D研究院之异步加载游戏场景与异步加载游戏资源进度条(三十一),增加新场景的优点是增加了很多的灵活性,你在中间过渡场景中增加视频播放、图片或者是GUI,缺点就是如果你想在实现通用性,就需要顶层做一些数据辅助,比如加载前的场景中设置好切换时播放的图片到顶层数据管理模块中,在浸入切换场景后在获取这些数据,根据这些数据来切换播放的动画等等。

左图为测试工程中三个场景,Pre为当前场景,Middle为切换场景,Next是需要加载的场景。右图为middle场景中的存在的物体,挂有实现脚本。案例逻辑:Pre场景中直接进入middle场景,在middle场景中预先加载Next场景,确保新场景加载完之后不会立刻显示Next的场景,而是等待用户的触摸或者点击操作

                    3             4

具体的操作过程:

(1)在Pre场景中使用同步加载方法直接进入middle场景,因为Middle场景非常小,所以这个过程会非常快

Application.LoadLevel("Middle");

(2)Middle场景的逻辑

public class NewBehaviourScript2 : MonoBehaviour 
{
    public     Texture BackImage = null;
    private AsyncOperation async = null;
    void Start () 
    {
        //此物体在下一个场景中不会被销毁
        DontDestroyOnLoad(this);

        //开始加载场景
        StartCoroutine("LoadScene");
    }
    
    //异步加载
    IEnumerator LoadScene()
    {
        async = Application.LoadLevelAsync("Next");
        yield return async;
        Debug.Log("Complete!");
    }

    void OnGUI()
    {
        //切换场景中的背景,可以是图片或者动画,或者~~
        GUI.DrawTexture(new Rect(0, 0, Screen.width, Screen.height), BackImage);

        //加载过程中显示进度,也可以是进度条
        if (async != null && async.isDone == false)
        {
            GUIStyle style = new GUIStyle();
            style.fontSize = 48;
            GUI.Label(new Rect(0, 200, Screen.width, 20), async.progress.ToString("F2"), style);
        }

        //在加载结束后,弹出是否下个场景,模拟手游中"触摸任意位置进入游戏"
        if (async != null && async.isDone == true)
        {
            if (GUI.Button(new Rect(100, 100, 100, 100), new GUIContent("跳起进入下一个场景")))
            {
                Destroy(this);
            }
        }


    }
}

A 场景中添加一个占满全屏的背景图,当然也可以使用动画、视频等,场景加载后马上开始加载下一个场景(异步),根据异步加载进度进行进度条、动画等等进度控制

B 注意:MiddleObj物体被设置为DontDestroyOnLoad(this),也就是在新的场景中不销毁,即使在新场景加载后也会占满全屏的背景仍然存在,直到物体被销毁

C MiddleObj物体销毁的方式有两种,一种是手动方式,就像下面代码中使用的,点击Middle场景中的按钮销毁自己 ,另外一种自动方式是在新场景(Next场景)中的MonoBehavior:OnLevelWasLoaded()函数中销毁该物体。

void OnLevelWasLoaded(int level)
   {
       GameObject obj = GameObject.Find("MiddleObj");
       if (obj != null)
       {
           GameObject.Destroy(obj);
       }
   }

 

雨松在实现新加载场景中先将场景中的所有物体隐藏,场景切换之后再慢慢的显示出来,而不是通过DontDestroyOnLoad的方式,也是一种办法哈。如果想要把这种方式设计为通用模式,可以增加一个数据管理器,在加载前提前设置好需要的图片、动画资源等内容,OK ,就可以在多个场合使用啦。

2

第二种方式使用prefab

这种方式和第一种方式原理上其实类似,只不过不使用新的场景,而是在Pre场景中增加类似于上面Middle场景中的MiddleObj物体中的逻辑,并且设置为DontDestroyOnLoad。这种方式中可以参考的就是SceneManager场景管理插件,SceneManager的使用可以参考:


     http://blog.csdn.net/onerain88/article/details/12303511

http://www.haogongju.net/art/2499058

5           6

具体使用我就不多说了哈,咱先看看其实现的关键原理:SceneManger使用异步加载新场景,进入加载之后,就会根据选择使用不同的屏幕效果,并且这个效果是不会在新场景中消失的,直到需要的效果目标达到,就会显出出先场景。SceneManger提供了一些列的屏幕效果Prefab以及场景管理方式,很不错的插件哈。      

 

测试代码下载:http://pan.baidu.com/s/1o67dAiA 密码:l976 ,内带有SceneManager 插件(花15大洋买的)

细雨标记: unity
 
 
作者:细雨
 
转载请注明原文地址: http://www.cnblogs.com/zsb517/p/4113538.html
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Unity 中场景切换 的相关文章

  • python编程实验,模拟聪明版的尼姆游戏设计原理

    实验原理与内容 本实验完成一个模拟聪明版的尼姆游戏功能 尼姆游戏是个著名的游戏 有很多变种玩法 两个玩家轮流从一堆物品中拿走一部分 在每一步中 玩家可以自由选择拿走多少物品 但是必须至少拿走一个并且最多只能拿走一半物品 然后轮到下一个玩家
  • 【unity3D】创建TextMeshPro(TMP)中文字体(解决输入中文乱码问题)

    未来的游戏开发程序媛 现在的努力学习菜鸡 本专栏是我关于游戏开发的学习笔记 本篇是unity的TMP中文输入显示乱码的解决方式 创建 TextMeshPro 中文字体 遇到的问题描述 解决方式 Font Asset Creator 面板扩展
  • C语言写游戏——扫雷

    实现效果比较简陋 如图 写游戏需要不同的文件构成 首先看一下资源管理器清楚框架结构 在test c文件里编写整个游戏的运行逻辑 具体代码 define CRT SECURE NO WARNINGS 1 include game h 测试游戏
  • unity期末作业-插针游戏

    unity期末作业 插针游戏 附下载链接 鼠标控制针的发射 圆盘可以显示接住的针数目 若两根针碰到则界面变红 游戏结束 详细情况如下动态图 点我下载 https download csdn net download weixin 43474
  • RAIN{INDIE} 自动寻路

    Unity游戏中有较多的自动寻路插件 看过几个 大同小异 而RAIN中的Behavior Tree感觉很好 听名字就知道很条理 下面 就用它做个简单的寻路小例子 首先 导入RAIN的包 结构如下 在使用的过程当中还会产生几个文件夹用来存放E
  • 二进制在数学中的妙用

    二进制在数学中的妙用 goal00001111搜集整理 十 八世纪初 莱布尼茨发明了二进制数 当时的他肯定没有预料到二进制在信息时代会有着如此广泛的应用 二进制数以其工作可靠 运算简单 逻辑严密 容易实现 等特点 成为了计算机的专用语言 在
  • HTML5游戏实战(2):90行代码实现捕鱼达人

    捕鱼达人是一款非常流行的游戏 几年里赚取了数以千万的收入 这里借用它来介绍一下用Gamebuilder CanTK开发游戏的方法 其实赚钱的游戏未必技术就很难 今天我们就仅用90来行代码来实现这个游戏 CanTK Canvas ToolKi
  • leetcode-跳跃游戏系列

    1 跳跃游戏 leetcode 55 跳跃游戏 1 问题描述 给定一个非负整数数组 n u m s nums nums 你最初位于数组的 第一个下标 数组中的每个元素代表你在该位置可以跳跃的最大长度 判断你是否能够到达最后一个下标 示例 1
  • ios -Unity3D的EasyAR集成到已经有项目中。

    近期 在做AR这一块 用EasyAR集成到iOS端 由于现在到项目已经上线 下一版本要做一个AR功能 于是迫于需求需要 自己研究和翻阅读好多集成到资料 通过整理分出几个重要到模块 其中在这里指出Xcode9版本确实好坑 建议弃坑 该用稍微好
  • 基于java的飞机大战游戏系统设计与实现

    基于java的飞机大战游戏系统设计与实现 I 引言 A 研究背景和动机 背景 随着现代游戏产业的不断发展 传统的飞行射击游戏已经无法满足玩家对新颖 刺激的需求 因此 设计一个基于Java的飞机大战游戏系统成为了游戏开发人员们的共同目标 动机
  • 打开游戏提示缺少(或找不到)XINPUT1_3.DLL怎么解决

    在电脑使用过程中 我们可能会遇到一些错误提示 其中之一就是xinput1 3 dll丢失 那么 xinput1 3 dll是什么文件 它对电脑有什么影响 本文将详细介绍xinput1 3 dll丢失的原因以及五个详细的解决方法 帮助大家解决
  • 游戏弹窗找不到emp.dll怎么办?分享5个靠谱的解决方法

    在现代的游戏世界中 我们经常会遇到各种各样的问题 其中 最常见的问题之一就是 无法找到emp dll 或 emp dll丢失 那么 emp dll到底是什么 它有什么作用 为什么会出现丢失的情况呢 不用担心 本文将从这几个方面进行详细解析
  • 收单外包服务机构的评级工作已经开始了!

    评级收单外包服务机构的工作不仅是金融监管部门规范和引导收单外包服务市场的重要举措 也影响着外包机构的业务发展 并且是每年最重要的合规工作之一 中国支付清算协会于2023年12月18日发布了一份关于进行2023年度收单外包服务机构评级工作的通
  • 揭开神秘面纱,探索犹格索托斯的庭院:一款令人陶醉的模拟经营+AVG游戏

    你是否曾梦想过踏入一个充满神秘与奇幻的世界 体验一番独特的冒险 现在 这个梦想将成为现实 我们荣幸地向你介绍一款全新的模拟经营 AVG游戏 犹格索托斯的庭院 犹格索托斯的庭院是一款极具创意的游戏 它将带你进入一个神秘而充满魅力的世界 在这里
  • 基于java的扫雷游戏系统设计与实现

    基于java的扫雷游戏系统设计与实现 I 引言 A 研究背景和动机 扫雷游戏是一种经典的益智游戏 由于其简单易学 规则简单 玩法多样等特点 深受广大游戏爱好者的喜爱 但是 现有的扫雷游戏系统往往存在着游戏难度不均衡 游戏时间过长 游戏规则不
  • 游戏开发常见操作梳理之NPC任务系统

    多数游戏存在任务系统 接下来介绍通过NPC触发任务的游戏制作代码 using System Collections using System Collections Generic using UnityEngine
  • 游戏开发常见操作梳理系列之——玩家信息的显示系统

    在游戏中 有不少游戏在左上角会出现玩家的头像和等级以及血量 这就是玩家的信息显示系统 那么这些是如何制作的呢 接下来我将讲讲代码的操作 其它操作我会在其它笔记中一一说明 敬请期待 信息的显示相当简单就是控制一些UI 然后在其它系统里面填写相
  • 游戏开发中常见系统梳理之背包系统的实现一

    游戏中几乎都存在大大小小的背包系统 接下来我将讲述背包系统具体是如何实现的 完整源码 以下是使用unity NGUI实现 使用txt配置的方法 后续更新UGUI Json实现的背包系统敬请期待 背包中的物品我们常常将其制作成预设体 通过改变
  • 申泰勇教练的独家人物化身系列即将登陆 The Sandbox

    申泰勇 Shin Tae yong 教练是足球界的传奇人物 他来到 The Sandbox 推出了自己的专属人物化身系列 作为前 K 联赛中场球员和印尼队取得历史性成就的幕后教练 他的传奇经历现在已经影响到了虚拟世界 向过去 现在和未来致敬
  • 计算机Java项目|java游戏账号交易系统

    作者简介 Java领域优质创作者 CSDN博客专家 CSDN内容合伙人 掘金特邀作者 阿里云博客专家 51CTO特邀作者 多年架构师设计经验 腾讯课堂常驻讲师 主要内容 Java项目 Python项目 前端项目 人工智能与大数据 简历模板

随机推荐

  • vba中find方法查找1

  • QML ListView实现树形效果

    转自 http blog huati365 com 5jELjzLwnx3YGw import QtQuick 2 11 import QtQuick Controls 2 2 import QtQuick Controls Materia
  • Android抓包工具——Fiddler

    前言 在平时和其他大佬交流时 总会出现这么些话 抓个包看看就知道哪出问题了 抓流量啊 payload都在里面 这数据流怎么这么奇怪 这里出现的名词 其实都是差不多的意思啊 这都跟抓包这个词有关 说到抓包呢我们今天就先来了解一下抓包的一些基础
  • MySQL组成

    MySQL 的组成分为两部分 服务器端 服务的提供 相当于卖家 客户端 服务的使 相当于买家 消费者 服务器端只能有一个 而客户端可以有多个 安装了 MySQL 说明我们既是服务器端又是客户端 服务器端的服务体现就是 客户端是使 MySQL
  • 微软亚洲研究院实习生面试

    上周说到微软亚洲研究院 MSRA 一下就简称MSRA吧 网络面试我这边因为连不上而要重新安排面试 周五HR就给我电话约好今天中午1 00 3 00重新面试 于是提前做好各种准备 找了个拉ADSL的宿舍来上网 然后用了人家带摄像头的笔记本 还
  • B站创建视频分集播放列表

    上传视频在B站上创建视频分集列表方法 上传时创建分集列表 1 打开B站 2 登录B站后 点击投稿上传视频 3 上传视频或把视频直接拖拽到页面里 4 点击上传第一个视频后页面下会出现一个 号的按钮 点击 继续上传 上传视频就会出现两个正在上传
  • 浅谈 Node.js 热更新

    大厂技术 高级前端 Node进阶 点击上方 程序员成长指北 关注公众号 回复1 加入高级Node交流群 记得在 15 16 年那会 Node js 刚起步的时候 我在去前东家的入职面试也被问到了要如何实现 Node js 服务的热更新 其实
  • Tuple VS ValueTuple(元组类 VS 值元组)

    Tuple VS ValueTuple 元组类 VS 值元组 文章目录 Tuple VS ValueTuple 元组类 VS 值元组 Tuple 1 创建元组 2 表示一组数据 3 从方法返回多个值 4 用于单参数方法的多值传递 缺点 Va
  • 基于php的课程网站络管理系统的设计与实现

    摘 要 管理系统是根据课程网站的需求而设计和实现的 主要 用于实现课程系统办公人员对其办公系统内所有公务员进行管理 实现对员工信息的查询 录入 修改和删除 以及发布重要通知 最新信息和规章制度 通过 网上办公 无纸办公 大大提高办公效率 体
  • 电脑关机了,内存就没数据了吗?

    前言 大家好 我是周杰伦 提到网络攻击技术 你脑子里首先想到的是什么 是DDoS 是SQL注入 XSS 还是栈溢出 RCE 远程代码执行 这些最常见的网络攻击技术 基本上都是与网络 软件 代码 程序这些东西相关 这也好理解 计算机网络安全
  • Qt项目实战 杂谈一二:中文乱码事情小,处理不好头发少

    Qt开发者来说 特别是初学者 往往最头疼的是编码的问题 举个例子 1 控件上设置中文标签 发现显示出来是乱码 怎么解决 如果标签是常量字符串 含中文 怎么处理 如果标签是变量 且可能包含字符串 又咋处理 2 Qt应用与其他应用存在进程间交互
  • 浏览器无法打开网页,报错:DNS_PROBE_FINISHED_BAD_CONFIG

    症状 手机的正常上网 电脑连不上网 浏览器打不开网页 电脑 用ping命令不能发现主机 这时判断DNS解析有问题 用ping命令能发现主机 这时判断DNS解析没有问题 解决办法 方案1 ipconfig flushdns 方案2 ping
  • openwrt 软件安装依赖冲突

    今天在安装一个插件curl 安装失败了 报错内容如下 root R619AC co router tmp tmp opkg install curl Installing curl 7 68 0 1 to root Downloading
  • 使用react-markdown与markdown-navbar实现在线浏览markdown文件并自动生成侧边导航栏目录(react项目)

    使用react markdown与markdown navbar实现在线浏览markdown文件并自动生成侧边导航栏目录 react项目 在项目中需要一个需求 需要将markdown文件放在react前端项目中实现浏览器在线浏览 修改mar
  • Python爬虫框架Scrapy实例(爬取腾讯社招信息并保存为excel)

    前言 在学习python爬虫的时候 曾经爬取过腾讯社招的网站 很久很久没有写爬虫 心血来潮打算爬一个练手 想起之前爬过腾讯社招网站 打开一看网页变了 行动 重新写一遍 这个网站相对简单 做了简单测试没有设置反爬 比较适合初学者拿来练手 搜索
  • 利用webhook实现发送通知到Slack

    概要 最近办公交流应用 Slack在各团队里大行其道 非常火热 今天我们就来说说怎么用他的incoming webhook来做一些同步通知 发送通知给Slack 我们先来看看这种incoming webhook来发送通知的优势 团队成员可以
  • Vulhub Apache HTTPD 换行解析漏洞

    漏洞介绍 漏洞原理 运维人员为了解决 Apache 解析漏洞 会使用 配置 来限制匹配到的最后一个扩展名 这种方式虽然对多个扩展名的解析漏洞进行了防护 但是因为 的正则匹配规则可以将 php n 的扩展名同样可以匹配到 php 的规则 产生
  • Android使用ViewPager实现图片的轮播

    一 概述 在现在的Android项目中 首页图片轮播是随处可见的 今天我们看看如何实现 先看效果图 二 实现 先给大家看看最简单的布局文件
  • 架构之路_深度探索C++对象模型总结

    本文主要参照 深度探索C 对象模型 一书 一 关于对象 C语言中 数据和处理数据的操作 函数 是分开声明的 不支持数据函数之间的关联性 称之为程序性的 procedural 1 1 对象类型 C 中可以通过独立抽象数据类型实现 比如 cla
  • Unity 中场景切换

    Unity游戏开发中 单个Scene解决所有问题似乎不可能 那么多个Scene之间的切换是必然存在 如果仅仅是切换 似乎什么都好说 但是在场景比较大的时候不想让玩家等待加载或者说场景与场景之间想通过一些画面 动画表现出一些让玩家期待的东西