Unity技能系統框架(二)技能抽象模塊細化

    看了上一篇的技能效果Demo,接下來大概說下該技能系統可實現的一些技能事件和效果。技能一般包含這幾個要素:

    數據(配置表和資源)、技能屬性(消耗能量、冷卻時間等)、事件操作(這是一個大的範疇,後面分析)、目標(施法者、目標、攻擊方、彈道、目標點)、施加的狀態Modifier(這也是一個比較大的範疇,後面分析)。

    關於技能數值方面,採用了與知乎博客一樣的方式,即Excel中配置數值數據,編輯器裏配置邏輯數據。當然如果策劃比較流弊,完全可以在Excel中配置抽象邏輯,程序只需根據邏輯用code實現即可。我目前感覺自己寫邏輯編輯器來配置技能會更高效,也可能是因爲策劃對於技能的理解比較淺吧,提供技能描述和數值方面比較在行,而關於配置抽象邏輯方面還沒深入過。以下是給策劃定義額技能表截圖:

    下面具體介紹下技能邏輯模塊部分,我把技能模塊大致劃分了一下,思維導圖如下:

    首先Skill技能模塊就是我們所理解的技能,我把技能細分爲三部分:技能屬性、技能事件列表、Modifier修改器列表。

    技能屬性不做解釋,這裏說一下技能事件列表,這裏麪包含了多個事件,並且在一定的觸發條件時觸發,這裏的技能事件是指該技能直接相關的事件。好吧,什麼叫“直接相關”……我舉個例子,當我們玩MOBA遊戲時,通過點擊某個技能圖標來釋放某個技能,這個點擊釋放的操作就是“直接相關”的,即該技能直接產生的效果,再比如技能釋放後投擲一個彈道特效,這個投擲彈道的事件也是直接相關的;有“直接相關”就有“間接相關”,例如某個技能釋放後給目標添加一個Debuf效果,如果目標釋放技能,則造成傷害,這個造成傷害的事件是通過判斷目標是否釋放技能來觸發,而與技能本身沒有關係,那麼就是“間接相關”的。上圖的事件觸發條件,爲直接相關事件的觸發條件,而間接相關的事件主要在Modifier修改器中。

    第一版大多數是移植的DOTA2技能事件類型,具體的事件操作種類如下:

  關於技能目標,主要是在一些具體事件操作中用到,包含單個目標和範圍目標:

   雖然通俗的說法是某個技能的目標,模塊細化後,其實是技能相關的具體事件所針對的目標。上面的具體事件操作列表中,可能除了範圍攻擊、延遲操作、隨機機率、彈道數據攜帶效果器 不需要指定目標外,其他的技能事件都需要指定目標。下面是一個隨機機率事件和造成傷害事件邏的輯配置截圖:

然後重點解釋下Modifier:

   下面重點解釋下Modifier修改器爲何物(簡稱Modifier)。Modifier爲施加到目標身上的某些狀態,一個最好的例子是LOL的紅藍Buff,我再舉兩個例子,例如技能釋放給目標後,目標產生一個護盾,並且5秒內受到的傷害減低50%,這個護盾就是Modifier產生的效果;再比如一個被動技能是英雄有30%的概率造成2倍傷害,其實這個被動技能也是給英雄施加了一個Modifier,效果即當英雄攻擊到目標時,傷害值*2。上圖是我大體整理的Modifier概念圖,大體分析一下:

一、Modifier基本屬性:

1、屬性類型:

當一個Modifier施加當目標身上時,如果忽視無敵,那麼無敵狀態也可以施加到目標身上,否則無法施加;如果可刷新,則把存在相同的Modifier持續時間刷新;如果可疊加,那麼目標身上會有多個相同的Modifier並且同時生效;

2、持續時間:

Modifier在目標身上的持續時間,達到時間後自動移除,我這裏設置如果持續時間是0,則直接產生效果並移除,如果是-1,則是永久的存在的,除非目標死亡(例如被動技能效果)

3、特效附着點類型和特效實體id:

一個Modifier施加到目標身上後,可能會有一些特效,並且附着在英雄不同的不爲,例如急速的Modifier會在腳後部加一個特效,持續燃燒的Modifier會在身上加一個火焰的效果。

4、Buff和Debuff:

只是區分該Modifier的類型,也可能兩者都不是。例如某個技能會移除目標身上的增益效果,就是根據這個類型來判斷的。

5、是否隱藏:

我理解的是該Modifier是否在界面狀態欄顯示Modifier圖標,如下圖:

6、是否被驅散:

即能夠被其他技能的驅散效果移除,可以和Buff/Debuff連用。

7、覆蓋模型動作:

當特定的Modifier在英雄身上時,就會強制該英雄模型播放某個動作,例如眩暈的Modifier,會在眩暈持續時間內播放眩暈動作。

8、是否被動和圖標名稱:不做解釋了

9、Think間隔:

例如一個技能釋放一個Modifier到目標身上時,該目標每隔3秒受到一次傷害,這裏的3s就是Think間隔,即每3秒會讓該Modifier產生一次效果。

二、狀態列表:

即該Modifier對目標施加的狀態,狀態用enum枚舉表示,並且設置了Flag標籤,使得目標的狀態可能是多個狀態的並集。當該Modifier從角色身上移除時,會相應的把狀態也移除。狀態列表包含如下狀態:

這裏說明一下,可能多個Modifier會修改相同的狀態,一般情況,這種修改相同狀態的技能都做成同一個可刷新的Modifier。

三、修改的屬性和數值:

這個和狀態都是Modifier能直接產生的效果,不過這裏修改的是角色的某個屬性的數值,例如修改攻擊力、修改血量、修改移動速度、修改物理防禦和魔法防禦等,當Modifier移除時,會把修改的數值恢復。英雄的屬性類型非常多,這裏截取一部分展示:

四、Modifier事件列表:

    Modifier的事件與技能的事件,具體的操作種類是一樣的,只是觸發條件不一樣。技能的事件觸發條件已說過,是與技能“直接相關”的,而Modifier的觸發條件範圍比較大:

    接下來大體說下具體的技能事件,技能事件觸發條件和Modifier事件觸發條件都是用enum枚舉表示的,邏輯配置中我用Dictionary<條件枚舉,List<具體事件操作>>保存的,不過在ProtoBuf進行序列化數據時,分別將Dictionary的key和value轉換成兩個List存儲,反序列時又轉換成Dictionary。當一個英雄在某些條件下觸發事件時,通過觸發條件枚舉獲取對應的事件列表,然後執行所有具體事件操作即可。

 

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