Unity5的关卡切换
本文章由cartzhang编写,转载请注明出处。 全部权利保留。
文章链接:http://blog.csdn.net/cartzhang/article/details/51055584 
作者:cartzhang
一、Unity关卡
Unity 使用过程中关卡载入和卸载是大多数三维引擎都要提供的基本功能。 
由于关卡切换在游戏中很经常使用。 
在之前的版本号中Unity的关卡切换使用的是:
Application.loadedLevel()
看看Application类,此时这个类的功能比較繁杂。比較多。仅仅看与关卡相关的:
        [Obsolete("Use SceneManager.LoadScene")]
        public static void LoadLevel(string name);
        [Obsolete("Use SceneManager.LoadScene")]
        public static void LoadLevel(int index);
        [Obsolete("Use SceneManager.LoadScene")]
        public static void LoadLevelAdditive(string name);
        [Obsolete("Use SceneManager.LoadScene")]
        public static void LoadLevelAdditive(int index);
  //
        // 摘要:
        //     ///
        //     Unloads all GameObject associated with the given scene. Note that assets are
        //     currently not unloaded, in order to free up asset memory call Resources.UnloadAllUnusedAssets.
        //     ///
        //
        // 參数:
        //   index:
        //     Index of the scene in the PlayerSettings to unload.
        //
        //   scenePath:
        //     Name of the scene to Unload.
        //
        // 返回结果:
        //     ///
        //     Return true if the scene is unloaded.
        //     ///
        [Obsolete("Use SceneManager.UnloadScene")]
        public static bool UnloadLevel(string scenePath);
        //
        // 摘要:
        //     ///
        //     Unloads all GameObject associated with the given scene. Note that assets are
        //     currently not unloaded, in order to free up asset memory call Resources.UnloadAllUnusedAssets.
        //     ///
        //
        // 參数:
        //   index:
        //     Index of the scene in the PlayerSettings to unload.
        //
        //   scenePath:
        //     Name of the scene to Unload.
        //
        // 返回结果:
        //     ///
        //     Return true if the scene is unloaded.
        //     ///
        [Obsolete("Use SceneManager.UnloadScene")]
        public static bool UnloadLevel(int index);
