基於Unity2019最新ECS架構開發MMO遊戲筆記9
官方ECS進階案例解析之場景切換器
開始之前的準備工作:
0下載Unity編輯器(2019.1.0f1 or 更新的版本),if(已經下載了)continue;
1下載官方案例,打開Git Shell輸入:
git clone https://github.com/Unity-Technologies/EntityComponentSystemSamples.git --recurse
or 點擊Unity官方ECS示例下載代碼
if(已經下載了)continue;
2用Unity Hub打開官方的項目:ECSSamples
3在Assets目錄下找到Tests/SceneSwitcher,並打開其下的SceneSwitcher場景
ECS進階:SceneSwitcher
場景切換器,顧名思義是用來切換場景的,這種功能很早就學會了。可是官方既然在這裏做了案例,是想表達ECS的場景切換和之前的有什麼不同嗎?一起來看看吧:
場景中僅有一個SceneSwitcher空對象,上面掛了一個SceneSwitcher腳本,看來只有打開腳本看看了:
/// <summary>
/// 場景切換器
/// </summary>
public class SceneSwitcher : MonoBehaviour
{
/// <summary>
/// 場景配置
/// </summary>
[Serializable]
public class SceneConfig
{
public string SceneName;//場景名稱
public int CustomDuration;//自定義持續時間
}
/// <summary>
/// 場景切換間隔
/// </summary>
public int SceneSwitchInterval = 5;
/// <summary>
/// 下次切換時間
/// </summary>
public float TimeUntilNextSwitch = 0.0f;
/// <summary>
/// 當前場景索引
/// </summary>
public int CurrentSceneIndex = 0;
/// <summary>
/// 是否已摧毀實體
/// </summary>
public bool EntitiesDestroyed = false;
/// <summary>
/// 場景配置
/// </summary>
public SceneConfig[] SceneConfigs;
// Use this for initialization
void Start ()
{
DontDestroyOnLoad(this);
LoadNextScene();
}
/// <summary>
/// 摧毀場景中的所有實體
/// </summary>
private void DestroyAllEntitiesInScene()
{
//1.獲取實體管理器
var entityManager = World.Active.EntityManager;
//2.獲取所有實體
var entities = entityManager.GetAllEntities();
//3.摧毀之
entityManager.DestroyEntity(entities);
//4.釋放實體管理器
entities.Dispose();
//5.已摧毀
EntitiesDestroyed = true;
}
/// <summary>
/// 加載下一個場景
/// </summary>
private void LoadNextScene()
{
//獲取在構建設置裏的場景數量
var sceneCount = SceneManager.sceneCountInBuildSettings;
var nextIndex = CurrentSceneIndex + 1;
if (nextIndex >= sceneCount)
{
Quit();
return;
}
var nextScene = SceneUtility.GetScenePathByBuildIndex(nextIndex);
TimeUntilNextSwitch = GetSceneDuration(nextScene);
CurrentSceneIndex = nextIndex;
SceneManager.LoadScene(nextIndex);
EntitiesDestroyed = false;
}
private int GetSceneDuration(string scenePath)
{
foreach (var scene in SceneConfigs)
{
if (!scenePath.EndsWith(scene.SceneName +".unity"))
continue;
if (scene.CustomDuration <= 0)
continue;
return scene.CustomDuration;
}
return SceneSwitchInterval;
}
private void Quit()
{
#if UNITY_EDITOR
UnityEditor.EditorApplication.isPlaying = false;
#else
Application.Quit();
#endif
}
// Update is called once per frame
void Update ()
{
TimeUntilNextSwitch -= Time.deltaTime;
if (TimeUntilNextSwitch > 0.0f)
return;
if (!EntitiesDestroyed)
{
DestroyAllEntitiesInScene();
}
else
{
DestroyAllEntitiesInScene();
LoadNextScene();
}
}
}
這個腳本邏輯非常簡單,加載實體場景的方式和咱們原來的用法一樣,都是使用SceneManager。
唯一值得注意的是要把上一個場景的實體全部摧毀,這個過場官方還沒有封裝到SceneManager裏面去,所有需要手動調用一下。我猜想Unity也許會重寫SceneManager來管理實體場景,畢竟改變要做得徹底才行,目前由於ECS的不完善,開發的時候是混合式的,也就是說實體和對象同時存在。所以這個階段比較尷尬,正處於新老兩代引擎過渡的時候,但也是思維模式轉換的最佳時期,我們可以很好的理解ECS,跟着Unity一起進化。
小結
場景切換流程大體如下:
更新計劃
作者的話
如果喜歡我的文章可以點贊支持一下,謝謝鼓勵!如果有什麼疑問可以給我留言,有錯漏的地方請批評指證!
如果有技術難題需要討論,可以加入開發者聯盟:566189328(付費羣)爲您提供有限的技術支持,以及,心靈雞湯!
當然,不需要技術支持也歡迎加入進來,隨時可以請我喝咖啡、茶和果汁!( ̄┰ ̄*)