Unity基础(九)Application类与SceneManager

Application 应用程序


你需要引用命名空间: using UnityEngine
描述访问应用程序的运行时数据。
这个类包含查找信息和控制运行时数据的静态方法。

一、成员变量
Application.absoluteURL   //到web播放器数据文件夹的绝对路径(只读)。
Application.backgroundLoadingPriority   //后台装载线程优先级。
Application.dataPath    //包含游戏数据文件夹的路径(只读)。
Application.genuine //如果编译后的应用程序被任何方式改变的了,返回假。
Application.genuineCheckAvailable   //如果可以确认应用程序的完整性返回真。
Application.internetReachability    //返回设备上的网络可达性目前可能的类型。
Application.isEditor     //是在Unity编辑器内运行
Application.isLoadingLevel  //是否有一些场景正在被加载(只读)
Application.isPlaying       //当在任何种类的播放器时,返回真(只读)。
Application.isWebPlayer   //是否在一个网络播放器中运行?(只读)
Application.levelCount  //可用的关卡总数。(只读)
Application.loadedLevel   //最后加载的关卡索引(只读),也就是已加载的关卡或上次加载的关卡索引。
Application.loadedLevelName   //最后加载的关卡的名字。(只读)也就是已加载的或上次加载的关卡名称。
Application.persistentDataPath  //包含一个持久数据目录的路径(只读)。
Application.platform     //返回游戏运行的平台(只读)。
Application.runInBackground     //应用程序在后台时是否应该被运行?
Application.srcValue     //相对于html文件的web播放器数据文件的路径(只读)。
Application.streamedBytes   //我们从主Unity网页流中下载了多少字节(只读)
Application.streamingAssetsPath   //包含一个到StreamingAssets文件夹的路径。(只读)
Application.systemLanguage      //用户操作系统正在运行的语言。
Application.targetFrameRate    //命令游戏尝试以一个特定的帧率渲染。
Application.temporaryCachePath    //包含一个临时数据/缓存目录的路径(只读)。
Application.unityVersion      //用于播放该内容的Unity运行时的版本。
Application.webSecurityEnabled  //指示是否webplayer的安全模式是否被启用。
二、函数
Application.CancelQuit()    //取消退出该应用程序。这可以用来在退出游戏的时候显示一个退出画面。
Application.CanStreamedLevelBeLoaded()  //可以流数据加载关卡么?
Application.CaptureScreenshot() //捕捉屏幕到filename路径,保存为PNG文件。
Application.ExternalCall()    //调用一个包含在网页中的函数(只用于Web Player)。
Application.ExternalEval()    //调用包含在网页中的片段脚本函数(只用于Web Player)。
Application.GetStreamProgressForLevel() //下载的进度是多少? [0…1].
Application.HasProLicense() //是具有Unity Pro许可证激活?
Application.HasUserAuthorization()  //检查用户是否有权在网页中使用摄像头和麦克风。
Application.LoadLevel() //通过关卡的名字或索引来加载关卡。
Application.LoadLevelAdditive() //累加一个关卡,也就是说,加载一个新的场景,当前场景不会被销毁。
Application.LoadLevelAdditiveAsync()    //在后台异步累加关卡,也就是说在后台非同步加载新的场景,但当前的场景不会被销毁。
Application.LoadLevelAsync()      //在后台异步加载关卡,也就是说,在后台非同步加载新的场景。
Application.OpenURL()   //在浏览器中打开url 。
Application.Quit()   // 退出应用程序。在编辑器或者web播放器中退出被忽略。
Application.RegisterLogCallback()   //在一个日志信息上注册一个委托来被调用。
Application.RegisterLogCallbackThreaded()   //在一个日志信息上注册一个委托来被调用。
Application.RequestUserAuthorization()    //在webplayer请求授权使用摄像头或麦克风。

Unity Editor下使用 Application.Quit()为什么程序没有退出?

因为Editor下使用 UnityEditor.EditorApplication.isPlaying = false 结束退出,
只有当工程打包编译后的程序使用Application.Quit()才奏效,具体参见代码,
在自己的工程中添加调用即可。

Application各种路径在终端的本地路径如图1-1
1-1
## PC:

Application.dataPath : /Assets

Application.streamingAssetsPath : /Assets/StreamingAssets

Application.persistentDataPath : C:/Users/xxxx/AppData/LocalLow/CompanyName/ProductName

