【ET8】2.ET8入門-ET框架解析

菜單欄相關:ENABLE_DLL選項

ET->ChangeDefine->ADD_ENABLE_DLL/REMOVE_ENABLE_DLL

一般在開發階段使用Editor時需要關閉ENABLE_DLL選項。該選項關閉時,修改腳本之后,會直接重新編譯所有的代碼,Editor在運行時會直接使用最新的程序集。如果ENABLE_DLL選項是開啟的,框架啟動后會加載之前生成的程序集文件(這個文件需要在ET->BuildTool界面生成),導致每次需要應用修改,都要重新生成程序集文件。

框架解析

框架入口解析

啟動流程如下

入口文件為Init,之后調用CodeLoader對代碼進行加載
如果不是EnableDll模式則直接加載程序集。否則通過AB加載文件,之后調用LoadHotfix函數
LoadHotfix會加載程序集,并且調用EventSystem,根據特性注冊對應事件的監聽。
之后調用ET.Entry的Start方法。
ET.Entry.Start 進行初始化之后,調用FiberManager.Instance.Create

調用FiberInit事件,推送對應的EntryEvent事件
推送EntryEvent3,EntryEvent3_InitClient接收后推送AppStartInitFinish
AppStartInitFinish_CreateLoginUI接收該事件后,創建UI場景


UI系統

UI界面的生成流程

ET是通過異步方式創建UI,如下方例子,調用UIHelper.Create方法,指定創建UI的場景,UI類型和對應的層級

? ? ? ? protected override async ETTask Run(Scene scene, EventType.AppStartInitFinish args){await UIHelper.Create(scene, UIType.UILogin, UILayer.Mid);}

調用scene掛載的UIComponent組件,處理Create事件

? ? ? ? public static async ETTask<UI> Create(Scene scene, string uiType, UILayer uiLayer){return await scene.GetComponent<UIComponent>().Create(uiType, uiLayer);}

之后會標記有對應UIEvent特性的類,處理該事件,開始加載資源并生成對應的GameObject

    [UIEvent(UIType.UILogin)]public class UILoginEvent: AUIEvent{public override async ETTask<UI> OnCreate(UIComponent uiComponent, UILayer uiLayer){await uiComponent.DomainScene().GetComponent<ResourcesLoaderComponent>().LoadAsync(UIType.UILogin.StringToAB());GameObject bundleGameObject = (GameObject) ResourcesComponent.Instance.GetAsset(UIType.UILogin.StringToAB(), UIType.UILogin);GameObject gameObject = UnityEngine.Object.Instantiate(bundleGameObject, UIEventComponent.Instance.GetLayer((int)uiLayer));UI ui = uiComponent.AddChild<UI, string, GameObject>(UIType.UILogin, gameObject);ui.AddComponent<UILoginComponent>();return ui;}public override void OnRemove(UIComponent uiComponent){ResourcesComponent.Instance.UnloadBundle(UIType.UILogin.StringToAB());}}

UI組件解析

以UILogin為例子,對應的Prefab實際上只掛載了ReferenceCollector,ReferenceCollector負責將結點進行綁定

生成該GameObject之后,調用AddComponent

    [UIEvent(UIType.UILogin)]public class UILoginEvent: AUIEvent{public override async ETTask<UI> OnCreate(UIComponent uiComponent, UILayer uiLayer){string assetsName = $"Assets/Bundles/UI/Demo/{UIType.UILogin}.prefab";GameObject bundleGameObject = await uiComponent.Scene().GetComponent<ResourcesLoaderComponent>().LoadAssetAsync<GameObject>(assetsName);GameObject gameObject = UnityEngine.Object.Instantiate(bundleGameObject, uiComponent.UIGlobalComponent.GetLayer((int)uiLayer));UI ui = uiComponent.AddChild<UI, string, GameObject>(UIType.UILogin, gameObject);ui.AddComponent<UILoginComponent>();return ui;}public override void OnRemove(UIComponent uiComponent){}}

其中UILoginComponent負責顯示對應成員

[ComponentOf(typeof(UI))]
public class UILoginComponent: Entity, IAwake
{public GameObject account;public GameObject password;public GameObject loginBtn;
}

AddComponent之后,會調用對應的System,這里UILoginComponentSystem就是對應的System,在Awake階段通過ReferenceCollector對UILoginComponent進行了綁定,以及實現了對應的UI邏輯

[ObjectSystem]
public class UILoginComponentAwakeSystem : AwakeSystem<UILoginComponent>
{protected override void Awake(UILoginComponent self){ReferenceCollector rc = self.GetParent<UI>().GameObject.GetComponent<ReferenceCollector>();self.loginBtn = rc.Get<GameObject>("LoginBtn");self.loginBtn.GetComponent<Button>().onClick.AddListener(()=> { self.OnLogin(); });self.account = rc.Get<GameObject>("Account");self.password = rc.Get<GameObject>("Password");}
}

