戰鬥屬性設計

戰鬥屬性設計

修改時間

文章可能會隨時修改,慢慢完善。
2018-12-14 14:20

前言

遊戲中的角色屬性是一個很寬泛的概念,在不同的上下文中有不同的意思。
有人喜歡將角色所有屬性都統一管理,也有人喜歡將屬性進行分類管理。
在這裏我們屬於後者,在這篇文章中我們談論的是戰鬥屬性。

同一種戰鬥屬性的值,可能是由多個部分組成的,比如"攻擊"屬性值來自於角色等級基礎屬性、裝備、任務成就等。
戰鬥屬性值在變化時,都是嚴格按照加減法計算的,變化原因都是受屬性加成影響。
舉個例子,戰鬥屬性可能有:“攻擊”、“防禦”、“命中”、“暴擊”、"最大生命值"等。
"當前生命值"不屬於這類屬性。

屬性存取

大致有三種方式來存取這類屬性:

  1. 每個屬性對應一個字段。
  2. 使用數組來存取所有屬性。
  3. 使用map來存取所有屬性。

在使用第2種或第3種方式時,需要給每種屬性定義一個類型(標識)。
爲了方便引述,這裏將一個完整存放所有戰鬥屬性的對象稱爲"屬性存取"容器。

屬性管理

角色最終的戰鬥屬性是由很多功能組件組成的:比如裝備、套裝效果、角色等級基礎屬性等。

在一些簡單的屬性管理中,只需要一個"屬性存取"容器就夠了。
所有的屬性變化都是在這個"屬性存取"容器中做操作,直接對屬性值做變化。

在一些複雜的屬性管理中,可能就需要多個"屬性存取"容器了。
每個"屬性存取"容器負責某一個單獨的功能組件(變化原因)。
當角色的某個功能組件導致戰鬥屬性變化時,只需要重新計算這個功能組件的屬性,再計算各個功能組件的總屬性值。

相比簡單屬性管理,複雜屬性管理的這種方式的確是多了一步冗餘操作。
但是在某些場景下,複雜屬性管理還是有優勢的。

  1. 屬性計算可能比較複雜。
    比如更換一件裝備,這個裝備還引起了套裝效果(屬性)的改變,比如之前的套裝效果是3+2,現在變成了2+3。
    如果使用簡單屬性管理方式,就需要先減去之前的套裝效果(屬性),加上之後的套裝效果(屬性),減去被脫裝備的屬性,加上新穿裝備的屬性。
    使用複雜屬性管理方式來處理更換裝備時,可以簡單的重新計算這個功能組件的屬性,也可以考慮做些優化計算(比如對比兩個裝備屬性差異)。

  2. 擴展添加新的功能組件時也很方便,只要實現特定接口或是使用其它方式。
    比如新加一個寵物系統,出戰寵物對角色有屬性加成。

  3. 策劃童鞋可能要求動態更新靜態數據。
    比如裝備A的"攻擊力"是200,動態更新成了250。
    使用簡單屬性管理方式時,當玩家更換裝備時,這個值不好減。

一些思路細節

如果使用複雜屬性管理方式,可以考慮使用觀察者設計模式,帶有戰鬥屬性的功能組件實現特定接口和屬性計算方法。
屬性管理器父類提供統一的方法來通知屬性變化。
可以使用一些bit來記錄哪些屬性被修改了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章