《爐石傳說》架構設計賞析(6):卡牌 & 技能資料的執行時組織
阿新 • • 發佈:2018-11-16
前一篇文章我們看到了《爐石傳說》的核心卡牌資料的儲存,今天我們繼續探索卡牌&技能。
主要的類
通過之前的分析,卡牌&技能涉及到幾個類體系:Entity,Actor,Card,Spell,令人十分困惑,特別是前兩者。在這裡先略帶武斷的說一下這幾個類的基本定位:- Entity主要用來做網路資料同步用的;
- Actor主要處理客戶端的渲染物件的控制,作為Component掛載在資源物件上;
- Spell是技能Prefab掛載的指令碼;
- Card是卡牌Prefab掛載的指令碼,在執行時處於中心地位,處理前3者的聯絡。
Entity
- Entity是通過網路資料建立的,主要是Network.PacketID.POWER_HISTORY這個訊息。詳見GameState.CreateNewEntities()函式。因為Entity並不是MonoBehavior派生類,所以是new出來的,然後新增到GameState中管理(GameState.AddEntity()),網路傳來的Entity資料主要是Tags(每個Tag是一個name->value對),然後呼叫Entity.InitEntity();
Actor
- Actor也是一種資源,通過AssetLoader.LoadActor()載入;
- 對應於AssetFamily.Actor;
- 對應的資源包為“actor?.unity3d”,包內的為GameObject;
- Actor的載入入口是在:Card.DetermineActorThenTransitionToZone()
Spell
- Spell的載入入口是在Entity.ProcessCardDefAssetRequest()
Card
- 在InitEntity中呼叫了Entity.InitCard(),它做的工作只是建立一個空的GameObject,然後使用AddComponent把Card新增上去。
- 真正的卡牌Prefab載入是在Entity.LoadCard()中進行的,這個函式是在處理PowerTask時GameState.OnShowEntity()中呼叫的;
- 具體的載入操作是通過 DefLoader.LoadCardDef()進行的,其內部再呼叫AssetLoader.LoadCardPrefab()來進行資源載入;