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的场景,而是等待用户的触摸或者点击操作

            

具体的操作过程:

(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(, , Screen.width, Screen.height), BackImage); //加载过程中显示进度,也可以是进度条
if (async != null && async.isDone == false)
{
GUIStyle style = new GUIStyle();
style.fontSize = ;
GUI.Label(new Rect(, , Screen.width, ), async.progress.ToString("F2"), style);
} //在加载结束后,弹出是否下个场景,模拟手游中"触摸任意位置进入游戏"
if (async != null && async.isDone == true)
{
if (GUI.Button(new Rect(, , , ), 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 ,就可以在多个场合使用啦。

第二种方式使用prefab

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

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

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

          

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

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

细雨标记:unity
 
 
作者:细雨
 
转载请注明原文地址:http://www.cnblogs.com/zsb517/p/4113538.html

Unity 中场景切换的更多相关文章

  1. unity 之 场景切换进度条显示

    一.UI.建立slider适当更改即可: 二.新增loadScene脚本,用来进行场景切换,将其绑定任意物体上面.博主以放置主相机为例.参数分别为进度条(用来设置value值),显示进度文本text: ...

  2. Unity 之 场景切换

      Application.LoadLevel();//场景名称或索引,删除掉原场景的所有东西 Application.LoadLevelAdditive()//添加并加载场景,不删除当前场景的物体, ...

  3. 关于Unity中场景的导入与导出(专题九)

    Unity场景 场景虽然是由场景美术做好的,但是我们经常需要自己去导导出以及从别的项目导入,所以我们需要对场景的导入和导出有一个详细的了解 1: 场景是由美术人员搭建完成后提交给程序;2: 场景一般包 ...

  4. 关于Unity中场景视图的使用

    1.在任何状态下,按下鼠标中键可以切换到手掌的那个状态,可以移动当前场景 2.在手掌的那个状态,按住鼠标左键是移动场景视图,右键是视角绕着摄像机移动,按住alt+鼠标左键,是绕着指定物体旋转视角 3. ...

  5. Unity中场景异步加载

    引入命名空间 using UnityEngine.UI; using UnityEngine.SceneManagement; using System.Collections; using Syst ...

  6. cocos2d-x 3.0 场景切换特效汇总(转)

    cocos2d-x 3.0中场景切换特效比较多,而且游戏开发中也经常需要用到这些特效,来使场景切换时不至于那么干巴,遂这里汇总一下,开发中使用. 场景切换用到导演类Directory,大多数用的都是替 ...

  7. cocos2d-x 3.0 场景切换特效汇总

    cocos2d-x 3.0中场景切换特效比較多,并且游戏开发中也常常须要用到这些特效.来使场景切换时不至于那么干巴,遂这里汇总一下,开发中使用. 场景切换用到导演类Directory,大多数用的都是替 ...

  8. Cocos2d-X研究之3.0 场景切换特效汇总

    Cocos2d-X研究之3.0 场景切换特效汇总 2014-08-05      0个评论    来源:游戏编程    收藏    我要投稿 cocos2d-x 3.0中场景切换特效比较多,而且游戏开 ...

  9. COCOS2DX场景切换特效

    cocos2d-x 3.0中场景切换特效比较多,而且游戏开发中也经常需要用到这些特效,来使场景切换时不至于那么干巴,遂这里汇总一下,开发中使用. 百牛信息技术bainiu.ltd整理发布于博客园 场景 ...

随机推荐

  1. Android悬浮窗注意事项

    一 动画无法运行 有时候,我们对添加的悬浮窗口,做动画的时候,始终无法运行. 那么,这个时候,我们可以对要做动画的View,再添加一个parent,即容器.将要做动画的View放入容器中. 二 悬浮窗 ...

  2. ytu 1998:C语言实验——删除指定字符(水题)

    C语言实验——删除指定字符 Time Limit: 1 Sec  Memory Limit: 64 MBSubmit: 327  Solved: 211[Submit][Status][Web Boa ...

  3. Fiddler Web Debugger Tool

    The Fiddler tool helps you debug web applications by capturing network traffic between the Internet ...

  4. Codeforces Gym 100342J Problem J. Triatrip 求三元环的数量 bitset

    Problem J. Triatrip Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100342/at ...

  5. 使用redis-cli定时执行指定命令

    50 20 * * * echo "del counterv2_real" | redis-cli -h hosts -a id:pwd --pipe

  6. Burp Suite详细使用教程

    Burp Suite详细使用教程-Intruder模块详解 最近迷上了burp suite 这个安全工具,百度了关于这个工具的教程还卖900rmb...ohno.本来准备买滴,但是大牛太高傲了,所以没 ...

  7. [转]说说C语言运算符的“优先级”与“结合性”

    补充自己的一点理解: 1.关于++i 与 i++的区别. ++i 和 i++如果是单独使用的语句,即二者后面均加上分号,或者其他单独使用的语句,没有任何区别.例如: for(i=0;i<100; ...

  8. js:数据结构笔记13--检索算法

    顺序查找:也称线性查找,暴力查找的一种 基本格式: var nums = []; for(var i = 0; i < 10; ++i) { nums[i] = Math.floor(Math. ...

  9. Xamarin.iOS提供没有匹配的配置文件

    Xamarin.iOS提供没有匹配的配置文件 错误信息:No installed provisioning profiles match the installed ios code signing  ...

  10. DFS ZOJ 1002/HDOJ 1045 Fire Net

    题目传送门 /* 题意:在一个矩阵里放炮台,满足行列最多只有一个炮台,除非有墙(X)相隔,问最多能放多少个炮台 搜索(DFS):数据小,4 * 4可以用DFS,从(0,0)开始出发,往(n-1,n-1 ...