活動場景
用腳本實例化的游戲?qū)ο蠖紩稍诨顒訄鼍爸小?/p>
哪個場景是活動場景,則當前的天空盒就會使用該場景的天空盒。
只能有一個場景是活動場景。
在Hierarchy右擊一個場景,點擊“Set Active Scene”可以手動把這個場景設置為活動場景。也可以使用SceneManager.SetActiveScene方法把一個加載了的場景設置為活動場景。
異步加載
AsyncOperation相關(guān)的代碼應寫在一個協(xié)同程序中。
AsyncOperation 對象名=SceneManager.LoadSceneAsync(string 場景名)
開啟異步加載場景,并把異步加載的信息存儲在AsyncOperation型對象中。
AsyncOperation型對象.allowSceneActivation
返回bool型,表示是否允許在場景加載完畢后立即激活該場景。
值為true表示一旦該場景異步加載完畢,則會立即激活該場景。
值為false表示即使加載場景完畢也不會激活該場景,直到用代碼再次把這個變量的值改為true,才會激活該場景。
AsyncOperation型對象.progress
返回float型,范圍是0-1。表示異步加載的進度,開始是0,完成時是1
注意:當AsyncOperation型變量.allowSceneActivation的值為false,這個參數(shù)的值最多會卡在0.9,直到AsyncOperation型變量.allowSceneActivation的值變?yōu)閠rue,這個參數(shù)的值才會變?yōu)?
AsyncOperation型對象.isDone
返回bool型。表示該異步加載是否完成。如果完成,則值為true,如果未完成,則值為false。
當AsyncOperation型對象.progress的值為1時,此時這個變量的值才為true,但這樣就會激活新的新場景,一般很難觀測到AsyncOperation型對象.isDone是true
AsyncOperation型對象.priority
返回int型,用于設置異步操作的優(yōu)先級。
當有多個異步操作排隊時,將優(yōu)先執(zhí)行更高優(yōu)先級的異步操作。但如果異步操作在后臺線程上啟動, 則更改優(yōu)先級沒有任何效果。
AsyncOperation.completed
這個是一個有一個AsyncOperation型參數(shù)的Action事件。該AsyncOperation型參數(shù)存儲了本次異步加載的信息。
當異步加載完成,也就是AsyncOperation型對象.isDone的值為true時,會執(zhí)行一次這個事件。
?
LoadSceneManager? 代碼
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.Events;
/// <summary>
/// 切換場景的管理器
/// </summary>
public class LoadSceneManager : SingletonPatternBase<LoadSceneManager>
{
/// <summary>
/// 重新切換當前場景
/// </summary>
public void LoadActiveScene()
{
SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex);
}
/// <summary>
/// 切換到下一個場景,是否場景循環(huán),最后一個場景切換是切換為第一個場景
/// </summary>
public void LoadNextScene(bool isCyclical=false)
{
int buildIndex = SceneManager.GetActiveScene().buildIndex + 1;
//檢測要切換的新場景的下標是否越界 這個參數(shù)的意思是BuildSettings中的場景總數(shù)
if (buildIndex > SceneManager.sceneCountInBuildSettings-1)
{
if (isCyclical)
buildIndex = 0;
else
{
Debug.LogWarning($"加載場景失??!要加載的場景的索引是{buildIndex},越界了");
return;
}
}
SceneManager.LoadScene(buildIndex);
}
/// <summary>
/// 加載上一個場景,包括可選擇的場景循環(huán)功能
/// </summary>
public void LoadPreviousScene(bool isCyslical=false)
{
int buildIndex = SceneManager.GetActiveScene().buildIndex - 1;
if (buildIndex < 0)
{
if (isCyslical)
{
buildIndex = SceneManager.sceneCountInBuildSettings - 1;
}
else
{
Debug.LogWarning($"加載場景失敗!要加載的場景索引是{buildIndex},越界了!");
return;
}
}
SceneManager.LoadScene(buildIndex);
}
/// <summary>
/// 異步加載場景 根據(jù)名字來切換場景
/// </summary>
public void LoadSceneAsync(string sceneName, UnityAction<float> loading = null,
UnityAction<AsyncOperation> completed = null, bool setActiveAfterCompleted = true, LoadSceneMode mode = LoadSceneMode.Single)
{
MonoManager.Instance.StartCoroutine(LoadSceneCoroutine(sceneName, loading, completed, setActiveAfterCompleted, mode));
}
IEnumerator LoadSceneCoroutine(string sceneName, UnityAction<float> loading = null,
UnityAction<AsyncOperation> completed = null, bool setActiveAfterCompleted = true, LoadSceneMode mode = LoadSceneMode.Single)
{
//開始加載資源
AsyncOperation asyncOperation = SceneManager.LoadSceneAsync(sceneName, mode);
asyncOperation.allowSceneActivation = false; //資源加載最多到0.9
//等待資源加載完畢
while (asyncOperation.progress < 0.9f)
{
loading?.Invoke(asyncOperation.progress);
yield return null;
}
//當asyncOperation.allowSceneActivation 為false,則asyncOperation.Progress最多只能到達0.9
//我們?nèi)藶榘阉鼈儨惓?,可以方便外部進度條的顯示
loading?.Invoke(1);
asyncOperation.allowSceneActivation = setActiveAfterCompleted;
//加載資源完畢后執(zhí)行的邏輯
completed?.Invoke(asyncOperation);
}
/// <summary>
/// 異步加載場景 根據(jù)索引來切換場景
/// </summary>
public void LoadSceneAsync(int sceneIndex,UnityAction<float>loading=null,
UnityAction completed = null,bool setActiveAfterCompleted=true, LoadSceneMode mode = LoadSceneMode.Single)
{
MonoManager.Instance.StartCoroutine(LoadSceneCoroutine(sceneIndex,loading, completed,setActiveAfterCompleted, mode));
}
IEnumerator LoadSceneCoroutine(int sceneIndex, UnityAction<float> loading = null,
UnityAction completed = null, bool setActiveAfterCompleted = true, LoadSceneMode mode = LoadSceneMode.Single)
{
//開始加載資源
AsyncOperation asyncOperation = SceneManager.LoadSceneAsync(sceneIndex, mode);
asyncOperation.allowSceneActivation = false; //資源加載最多到0.9
//等待資源加載完畢
while (asyncOperation.progress < 0.9f)
{
loading?.Invoke(asyncOperation.progress);
yield return null;
}
//當asyncOperation.allowSceneActivation 為false,則asyncOperation.Progress最多只能到達0.9
//我們?nèi)藶榘阉鼈儨惓?,可以方便外部進度條的顯示
loading?.Invoke(1);
asyncOperation.allowSceneActivation = setActiveAfterCompleted;
//加載資源完畢后執(zhí)行的邏輯
completed?.Invoke();
}
}
測試腳本
[MenuItem("我的菜單/同步切換場景/重新切換到上一個場景")]
static void Method3()
{
LoadSceneManager.Instance.LoadPreviousScene();
}
[MenuItem("我的菜單/異步切換場景/重新切換到場景1")]
static void Method4()
{
LoadSceneManager.Instance.LoadSceneAsync("New Scene 1", (obj) =>
{
Debug.Log("加載進度是:" + obj * 100 + "%");
}, (obj) =>
{
Debug.Log("加載完成了!");
});
}
Unity Scene類(場景類)
Scene類的對象用來存儲場景的信息。
Scene型對象.buildIndex
返回int型,表示該場景在Build Settings窗口中的索引。
如果該場景是無效的場景,則這個變量的值為-1
如果該場景是通過AssetBundle加載的場景,則這個變量的值也為-1
Scene型對象.isDirty
返回bool型,表示該場景是否被修改了。
當我們在編輯器模式下修改了某一個場景,但是沒有保存,則此時這個變量的值為true。一旦該場景保存了,則這個變量的值為false
Scene型對象.isLoaded
如果該場景已經(jīng)加載了,則返回true。如果該場景還沒有加載或沒有加載完成,則返回false
Scene型對象.name
返回string型,表示該場景的名字,結(jié)尾不包含后綴.unity
也就是它在Project窗口中的名字。
注意:該場景必須已經(jīng)加載了,這個變量才能正確返回它的場景名。如果該場景還沒有加載或沒有加載完成,則返回的值是"Null"
Scene型對象.path
返回string型,表示該場景的路徑,結(jié)尾包含后綴.unity
例如:
Assets/AssetBundleAssets/Scenes/TestScenes/Test.unity
Scene型對象.rootCount
返回int型,表示該場景中所有根游戲?qū)ο笊砩系腡ransform組件的總數(shù)。
Scene型對象.GetRootGameObjects
返回GameObject[]型,表示該場景中所有根游戲?qū)ο蟆?br> 隱藏的根游戲?qū)ο笠矔谄渲?,但是DontDestoryOnLoad的根游戲?qū)ο蟛粫谄渲小?/p>
Scene型對象.IsValid
如果一個場景是存在的,它就是有效場景,這個變量的值就為true
如果一個場景是不存在的,它就是無效場景,這個變量的值就為false
注意:從EditorSceneManager.OpenScene返回的場景的 IsValid 的值是 false
兩個場景對象之間可以使用運算符!=
如果這兩個場景不同,則返回true,否則返回false
兩個場景對象之間可以使用運算符==
如果這兩個場景相同,則返回true,否則返回false
Unity SceneManager類(場景管理器,用于加載場景、切換場景)
首先把要跳轉(zhuǎn)的場景都拖進File——Build Settings中
必須先引入命名空間:using UnityEngine.SceneManagement;
SceneManager.sceneCount
當前已經(jīng)加載的場景的數(shù)量。
SceneManager.sceneCountInBuildSettings
已經(jīng)添加到Build Settings窗口中的場景的數(shù)量。
如果在編輯器模式下,則進入播放模式之前已經(jīng)打開的場景也會包含在內(nèi),如果它沒有手動拖到Build Settings窗口,則它在Build Settings窗口中也是有索引的,只是我們看不到,這個索引比可以看得到的最大1。
SceneManager.CreateScene(int 場景名)
創(chuàng)建一個空場景,這個空場景會疊加到當前場景。
如果創(chuàng)建的場景名重復,則會報錯。
場景名可以在Hierarchy窗口看到。
如果要在編輯時創(chuàng)建場景,例如在創(chuàng)建編輯器腳本或工具時需要創(chuàng)建場景,則應使用EditorSceneManager.NewScene
SceneManager.CreateScene(string 場景名,CreateSceneParameters 創(chuàng)建場景的各種參數(shù))
創(chuàng)建一個空場景,這個場景會疊加到當前場景。
如果創(chuàng)建的場景名重復,則會報錯。
場景名可以在Hierarchy窗口看到。
如果要在編輯時創(chuàng)建場景,例如在創(chuàng)建編輯器腳本或工具時需要創(chuàng)建場景,則應使用EditorSceneManager.NewScene
SceneManager.GetActiveScene()
返回Scene型對象,表示當前場景的信息。
SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex);
使用同步的方式,重新切換到當前場景。
SceneManager.GetActiveScene().buildIndex+1表示下一個場景在Build Settings窗口中的索引。
SceneManager.GetActiveScene().name
string型。表示當前場景的名字??梢耘浜蟂ceneManager.LoadScene使用,重新加載當前場景
SceneManager.GetSceneAt(int 索引)
在當前已加載的場景的列表中,返回指定索引的場景的信息。
索引必須大于等于0,最小為0。如果為負數(shù),或者索引越界,則會報錯。
SceneManager.GetSceneByBuildIndex(int 場景在Build Settings窗口中的索引)
根據(jù)傳入的索引,返回Build Settings中的場景的信息。
該場景必須在Build Settings窗口中,且當前已經(jīng)加載,這樣才會返回它的信息。否則會返回一個無效的Scene型對象。
索引必須大于等于0,最小為0。如果為負數(shù),或者索引越界,則會報錯。
SceneManager.GetSceneByName(string 場景名)
在當前已經(jīng)加載的場景中,查找指定場景名的場景。
如果找到了,則返回一個Scene對象,表示這個場景的信息。如果找不到,則返回一個無效的Scene對象。
場景名可以是Build Settings窗口中所示名稱的最后一部分,在這種情況下,將返回第一個匹配的場景信息。
場景名也可以是Build Settings窗口中顯示的路徑,在這種情況下,將返回精確匹配到的場景信息。
場景名不區(qū)分大小寫。
場景名一定不得包含.unity擴展名。
SceneManager.GetSceneByPath(string 場景的路徑)
在當前已經(jīng)加載的場景中,查找具有指定資源路徑的場景。
如果找到了,則返回一個Scene對象,表示這個場景的信息。如果找不到,則返回一個無效的Scene對象。
場景的路徑應是項目文件夾的相對路徑,例如:“Assets/MyScenes/MyScene.unity”
SceneManager.LoadScene(int 場景在Build Settings窗口中的索引,LoadSceneMode 加載場景的模式);
? ? ? ? 同步加載指定索引的場景。
? ? ? ? 第一個參數(shù)可以使用string型,這樣就會根據(jù)場景名或者場景路徑來加載指定的場景。此時這個名字的場景要么提前放到Build Settings窗口中,要么之前已經(jīng)用了AssetBundle加載,這樣一來這個方法才會有效。如果都沒有,則會報錯。注意:場景名不包含.unity的后綴。還有,場景名不要重名,如果重名,則會加載匹配到的第一個場景??梢允褂脠鼍奥窂剑纾篈ssets/AssetBundleAssets/Scenes/TestScenes/Scene1.unity
? ? ? ? 如果第二個參數(shù)使用LoadSceneMode.Single,則加載完畢后,會自動切換到該場景。原來場景會被卸載。默認就是使用這個。
? ? ? ? 如果第二個參數(shù)使用LoadSceneMode.Additive,則加載完畢后,該場景會疊加到原來的場景中。原來的場景不會被卸載,且活動場景依然是原來的場景。
? ? ? ? 使用此方法加載場景,不會立即加載,而是會在下一幀才開始加載。而且由于此方法是同步的,所以可能會出現(xiàn)卡頓現(xiàn)象,建議使用異步加載的LoadSceneAsync方法。
SceneManager.LoadSceneAsync(int 場景在Build Settings窗口中的索引,LoadSceneMode 加載場景的模式);
? ? ? ? 異步加載指定索引的場景。
? ? ? ? 第一個參數(shù)可以使用string型,這樣就會根據(jù)場景名或場景路徑來加載指定的場景。此時這個名字的場景要么提前放到Build Settings窗口中,要么之前已經(jīng)用了AssetBundle加載,這樣一來這個方法才會有效。如果都沒有,則會報錯。注意:場景名不包含.unity的后綴。還有,場景名不要重名,如果重名,則會加載匹配到的第一個場景??梢允褂脠鼍奥窂剑纾篈ssets/AssetBundleAssets/Scenes/TestScenes/Scene1.unity
? ? ? ? 如果第二個參數(shù)使用LoadSceneMode.Single,則加載完畢后,可以切換到該場景,那么原來場景會被卸載。默認就是使用這個。
? ? ? ? 如果第二個參數(shù)使用LoadSceneMode.Additive,則加載完畢后,該場景可以疊加到原來的場景中。原來的場景不會被卸載,且活動場景依然是原來的場景。
? ? ? ? 使用此方法加載場景不會卡住游戲,往往配合場景中的進度條來使用,可以一邊加載場景,一邊控制進度條的推進。
? ? ? ? 這個方法的返回值類型的是AsyncOperation類型,可以根據(jù)這個類型的對象來判斷異步加載是否完成。具體可以參考AsyncOperation類。
SceneManager.MergeScenes(Scene 場景1,Scene 場景2)
將場景1的所有游戲?qū)ο笕哭D(zhuǎn)移到場景2,且場景1會被卸載掉。
一般在加載場景時,使用了LoadSceneMode.Additive來加載,才可能會使用這個方法。
場景1和場景2都必須是已加載的場景。
如果原來的場景1是活動場景,這樣它被卸載掉之后,Hierarchy窗口中最上面的第一個場景就會變成活動場景。
如果原來的場景1不是活動場景,這樣它被卸載掉之后,活動場景不變。
SceneManager.MoveGameObjectToScene(GameObject 要移動的游戲?qū)ο?Scene 移動到場景)
將一個游戲?qū)ο髲乃诘膱鼍耙苿拥侥繕藞鼍爸小?br> 一般在加載場景時,使用了LoadSceneMode.Additive來加載,才可能會使用這個方法。
要移動到的場景必須是已加載的場景。
如果要移動的游戲?qū)ο鬄閚ull,則本方法無效。
如果移動到的場景沒有加載完成,或者是無效的場景,則會報錯。
SceneManager.SetActiveScene(Scene 場景名)
將指定的場景設置為活動場景。
SceneManager.UnloadSceneAsync(int 場景在Build Settings窗口中的索引)
SceneManager.UnloadSceneAsync(string 場景名或場景路徑)
SceneManager.UnloadSceneAsync(Scene 場景對象)
SceneManager.UnloadSceneAsync(int 場景在Build Settings窗口中的索引,UnloadSceneOptions 卸載場景的選項)
SceneManager.UnloadSceneAsync(string 場景名或場景路徑,UnloadSceneOptions 卸載場景的選項)
SceneManager.UnloadSceneAsync(Scene 場景對象,UnloadSceneOptions 卸載場景的選項)
銷毀指定的場景和這個場景中的所有游戲?qū)ο蟆?br> 本方法只對加載時用了LoadSceneMode.Additive所加載的場景有效。如果當前游戲中只有一個場景,則本方法無效,控制臺會報黃色的警告。
本方法不會卸載內(nèi)存中的場景資源,如果要釋放資源,應在調(diào)用這個方法后,再調(diào)用Resources.UnloadUnusedAssets方法
返回值的類型是AsyncOperation類型,可以根據(jù)這個對象來確定異步操作是否完成。
SceneManager.activeSceneChanged
UnityAction<Scene,Scene>型的事件。
當活動場景發(fā)生變化時,會執(zhí)行一次這個事件。
第一個參數(shù)表示原來的活動場景,第二個參數(shù)表示后來的活動場景。
SceneManager.sceneLoaded
UnityAction<Scene,LoadSceneMode>型的事件。
每當有新的場景被加載時,會執(zhí)行一次這個事件。
第一個參數(shù)表示加載的新的場景,第二個參數(shù)表示這個場景加載的模式。文章來源:http://www.zghlxwxcb.cn/news/detail-667194.html
SceneManager.sceneUnloaded
UnityAction<Scene>型的事件。
每當有場景被卸載時,會執(zhí)行一次這個事件。
參數(shù)表示卸載的場景對象。文章來源地址http://www.zghlxwxcb.cn/news/detail-667194.html
到了這里,關(guān)于Unity框架學習--場景切換管理器的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!