場景切換

關于ET的場景切換相關邏輯可以查看

UILobbyComponentSystem處理進入Map的操作,先是調用EnterMap異步函數,等待EnterMapHelper異步返回后刪除界面

? ? ? ? //UILobbyComponentSystempublic static async ETTask EnterMap(this UILobbyComponent self){await EnterMapHelper.EnterMapAsync(self.ClientScene());await UIHelper.Remove(self.ClientScene(), UIType.UILobby);}

之后EnterMapHelper會向服務器發起進入Map的請求

? ? ? ? //EnterMapHelperpublic static async ETTask EnterMapAsync(Scene clientScene){try{G2C_EnterMap g2CEnterMap = await clientScene.GetComponent<SessionComponent>().Session.Call(new C2G_EnterMap()) as G2C_EnterMap;clientScene.GetComponent<PlayerComponent>().MyId = g2CEnterMap.MyId;// 等待場景切換完成await clientScene.GetComponent<ObjectWait>().Wait<Wait_SceneChangeFinish>();EventSystem.Instance.Publish(clientScene, new EventType.EnterMapFinish());}catch (Exception e){Log.Error(e);} ? ? ??}


?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/209556.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/209556.shtml
英文地址,請注明出處:http://en.pswp.cn/news/209556.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

免費網頁抓取工具大全【附下載和工具使用教程】

在當今信息爆炸的時代&#xff0c;獲取準確而豐富的數據對于企業決策和個人研究至關重要。而網頁抓取工具作為一種高效獲取互聯網數據的方式&#xff0c;正逐漸成為大家解決數據需求的得力助手。本文將深入探討網頁抓取工具的種類&#xff0c;并為大家提供簡單實用的頁面采集教…

(企業項目)SpringBoot3整合校驗框架validation

在Spring Boot項目中使用校驗框架validation可以讓我們更方便地實現數據校驗和錯誤提示。下面是Spring Boot集成校驗框架validation的步驟。 添加依賴 在項目的pom.xml文件中添加validation依賴&#xff1a; <dependency><groupId>org.springframework.boot</…

C# 實現Lru緩存

C# 實現Lru緩存 LRU 算法全稱是最近最少使用算法&#xff08;Least Recently Use&#xff09;&#xff0c;是一種簡單的緩存策略。 通常用在對象池等需要頻繁獲取但是又需要釋放不用的地方。 代碼實現的基本原理就是使用鏈表&#xff0c;當某個元素被訪問時&#xff08;Get或…

windows安裝protoc、protoc-gen-go、protoc-gen-go-grpc

文章目錄 一、 protoc二、protoc-gen-go三、protoc-gen-go-grpc 一、 protoc 1&#xff0c;下載&#xff1a;https://github.com/google/protobuf/releases 下載對應的protoc&#xff0c;注意選擇windows 2&#xff0c;下好之后解壓就行&#xff0c;然后把bin目錄加入到環境…

【異常】淺析異常體系及為什么一定會執行finally塊代碼

異常體系&#xff1a; &#xff08;1&#xff09;所有異常&#xff08;Exception&#xff09;、錯誤&#xff08;Error&#xff09;都繼承自異常中的基類&#xff1a;Throwable。而異常又可以分為檢查異常&#xff08;Checked Exception&#xff09;、非檢查異常&#xff08;Un…

msvcp100.dll丟失的常見原因/msvcp100.dll丟失的解決方法分享

在計算機使用過程中&#xff0c;我們經常會遇到一些錯誤提示&#xff0c;其中之一就是“msvcp100.dll丟失”。這個錯誤提示通常出現在運行某些程序或游戲時&#xff0c;給使用者帶來了很大的困擾。那么&#xff0c;究竟是什么原因導致了msvcp100.dll文件的丟失呢&#xff1f;本…

ubuntu22.04在opencv4的基礎上安裝opencv3

安裝opencv4 首先在ubuntu22.04上安裝opencv4&#xff0c;可以參考之前的博客ubuntu22.04安裝opencv4和opencv_contrib-CSDN博客 安裝opencv3 由于有使用opencv3的需求&#xff0c;所以需要繼續安裝opencv3 ; 安裝編譯 這里安裝的版本是opencv3.4.5&#xff0c;大致安裝思…

STM32F1之CAN介紹

目錄 ?編輯 1. CAN 是什么&#xff1f; 2. 總線拓撲圖 3. CAN 的特點 4. CAN 協議的基本概念 1. CAN 是什么&#xff1f; CAN 是 Controller Area Network 的縮寫&#xff08;以下稱為 CAN&#xff09;&#xff0c;是 ISO*1 國際標準化的串行通信協議。 在當前的汽車產…

javaWebssh學生系統myeclipse開發mysql數據庫MVC模式java編程計算機網頁設計

一、源碼特點 java ssh學生管理系統是一套完善的web設計系統&#xff08;系統采用ssh框架進行設計開發&#xff09;&#xff0c;對理解JSP java編程開發語言有幫助&#xff0c;系統具有完整的源代碼和數據庫&#xff0c;系統主要采用B/S模 式開發。開發環境為TOMCAT7.0,My…

前端開發中,Web Storage的存儲數據的方法localstorage和sessionStorage的使用及區別

在 Web瀏覽器中存儲數據以改善用戶體驗和提升Web應用程序性能是非常常見的。在大多數情況下&#xff0c;可供我們使用就是LocalStorage和SessionStorage。 本文中&#xff0c;我們將會從安全性和用戶體驗兩個方面對SessionStorage和LocalStorage進行評估。然后我們將討論如何根…

Linux驅動安裝遇到的問題(Kernel configuration is invalid)(Invalid module format)

Linux驅動編譯安裝遇到的問題&#xff08;Kernel configuration is invalid&#xff09;&#xff08;Invalid module format&#xff09; 前言1. Kernel configuration is invalid2. Invalid module format2.1 第一種情況&#xff1a;內核模塊編譯的環境與現在insmod想要運行的…

python:mplfinance 畫K線圖+布林線

pip install mplfinance ; python 安裝使用 TA-lib 安裝主要在 http://www.lfd.uci.edu/~gohlke/pythonlibs/ 這個網站找到 TA_Lib-0.4.24-cp310-cp310-win_amd64.whl pip install /pypi/TA_Lib-0.4.24-cp310-cp310-win_amd64.whl 編寫 mpf_kline_boll.py 如下 # -*- cod…

英語口語練習(背誦老友記)

There is nothing to tell! 這沒什么好說的&#xff01; Hes just some guy I work with. 他不過是我的同事。 Cmon, youre going out with the guy! 少來了&#xff0c;你們都在約會了&#xff01; Theres gotta be something wrong with him! 這個男人一定有什么問題&…

華為OD機試真題-快遞員的煩惱-2023年OD統一考試(C卷)

題目描述: 快遞公司每日早晨,給每位快遞員推送需要送到客戶手中的快遞以及路線信息,快遞員自己又查找了一些客戶與客戶之間的路線距離信息,請你依據這些信息,給快遞員設計一條最短路徑,告訴他最短路徑的距離。 注意: 1. 不限制快遞包裹送到客戶手中的順序,但必須保證都…

【VRTK】【VR開發】【Unity】12-占位身體

課程配套學習資源下載 https://download.csdn.net/download/weixin_41697242/88485426?spm=1001.2014.3001.5503 【概要】 目前你會發現,就算存在非Trigger Collider的墻壁屏障等,也能夠正常穿過,這會導致不沉浸的體驗。你需要一個占位身體來實現讓墻壁等碰撞并擋住自己…

基于java的貪吃蛇小游戲

貪吃蛇游戲需要做兩點&#xff1a;圖形界面和游戲邏輯。在 Java 中&#xff0c;可以使用 Swing 或 JavaFX 來創建圖形界面。下面代碼創建了一個簡單的 Swing 窗口&#xff0c;實現了一個基本的貪吃蛇游戲。在游戲中&#xff0c;使用方向鍵控制貪吃蛇的移動&#xff0c;吃到食物…

`Numpy`數組中 數據的修改(第10講)

Numpy數組中 數據的修改(第10講) ??????? ??博主 侯小啾 感謝您的支持與信賴。?? ????????????????????????????????????????????????????????????????????????????????????…

YOLOv5獨家原創改進:SPPF自研創新 | 可變形大核注意力(D-LKA Attention),大卷積核提升不同特征感受野的注意力機制

??????本文自研創新改進: 可變形大核注意力(D-LKA Attention)高效結合SPPF進行二次創新,大卷積核提升不同特征感受野的注意力機制。 收錄 YOLOv5原創自研 https://blog.csdn.net/m0_63774211/category_12511931.html ??????全網獨家首發創新(原創),適合p…

Python學習路線 - Python語言基礎入門 - 函數使用

Python學習路線 - Python語言基礎入門 - 函數使用 函數介紹函數函數的快速體驗 函數的定義函數的定義 函數的參數函數的傳入參數函數的傳入參數 - 傳參定義函數的傳入參數 - 語法解析練習案例&#xff1a;升級版自動查詢核酸 函數的返回值函數返回值的定義返回值的語法None類型…

Python----異常

1、什么是異常 當檢測到一個錯誤時&#xff0c;解釋器就無法繼續執行了&#xff0c;反而出現了一些錯誤的提示&#xff0c;這就是所謂的"異常"。 2、異常演示 # 運算符 # print(10/0) # 文件異常 f open(python.txt, r) content f.readlines() print(content) 3…