最近在參與Unity游戲的客戶端開發,總結下整理游戲數據系統的構建及簡單的設計。
客戶端采用C#進行開發,C#托管語言在一定程度上大大減輕了程序員關於內存分配釋放的問題。
整個客戶端是由 數據+邏輯+渲染 組成的,而整個游戲的核心是由數據驅動的,游戲可以沒有渲染,但不能沒有數據及邏輯。這里簡單闡述一下關於整個游戲數據系統的設計,歡迎拍磚。
背景:
比如要構建出一個物品對象,物品有3個屬性,分別是 物品id,物品類型,物品名稱,當然這完全不夠,現在這個物品用於表示他是一個武器,提供了增加攻擊力的屬性,在傳統思路中需要有一個Item類,如下
1 public class Item 2 { 3 private uint m_id; //物品id 4 private string m_itemName; //物品名稱 5 private uint m_itemType; //物品類型 6 7 public uint m_id 8 { 9 get {return m_id;} 10 set {m_id = value;} 11 } 12 13 public string ItemName 14 { 15 get {return m_itemName;} 16 set {m_itemName = value;} 17 } 18 19 public uint ItemType 20 { 21 get{return m_itemType;} 22 set {m_itemType = value;} 23 } 24 }
武器也屬於物品類,可以繼承至Item,如下
1 public class Weapon:Item 2 { 3 private uint m_physicAttack; 4 5 public uint PhysicAttack 6 { 7 get {return m_physicAttack;} 8 set {m_physicAttack = value;} 9 } 10 }
現在問題來了,如果物品多一個屬性 如果是公共屬性直接在item里添加成員變量,並構造成屬性暴露到外部,提供外部訪問及設置值,但種類非常多,在程序里需要添加大量的成員變量,之后還得去控制相應每個成員之間的邏輯關系,而且有的數據要於服務器同步,久而久之,系統會非常臃腫,非常難維護,導致整個游戲開發難度越來越大。
因此這里提出並設計了一套動態屬性(Dynamic Property)的設計思想,將對象與屬性之前的聯系大大減少,非常靈活,動態屬性這套思想是參考CEGUI中的設計思路。
動態屬性系統,把數據及屬性盡最大的能力去依賴策划的配置,只把需要持久化的數據與服務器進行同步,這樣也大大減少也游戲的網絡通訊流量問題,在添加和減少屬性時,程序不需要去關心多了哪個屬性或減少了哪個屬性,整個過程都是自動的。
動態屬性的核心是每個數據對象繼承一個Dictionary,里面保存着屬性名及屬性的值。
動態屬性的組成:
1.屬性模板配置表
2.屬性模板對象
3.屬性工廠
4.屬性對象
5.通用數據類型
6.公式計算
7.屬性集對象
8.通用變化類型
具體的實現下次繼續,語文是體育老師教的,語言表達能力有限,有興趣的朋友可以留言。