ECS進階案:場景切換器

官方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一起進化。

小結

場景切換流程大體如下:

SceneManager
Start
LoadNextScene
LoadScene
Time.deltaTime
大於0.0f
<=0.0f
True
False
Update
TimeUntilNextSwitch
EntitiesDestroyed
DestroyAllEntitiesInScene
DestroyAllEntitiesInScene
LoadNextScene

更新計劃

Mon 12Mon 19Mon 261. ForEach 2. IJobForEach 3. IJobChunk 4. SubScene 5. SpawnFromMonoBehaviour 6. SpawnFromEntity 7. SpawnAndRemove 休息修正更新計劃參加表哥婚禮進階:FixedTimestepWorkaround進階:BoidExample初級:SceneSwitcher我是休息時間 資源整合 部署服務器 啓動流程 登錄流程 遊戲主世界 待計劃 待計劃 待計劃 待計劃 待計劃 我是休息時間 待計劃 待計劃 待計劃 待計劃 待計劃 我是休息時間 讀取Excel自動生成Entity 讀取Excel自動生成Component讀取數據庫自動生成Entity讀取數據庫自動生成ComponentESC LuaFrameWork Skynet DOTS 官方示例學習筆記 -----休息-----基於ECS架構開發MMO學習筆記LuaFrameWork學習筆記-----休息-----基於Skynet架構開發服務器學習筆記 製作代碼自動生成工具總結基於Unity2019最新ECS架構開發MMO遊戲筆記

作者的話

AltAlt

如果喜歡我的文章可以點贊支持一下,謝謝鼓勵!如果有什麼疑問可以給我留言,有錯漏的地方請批評指證!
如果有技術難題需要討論,可以加入開發者聯盟:566189328(付費羣)爲您提供有限的技術支持,以及,心靈雞湯!
當然,不需要技術支持也歡迎加入進來,隨時可以請我喝咖啡、茶和果汁!( ̄┰ ̄*)

ECS系列目錄

ECS官方示例1:ForEach

ECS官方案例2:IJobForEach

ECS官方案例3:IJobChunk

ECS官方案例4:SubScene

ECS官方案例5:SpawnFromMonoBehaviour

ECS官方案例6:SpawnFromEntity

ECS官方案例7:SpawnAndRemove

ECS進階:FixedTimestepWorkaround

ECS進階:Boids

ECS進階:場景切換器

ECS進階:MegaCity0

ECS進階:MegaCity1

UnityMMO資源整合&服務器部署

UnityMMO選人流程

UnityMMO主世界

發佈了37 篇原創文章 · 獲贊 30 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章