• 一、Unity关卡Unity 使用过程中关卡加载和卸载是大多数三维引擎都要提供的基本功能。 因为关卡切换在游戏中非常常用。 在之前的版本中Unity的关卡切换使用的是:Application.loadedLevel();看看Application类,...
    ###一、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);
        }
    }
    ```
    ### 三、SceneManager对于获取场景的一些操作
    (一)
    SceneManager
    class in UnityEngine.SceneManagement
    描述:运行时的场景管理。
    静态变量sceneCount: 当前加载的场景的总数。
    前加载的场景的数量将被返回。
    sceneCountInBuildSettings : 在BuildSettings的号码。
    
    (二)
    CreateScene:在运行时创建一个空的新场景,使用给定的名称。
    在运行时创建一个空的新场景,使用给定的名称。
    新的场景将开放相加到层次与现有已经打开的场景。新场景的路径将是空的。此函数用于在运行时创建场景。创建一个场景编辑时间(例如,使编辑脚本或工具需要创建场景时),使用editorscenemanager.newscene。
    
    (三)
    public static SceneManagement.Scene GetActiveScene()
    现场的活动场景。
    描述:获取当前活动场景。
    当前活动的场景将被用来作为目标由脚本实例化新的游戏对象现场。
    
    ```
    using UnityEngine;
    using UnityEngine.SceneManagement;
    
    public class GetActiveSceneExample : MonoBehaviour
    {
        void Start()
        {
            Scene scene = SceneManager.GetActiveScene();
    
            Debug.Log("Active scene is '" + scene.name + "'.");
        }
    }
    ```
    (四)
    public static SceneManagement.Scene GetSceneAt(int index);
    index:场景索引。指数必须大于或等于0和小于scenemanager.scenecount。
    
    返回:
    根据给定的参数返回一个场景引用。
    获取现场在添加场景的场景管理器的列表索引:
    
    ```
    using UnityEditor;
    using UnityEditor.SceneManagement;
    using UnityEngine.SceneManagement;
    using UnityEngine;
    public class Example
    {
        // adds a menu item which gives a brief summary of currently open scenes
        [MenuItem("SceneExample/Scene Summary")]
        public static void ListSceneNames()
        {
            string output = "";
            if (SceneManager.sceneCount > 0)
            {
                for (int n = 0; n =0 ? " in build)\n" : " NOT in build)\n";
                }
            }
            else
            {
                output = "No open scenes.";
            }
            EditorUtility.DisplayDialog("Scene Summary",output, "Ok");
        }
    }
    ```
    
    (五)
    
    public static SceneManagement.Scene GetActiveScene();
    获取当前活动场景。
    当前活动的场景将被用来作为目标由脚本实例化新对象。
    
    ```
    using UnityEngine;
    using UnityEngine.SceneManagement;
    
    public class GetActiveSceneExample : MonoBehaviour
    {
        void Start()
        {
            Scene scene = SceneManager.GetActiveScene();
    
            Debug.Log("Active scene is '" + scene.name + "'.");
        }
    }
    
    public static void LoadScene(int sceneBuildIndex, SceneManagement.LoadSceneMode mode = LoadSceneMode.Single);
    public static void LoadScene(string sceneName, SceneManagement.LoadSceneMode mode = LoadSceneMode.Single);
    ```
    
    sceneName: 需发加载的场景名称或路径。
    
    sceneBuildIndex:在“ Build Settings”加载中的场景的索引。
    
    Mode:允许您指定是否要加载相加现场。见LoadScene模式有关选项的详细信息。
    LoadSceneMode:在播放器加载一个场景时使用。
    Single:关闭所有当前场景和加载一个新场景。
    Additive:将场景添加到当前加载的场景中。
    你可以使用这个异步版本:LoadSceneAsync。
    
    ```
    using UnityEngine;
    using UnityEngine.SceneManagement;
    
    public class ExampleClass : MonoBehaviour {
        void Start () {
            // Only specifying the sceneName or sceneBuildIndex will load the scene with the Single mode
            SceneManager.LoadScene ("OtherSceneName", LoadSceneMode.Additive);
        }
    }
    ```
    
    
    ### 四、5.3的实现代码
    
    上代码:
    
    ```
    /**************************************************************************
    Copyright:@maxdong
    Author: maxdong
    Date: 2017-07-04
    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 = levelOrderLength)
            {
                bResult = false;
                return bResult;
            }
    
            int LoadTimes = levelOrder[index].LevelNames.Length;
            for (int i = 0; i = 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中中把所有要处理的关卡放进来。要不就会在加载过程中报错。 
    如下图: 
    ![这里写图片描述](https://img-blog.csdn.net/20160404103107676)
    
    然后把代码挂在主地图的任意对象对象上就可以了.
    ![这里写图片描述](https://img-blog.csdn.net/20160404105747233)
    
    
    
    
    
    
    展开全文
  • 很久没有更新博客了,最近也是还在学习U3D。下面写一下使用SceneManager跳转/加载场景。 ...其实加载场景很简单,只需要写一个协同的函数,当前我们也需要引用using UnityEngine.SceneManagement;...
  • Unity3d中提供了场景Scene的概念,Scene就是一组相关联的游戏对象的一个集合,通常每个集合就是一个场景,但是也有可能只是一个场景的一部分! 场景中的游戏对象是任意的,可以是HUD的UI组件,场景地图,模型等等 ...
  • Unity3D 扩展 Scene 2015-11-26 21:50:05
     [CustomEditor(typeof(Test))] // 可以做成,直接把Prefab拖到场景中,自动合并, // 获得是,地点选择,就合并到那个中 public class TestEditor : Editor {  void InitStyle() ... _boneNameStyle....
  • 今天博主想和大家分享的是Unity3D场景编辑器的扩展开发,相关的话题我们在Unity3D游戏开发之编辑器扩展程序开发实例这篇文章中我们已经有所涉及,今天博主想特别针对场景编辑器的扩展开发来进行下深入研究。...
  • Unity3d中提供了场景Scene的概念,Scene就是一组相关联的游戏对象的一个集合,通常每个集合就是一个场景,但是也有可能只是一个场景的一部分! 场景中的游戏对象是任意的,可以是HUD的UI组件,场景地图,模型等等 ...
  • 今天我们来说说通过反编译Unity3D的AssetBundle来提取游戏资源,博主写这篇文章的目的并非是要教大家如何去破解一款基于Unity3D引擎开发的游戏,而是想通过今天这篇文章来告诉大家如何在开发Unity3D游戏的过程中保护...
  • unity3d 2018 game 窗口 和 scene 窗口亮度不一致 unity3d 2018 game 窗口 和 scene 窗口亮度不一致 工作中遇到unity3d game窗口比scene窗口暗,亮度不一样。此情况发生在unity3d 2018.4中。 解决办法: 需要开启...
  • Unity3D 重载/加载 scene 2019-03-13 09:08:39
    转载,自用 很多时候我们会需要在游戏结束,重新开始的时候,从当前状态回到场景初始状态。下面一步步讲解。 1.首先使用 UnityEngine.SceneManagement 命名空间,方便调用 using UnityEngine.SceneManagement ...
  • 1.Scene【场景面板】:该面板为 Unity3D 的编辑面板;你可以将你所有的模型、灯光、以及其他材质对象拖放到该场景中。构建游戏中所能呈现景象。 2.Game【游戏面板】:与场景面板不同,该面板是用来渲染场景面板中...
  • Unity3D界面介绍及入门 2014-05-25 11:48:37
    首先,你可以在unity3d官网(http://unity3d.com/)下载新版本的软件,本文中使用的是unity3d 4.0.标准版是不支持阴影的,只有专业版才支持,所以对于效果要求较高的读者,可以选择购买正版,不要使用盗版或者破解版,...
  • Unity3D场景切换 2016-05-05 20:33:18
    首先新建两个场景:Scene_1与Scene_2 在第一个场景Scene_1中加入UI控件Button,Text设置为“点击切换场景”,名称为默认值“Button” 新建一个脚本,命名为ChangeScene,作为组件添加到Button按钮中: ...
  • Unity3D学习笔记(2)Unity3D与3DMax结合开发注意事项 单位:比例统一 在建模型前先设置好单位,在同一场景中会用到的模型的单位设置必须一样,模型与模型之间的比例要正确,和程序的导入单位一致,即便到程序...
  • Unity 3D结构界面详细说明 2018-03-06 16:02:59
    Scene【场景面板】:该面板为Unity3D的编辑面板;你可以将你所有的模型、灯光、以及其他材质对象拖放到该场景中。构建游戏中所能呈现景象。  Game【游戏面板】:与场景面板不同,该面板是用来渲染场景面板中...
  • 我一直向所有想做游戏的朋友推荐Unity3D,为什么呢?首先是因为专业,Unity3D非常强大,用它创建一个类似MiniGore这样的3D平面射击游戏简直轻而易举,而就连使命召唤这样的大型3d游戏,如果素材得当也不在话下。二是...
  • Unity 3D学习 —— Scene面板 2019-11-13 10:47:56
    >>>我记得笔记来源于这个网课 这篇文章我记了什么 Scene面板内的操作
  • 【前言】 图形化调试可以加速开发。 例如在战斗中,可能需要知道所有单位的仇恨值,如果这些信息全打log的话,很难有...Unity中图形化调试主要4种 Debug.Draw Gizmos.Draw Graphic.DrawMesh GL 只需在Scene窗口显示的
  • Unity3d实战之Unity3d网络游戏实战篇(2):代码资源分离的界面系统 阅读文章前请细读以下几点: 学习书籍《Unity3d网络游戏实战》 罗培羽著 机械工业出版。 本文是作者在学习过程中遇到的认为值得记录的点,...
  • unity3d 各大插件评测 2018-01-30 15:00:43
    原创文章如需转载请注明:转载自风宇冲Unity3D教程学院 引言:想用Unity3D制作优秀的游戏,插件是必不可少的。工欲善其事必先利其器。本文主旨是告诉使用Unity3D引擎的同学们如何根据需求选择适当的工具...
1 2 3 4 5 ... 20
收藏数 9,455
精华内容 3,782