1. 程式人生 > >《爐石傳說》架構設計賞析(6):卡牌 & 技能資料的執行時組織

《爐石傳說》架構設計賞析(6):卡牌 & 技能資料的執行時組織

前一篇文章我們看到了《爐石傳說》的核心卡牌資料的儲存,今天我們繼續探索卡牌&技能。微笑


主要的類

通過之前的分析,卡牌&技能涉及到幾個類體系: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()來進行資源載入;

卡牌&技能的載入流程

  Entity的建立,以及Card、Spell的載入,都由網路訊息觸發;整個過程比較複雜,主要是有很多非同步回撥,比較難用文字描述,請見下圖: