开发笔记:掉落系统模块设计思路
本文所討論的掉落系統是一個游戲中的通用模塊,不僅局限于打怪時掉落物品,包括抽卡、開寶箱、任務獎勵、活動獎勵等功能都可以使用。抽象地說,掉落系統是由給定參數按照特定的算法生成一系列可附加在玩家身上的東西的模塊。
需求
我先羅列一下整個的需求列表,會比較零亂,隨后我們再來抽絲剝繭理清這里面的邏輯關系。
掉落系統可以掉落任何能附加于玩家的物品。包括金幣、寶石、經驗、英雄經驗、道具、英雄、寵物、裝備、積分、體力等等。
策劃需要控制掉落物品的數值。如金幣寶石的數量,道具的ID、數量,英雄的Id、等級、星級等。
掉落物品涉及數值可能是固定的,也可能是在一定范圍內隨機的,也可能是根據公式計算出來的。
一次掉落可能掉落多個物品。掉落的多個物品可能是固定的,也可能是隨機的。隨機方式有兩種:從多個物品中獨立隨機(針對每個物品判斷概率是否命中),從多個物品中權重隨機(按照一組物品概率的比例選出一個)。
特殊情況下會改變掉落。例如抽卡連續抽10次后提高得到更好卡的概率,打同個副本次數過多后降低產出概率。
使用通用物品
為了解決第1點需求,我們可以一份通用物品數據結構,這樣就能使用統一的配置來描述各類不同的物品了。關于通用物品及相關的分發模塊設計,前一篇博客游戲開發手記:抽象物品已經做了說明,這里不再贅述。
通用物品數值
有了通用物品,策劃基本上可以根據需要配置上任何物品了。但有一些特殊情況要特殊處理,也就是物品的數值不一定是固定的。比如開寶箱,可能需要開出的金幣有一定的隨機效果,在一定的范圍內隨機;再如戰斗產生的經驗需要跟玩家的等級掛鉤,玩家等級越高,所獲取的經驗也越高。
我們想把這些復雜性約束在掉落系統內解決,買手機號碼平臺讓具體邏輯寫起來更簡潔,也可以避免后面各個模塊都過于復雜產生bug。所以最后我們的解決方案可能有些復雜,但綜合來看是可以接受的。
具體方案就是把通用物品的每一項數值擴展為4列(邏輯類型,參數1,參數2,參數3),最后由四列綜合計算出一項數值(如物品數量)。計算方式如下:
邏輯類型==固定數值,則數值為參數1
邏輯類型==范圍隨機,則數值為random(min=參數1,max=參數2)
邏輯類型==玩家等級,則數值為參數1*玩家等級^2+參數2*玩家等級+參數3
邏輯類型==VIP等級,則數值為參數1*VIP等級^2+參數2*VIP等級+參數3
…其他類型
這樣一來,基本上可以滿足策劃任何關于物品數值的需求。
獨立隨機和權重隨機
需求中第4點提到了,掉落的過程是從一系列預先配置的物品中選擇一項或多項,選擇的過程可能是獨立隨機或權重隨機。我們的做法是把隨機的過程劃分成多個階段,第一個階段進行獨立隨機,第二個階段進行權重隨機,這樣一來策劃只需要根據自己的需求進行組合配置,程序這邊來看邏輯是統一的。
具體地說,一個dropId對應多個DropGroup,每個DropGroup都帶有一個命中概率。第一階段我們拿到dropId后遍歷其對應的所有DropGroup并依次檢查概率是否命中,命中則被選出。每個DropGroup又對應多個DropDetail,每個DropDetail帶有對應的DropItem和其隨機權重。第二階段我們從上面計算出的每個DropGroup中按照權重隨機選擇一項DropDetail。
掉落的轉換
第5點需求掉落的改變可以換個角度來認知,我們把需求理解成:一個dropId可能在某些條件下轉變為另一個dropId。比如抽10次卡提高得到好卡的概率,可以配置兩份掉落,一份對應于低概率,一份對應于高概率,正常情況下掉落低概率,當低概率的次數是整10時則轉為高概率。
在我們的游戲中,掉落的轉換總是跟掉落的次數息息相關的。我們定義了一份transform配置,其中指明某dropId在何種條件下變為另一個dropId。游戲運行過程中記錄transform表中出現的dropId的掉落次數,在掉落生成之前檢查并進行轉換,再用轉換后的dropId生成真正的掉落。
配表的結構大致是這樣的:
解釋一下。掉落1001在掉落次數大于100次時則改為掉落1003,否則每生成5次改為掉落1002;掉落1002在第10次改為1003;掉落1003在生成次數小于50時總是轉為1004。
轉換dropId時先遞增該dropId的掉落次數,再檢查該id的所有轉換條件,若條件滿足則轉為新的dropId,遞增新的dropId次數后再檢查轉換條件,一直到不能再進行轉換為止。
總結
最后再整理一下完整的生成掉落的過程。
由產生掉落的模塊提供dropId交給掉落系統。
掉落系統嘗試對dropId進行轉換,并遞增涉及dropId的掉落次數,最后返回新的dropId(大部分情況下與原來的相同)。
依照dropId查出對應的一個或多個DropGroup,依次進行概率判定,最后選出一個或多個DropGroup。
對于每個DropGroup,查出其對應的一個或多個DropDetail,依照權重選出一項DropDetail。
對于每項DropDetail,計算其配置的數值并生成一項通用物品。
收集所有生成的通用物品,即為此次掉落的產出。
總結
以上是生活随笔為你收集整理的开发笔记:掉落系统模块设计思路的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 寻路算法实例解析:贪吃蛇AI的实现
- 下一篇: 基于触发机制的脚本系统