这是之前的Application中的关卡的载入和卸载。 
当然如今在新版本号(Unity5.3以上)中,有了新的变化,那就是SceneManager类了处理。
二、Untiy的SceneManager类
自从Unity5.3版本号,Unity 的关卡切换就加入了新的SceneManager的类来处理。
当然要安装过了Unity文档帮助。而且给以下路径一样。就能够知道在本地打开。 
本地链接: 
file:///C:/Program%20Files/Unity5.3.0/Editor/Data/Documentation/en/Manual/UpgradeGuide53.html 
也能够在Unity中搜索SceneManager来查看。
#region 程序集 UnityEngine, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
// H:\Unity\UnityProject\ShiftLevels\Library\UnityAssemblies\UnityEngine.dll
#endregion
using UnityEngine.Internal;
namespace UnityEngine.SceneManagement
{
    //
    // 摘要:
    //     ///
    //     Scene management at run-time.
    //     ///
    public class SceneManager
    {
        public SceneManager();
        public static int sceneCount { get; }
        //
        public static int sceneCountInBuildSettings { get; }
        public static Scene GetActiveScene();
        public static Scene[] GetAllScenes();
        // 參数:
        //   index:
        //     Index of the scene to get. Index must be greater than or equal to 0 and less
        //     than SceneManager.sceneCount.
        public static Scene GetSceneAt(int index);
        // 返回结果:
        //     ///
        //     The scene if found or an invalid scene if not.
        //     ///
        public static Scene GetSceneByName(string name);
        //     Searches all scenes added to the SceneManager for a scene that has the given
        //     asset path.
        //     ///
        //
        // 參数:
        //   scenePath:
        //     Path of the scene. Should be relative to the project folder. Like: "AssetsMyScenesMyScene.unity".
        public static Scene GetSceneByPath(string scenePath);
        [ExcludeFromDocs]
        public static void LoadScene(int sceneBuildIndex);
        [ExcludeFromDocs]
        public static void LoadScene(string sceneName);
        // 參数:
        //   sceneName:
        //     Name of the scene to load.
        //
        //   sceneBuildIndex:
        //     Index of the scene in the Build Settings to load.
        //
        //   mode:
        //     Allows you to specify whether or not to load the scene additively. See SceneManagement.LoadSceneMode
        //     for more information about the options.
        public static void LoadScene(int sceneBuildIndex, [DefaultValue("LoadSceneMode.Single")] LoadSceneMode mode);
        // 參数:
        //   sceneName:
        //     Name of the scene to load.
        //
        //   sceneBuildIndex:
        //     Index of the scene in the Build Settings to load.
        //
        //   mode:
        //     Allows you to specify whether or not to load the scene additively. See SceneManagement.LoadSceneMode
        //     for more information about the options.
        public static void LoadScene(string sceneName, [DefaultValue("LoadSceneMode.Single")] LoadSceneMode mode);
        [ExcludeFromDocs]
        public static AsyncOperation LoadSceneAsync(int sceneBuildIndex);
        [ExcludeFromDocs]
        public static AsyncOperation LoadSceneAsync(string sceneName);
        // 參数:
        //   sceneName:
        //     Name of the scene to load.
        //
        //   sceneBuildIndex:
        //     Index of the scene in the Build Settings to load.
        //
        //   mode:
        //     If LoadSceneMode.Single then all current scenes will be unloaded before loading.
        public static AsyncOperation LoadSceneAsync(int sceneBuildIndex, [DefaultValue("LoadSceneMode.Single")] LoadSceneMode mode);
        // 參数:
        //   sceneName:
        //     Name of the scene to load.
        //
        //   sceneBuildIndex:
        //     Index of the scene in the Build Settings to load.
        //
        //   mode:
        //     If LoadSceneMode.Single then all current scenes will be unloaded before loading.
        public static AsyncOperation LoadSceneAsync(string sceneName, [DefaultValue("LoadSceneMode.Single")] LoadSceneMode mode);
        //
        // 參数:
        //   sourceScene:
        //     The scene that will be merged into the destination scene.
        //
        //   destinationScene:
        //     Existing scene to merge the source scene into.
        public static void MergeScenes(Scene sourceScene, Scene destinationScene);
        //
        // 摘要:
        //     ///
        //     Move a GameObject from its current scene to a new scene. /// It is required that
        //     the GameObject is at the root of its current scene.
        //     ///
        //
        // 參数:
        //   go:
        //     GameObject to move.
        //
        //   scene:
        //     Scene to move into.
        public static void MoveGameObjectToScene(GameObject go, Scene scene);
        //
        // 返回结果:
        //     ///
        //     Returns false if the scene is not loaded yet.
        //     ///
        public static bool SetActiveScene(Scene scene);
        //     ///
        public static bool UnloadScene(string sceneName);
        //
        // 摘要:
        //     ///
        //     Unloads all GameObjects associated with the given scene. Note that assets are
        //     currently not unloaded, in order to free up asset memory call Resources.UnloadAllUnusedAssets.
        //     ///
        //
        // 參数:
        //   sceneBuildIndex:
        //     Index of the scene in the Build Settings to unload.
        //
        //   sceneName:
        //     Name of the scene to unload.
        //
        // 返回结果:
        //     ///
        //     Returns true if the scene is unloaded.
        //     ///
        public static bool UnloadScene(int sceneBuildIndex);
    }
}
注意的是这里面还有能够带对象来在关卡中移动的,还有穿越功能啊!
!哈哈
三、5.3的实现代码
上代码:
/**************************************************************************
Copyright:@cartzhang
Author: cartzhang
Date: 2016-04-01
Description:载入关卡。能够分组载入和卸载。
使用Unity版本号为5.3.0.
由于里面使用了场景管理的一个类,这个类在5.3.0以上版本号才加入的。
測试操作:使用空格键来切换场景。然后间隔5秒后才開始卸载。
**************************************************************************/
using UnityEngine;
using System.Collections;
using UnityEngine.SceneManagement;
[System.Serializable]
public class LevelOrder
{
    [Header("每组关卡名称")]
    public string[] LevelNames;
}
public class ChangLevelsHasMain : MonoBehaviour
{
    [Header("全部关卡列表")]
    public LevelOrder[] levelOrder;
    private static int index;
    private int totalLevels = 0;
    private int levelOrderLength;
    void Start ()
    {
        for (int i = 0; i < levelOrder.Length; i++)
        {
            totalLevels += levelOrder[i].LevelNames.Length;
        }
        if (totalLevels != SceneManager.sceneCountInBuildSettings)
        {
        }
        levelOrderLength = levelOrder.Length;
    }
    // Update is called once per frame
    void Update ()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            bool isOk = LoadNextLevels();
            if (isOk)
            {
                InvokeRepeating("UnloadLastLevel", 2.0f, 5);
            }
        }
    }
    bool LoadNextLevels()
    {
        bool bResult = true;
        //index = index % levelOrderLength;
        if (index < 0 || index >= levelOrderLength)
        {
            bResult = false;
            return bResult;
        }
        int LoadTimes = levelOrder[index].LevelNames.Length;
        for (int i = 0; i < LoadTimes; i++)
        {
            SceneManager.LoadSceneAsync(levelOrder[index].LevelNames[i], LoadSceneMode.Additive);
        }
        return bResult;
    }
    void UnloadLastLevel()
    {
        if (index == 0)
        {
            index++;
            CancelInvoke("UnloadLastLevel");
            return;
        }
        // 上一組的關卡
        int TmpLast = (index - 1) >= 0 ?
(index - 1) : levelOrderLength - 1;
        int LoadTimes = levelOrder[index].LevelNames.Length;
        for (int i = 0; i < LoadTimes; i++)
        {
            Scene Tmp = SceneManager.GetSceneByName(levelOrder[index].LevelNames[i]);
            if (!Tmp.isLoaded)
            {
                return;
            }
        }
        // 下一關卡全部加載完畢後。卸載之前關卡
        for (int i = 0; i < levelOrder[TmpLast].LevelNames.Length; i++)
        {
            SceneManager.UnloadScene(levelOrder[TmpLast].LevelNames[i]);
        }
        index++;
        CancelInvoke("UnloadLastLevel");
    }
}
就这样就能够了。
代码主要是按组来载入关卡。然后按组来卸载。
測试中,按下空格键来载入。每组关卡在一定时间后,(这里设置的5秒)自己主动卸载前一组关卡。这里主地图是不卸载的,会一直存在的。
怎么设置的呢?首先须要在Build setting中中把全部要处理的关卡放进来。要不就会在载入过程中报错。 
例如以下图: 
然后把代码挂在主地图的随意对象对象上就能够了。
四、測试结果
随意做了几张地图。不那么好看。
可是功能很明显。 
第一组: 
 