Application.temporaryCachePath : C:/Users/xxxx/AppData/Local/Temp/CompanyName/ProductName


Android:

Application.dataPath : /data/app/xxx.xxx.xxx.apk

Application.streamingAssetsPath : jar:file:///data/app/xxx.xxx.xxx.apk/!/assets

Application.persistentDataPath : /data/data/xxx.xxx.xxx/files

Application.temporaryCachePath : /data/data/xxx.xxx.xxx/cache


IOS:

Application.dataPath : Application/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/xxx.app/Data

Application.streamingAssetsPath : Application/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/xxx.app/Data/Raw

Application.persistentDataPath : Application/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/Documents

Application.temporaryCachePath : Application/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/Library/Caches


Mac:

Application.dataPath : /Assets

Application.streamingAssetsPath : /Assets/StreamingAssets

Application.persistentDataPath : /Users/xxxx/Library/Caches/CompanyName/Product Name

Application.temporaryCachePath : /var/folders/57/6b4_9w8113x2fsmzx_yhrhvh0000gn/T/CompanyName/Product Name

SceneManager —— 场景管理


我们在游戏开发中,经常用到关卡切换、场景切换、加载场景等诸多功能性操作
Unity 为我们提供了场景管理类,可以很方便的对场景进行各类操作
下边我们就来逐一的看一下,API中的函数具体用法

注意:要引用 using UnityEngine.SceneManagement

直接给大家贴上中文注释,便于初学者学习
其他易出错的函数, Chinar 也用了简单例子做了说明,避免初学者踩坑!

提示:
其中 0 号场景为: SampleScene
其中 1 号场景为: SampleScene2

一、成员变量
SceneManager.GetActiveScene().buildIndex;           //返回“Build Setting”中场景的索引。如果场景是通过AssetBundle加载的,则始终返回-1。
SceneManager.GetActiveScene().isDirty             //如果场景被修改,则返回true。
SceneManager.GetActiveScene().isLoaded             //如果加载场景,则返回true。
SceneManager.GetActiveScene().name;                 //返回场景的名称。
SceneManager.GetActiveScene().path;                 //返回场景的相对路径。喜欢:“Assets/Scenes/SampleScene.unity”。
SceneManager.GetActiveScene().rootCount;            //返回场景的游戏对象个数
SceneManager.GetActiveScene().GetHashCode();        //返回场景的哈希值
SceneManager.GetActiveScene().GetRootGameObjects(); //返回场景中所有游戏对象,是一个GameObject[] 数组
二、函数
SceneManager.CreateScene("SampleScene2");                      //使用给定名称在运行时创建一个空的新场景
SceneManager.GetActiveScene();                        //获取当前活动的场景
SceneManager.GetSceneAt(0);                            //在SceneManager的已加载场景列表中获取索引处的场景
SceneManager.GetSceneByBuildIndex(0);                       //从构建Build Setting中索引获取Scene结构
SceneManager.GetSceneByName("SampleScene2");                     //搜索给定名称的场景
SceneManager.GetSceneByPath("Assets/Scenes/SampleScene.unity"); //搜索给定路径的场景
SceneManager.LoadScene(1);                          //根据“Build Setting”中索引加载场景
SceneManager.LoadScene("SampleScene2");                          //根据“Build Setting”中名称加载场景
SceneManager.LoadScene(1, LoadSceneMode.Additive);       //加载场景,加载方式:保留当前场景,附加指定场景
SceneManager.LoadScene("SampleScene2", LoadSceneMode.Single);         //加载场景,加载方式:关闭所有当前加载的场景并加载场景
SceneManager.LoadSceneAsync(1);                         //根据下标,在后台异步加载场景
SceneManager.LoadSceneAsync("SampleScene2");                //根据名称,在后台异步加载场景
SceneManager.LoadSceneAsync(1, LoadSceneMode.Additive);         //异步加载,方式:附加
SceneManager.LoadSceneAsync(1);                         //异步加载,方式:单一
SceneManager.UnloadSceneAsync("SampleScene2");          //销毁与给定场景关联的所有GameObject,并从SceneManager中移除场景。

有时我们需要将场景合并
或者将当前场景的游戏对象,移动到其他场景中 / 设置活跃场景