第二组 
 
第三组 
參考
file:///C:/Program%20Files/Unity5.3.0/Editor/Data/Documentation/en/Manual/UpgradeGuide53.html
追加Github地址:https://github.com/cartzhang/ShiftLevels
————————–THE———END————–
若有问题。请随时联系!。 
很感谢!!
你在桥上看风景。我在楼里加班!
Unity5的关卡切换的更多相关文章
- UE4 difference between servertravel and openlevel(多人游戏的关卡切换)
		
多人游戏的关卡切换分为无缝和非无缝.非无缝切换时,客户端将跟服务器断开连接,然后重新连接到同一个服务器,服务器则加载一个新地图.无缝切换不会发生这样的情况. 有三个函数供我们使用:UEngine::B ...
 - 【UE4 C++】关卡切换、流关卡加载卸载
		
切换关卡 基于 UGameplayStatics:: OenLevel UGameplayStatics::OpenLevel(GetWorld(), TEXT("NewMap") ...
 - UGUI_游戏菜单场景切换
		
事件委托 GameManger(空物体)+GameManger脚本——重要的方式 public class GameManger : MonoBehaviour { public void OnSta ...
 - Unity AssetBundles and Resources指引 (四) AssetBundle使用模式
		
本文内容主要翻译自下面这篇文章 https://unity3d.com/cn/learn/tutorials/topics/best-practices/guide-assetbundles-and- ...
 - Unity项目 - MissionDemolition 愤怒的小鸟核心机制
		
目录 游戏原型 项目演示 绘图资源 代码实现 注意事项 技术探讨 参考来源 游戏原型 爆破任务 MissionDemolition 是一款核心机制类似于愤怒的小鸟的游戏,玩家将用弹弓发射炮弹,摧毁城堡 ...
 - 《InsideUE4》-8-GamePlay架构(七)GameMode和GameState
		
我的世界,我做主 引言 上文我们说到在Actor层次,UE用Controller来充当APawn的逻辑控制者,也有了可以接受玩家输入的PlayerController,和能自行行动的AIControl ...
 - Unity内存理解(转)
		
Unity3D 里有两种动态加载机制:一个是Resources.Load,另外一个通过AssetBundle,其实两者区别不大. Resources.Load就是从一个缺省打进程序包里的AssetBu ...
 - 【转载】Unity 优雅地管理资源,减少占用内存,优化游戏
		
转自:星辰的<Unity3D占用内存太大的解决方法> 最近网友通过网站搜索Unity3D在手机及其他平台下占用内存太大. 这里写下关于Unity3D对于内存的管理与优化. Unity3D ...
 - Unity3D占用内存太大的解决方法
		
原地址:http://www.cnblogs.com/88999660/archive/2013/03/15/2961663.html 最近网友通过网站搜索Unity3D在手机及其他平台下占用内存太大 ...
 
随机推荐
- 失误1: 把i放到循环体内部,i++失效
			
54 while($lines_num_of_whole_table>=1){ 55 my $i = 1; ...
 - Shell数值比较
			
Shell数值比较 比较 描述 n1 -eq n2 检查n1是否与n2相等 n1 -ge n2 检查n1是否大于或等于n2 n1 -gt n2 检查n1是否大于n2 n1 -le n2 检查n1是否小 ...
 - HDU1116(欧拉路径+并查集)
			
题意: 给出一些字符串,有这两个字符串,如果第一个字符串的最后一个字母和第二个字符串的第一个字母是一样的,则这两个字符串是可以连接在一起的. 问给出的这些字符串能否串成一个环或者一整个链. 思路: 将 ...
 - Android 图片设置圆角 方法之二
			
Android中经常会遇到对图片进行二次处理,例如加圆角,或者显示圆形图片.接下来我们再介绍一种方法. 首先, 自定义ImageView: android:id="@+id/iv" ...
 - 分分钟钟学会Python - 函数(function)
			
函数(function) 1 基本结构 本质:将多行代码拿到别处并起个名字,以后通过名字就可以找到这行代码并执行 应用场景: 代码重复执行 代码量很多超过一屏,可以选择通过函数进行代码的分割 写代码方 ...
 - 【BZOJ 1076】[SCOI2008]奖励关(期望)
			
Description 你正在玩你最喜欢的电子游戏,并且刚刚进入一个奖励关.在这个奖励关里,系统将依次随机抛出k次宝物, 每次你都可以选择吃或者不吃(必须在抛出下一个宝物之前做出选择,且现在决定不吃的 ...
 - ubuntu安装远程桌面连接工具
			
1. 安装xrdp sudo apt-get -y install xrdp 2.安装vnc4server sudo apt-get install vnc4server 3.安装xubunt ...
 - 洛谷 P3387 【模板】缩点  DAGdp学习记
			
我们以洛谷P3387 [模板]缩点 来学习DAGdp 1.这道题的流程 //伪代码 for i->n if(i未被遍历) tarjan(i) 缩点() DAGdp() 完成 首先tarjan这部 ...
 - Triangular Pastures (二维01背包)
			
描述Like everyone, cows enjoy variety. Their current fancy is new shapes for pastures. The old rectang ...
 - NYOJ-116士兵杀敌(二),树状数组~~
			
士兵杀敌(二) 时间限制:1000 ms | 内存限制:65535 KB 难度:5 描述 南将军手下有N个士兵,分别编号1到N,这些士兵的杀敌数都是已知的. 小工是南将军手下的军师,南将军经常想知 ...