提示:
进行这三类操作,都需要先将目标场景加载后,才可保证函数正确执行
这里为了便于初学者理解,我用了协成加载的方式,来做说明
其中 0 号场景为: SampleScene
其中 1 号场景为: SampleScene2

合并场景

    void Start()
    {
        StartCoroutine(MergeMethodEnumerator());//合并场景
      
    }
    //合并场景:必须要保证,要合并的场景被加载后,才可以正确合并,如果物体名称相同,并不会合并,相互独立
    IEnumerator MergeMethodEnumerator()
    {
        //等待场景加载完毕后,再向下执行
        yield return SceneManager.LoadSceneAsync(1, LoadSceneMode.Additive);
        //源场景 1,目标场景:当前 —— 将源场景合并到目标场景中
        SceneManager.MergeScenes(SceneManager.GetSceneByBuildIndex(1), SceneManager.GetActiveScene()); 
    }

移动游戏对象到目标场景

    void Start()
    {
        StartCoroutine(MoveGameObjectToSceneEnumerator()); //移动游戏对象到目标场景
    }
    //移动游戏对象到新场景,必须要保证:目标场景被加载后,游戏对象才能被正确移动到目标场景中如果物体名称相同,
    //并不会合并,相互独立
    IEnumerator MoveGameObjectToSceneEnumerator()
    {
        //等待场景加载完毕后,再向下执行
        yield return SceneManager.LoadSceneAsync(1, LoadSceneMode.Additive);
        //将当前场景中的 Cube,移动到目标场景中
        SceneManager.MoveGameObjectToScene(GameObject.Find("Cube"), SceneManager.GetSceneByName("SampleScene2"));
        //卸载掉当前场景
        SceneManager.UnloadSceneAsync(SceneManager.GetActiveScene());
        //如果要加载单个场景,请确保在要移动到新场景的GameObject上使用DontDestroyOnLoad,否则Unity会在加载新场景时删除它。
    }

设置场景为活动场景

    void Start()
    {
        StartCoroutine(SetActiveSceneEnumerator());        //设置场景为活动场景
    }
    //设置场景为活动场景
    // 必须要保证:目标场景被加载后,才可以正确设置活动状态
    IEnumerator SetActiveSceneEnumerator()
    {
        //等待场景加载完毕后,再向下执行
        yield return SceneManager.LoadSceneAsync(1, LoadSceneMode.Additive);
        //设置场景为活动场景
        SceneManager.SetActiveScene(SceneManager.GetSceneAt(1));           
        //print(SceneManager.GetSceneAt(1).IsValid());
    }

Scene (Events) —— 场景事件


有时我们需要场景记载/卸载/变更时,进行一系列操作
这时我们需要用事件来完成通知

提示:
其中 0 号场景为: SampleScene
其中 1 号场景为: SampleScene2

    // 初始化函数
    void Start()
    {
        SceneManager.activeSceneChanged += SceneManager_activeSceneChanged; //订阅此事件可在活动场景发生更改时收到通知。
        StartCoroutine(SetActiveSceneEnumerator());                     //活动场景切换时,会收到通知,打印输出"活动场景变更了"
        SceneManager.sceneLoaded += SceneManager_sceneLoaded;           //委托 —— 加载场景时收到通知
        SceneManager.LoadSceneAsync(1);                                 //异步加载,加载方式:单一
        SceneManager.sceneUnloaded += SceneManager_sceneUnloaded;       //委托 —— 卸载Scene时收到通知
    }

    //设置场景为活动场景
    //必须要保证:目标场景被加载后,才可以正确设置活动状态
    IEnumerator SetActiveSceneEnumerator()
    {
        yield return SceneManager.LoadSceneAsync(1, LoadSceneMode.Additive); //等待场景加载完毕后,再向下执行
        SceneManager.SetActiveScene(SceneManager.GetSceneAt(1));             //设置场景为活动场景
    }

    // 活动场景变动时被调用
    private void SceneManager_activeSceneChanged(Scene arg0, Scene arg1)
    {
        print("活动场景变更了");
    }

    /// 场景被加载后,被调用
    private void SceneManager_sceneLoaded(Scene arg0, LoadSceneMode arg1)
    {
        print("场景被加载了");
    }

    // 场景被卸载时,被调用
    private void SceneManager_sceneUnloaded(Scene arg0)
    {
        print("场景被卸载了");
    }

你可能感兴趣的:(Unity基础(九)Application类与SceneManager)