任務系統是游戲中最重要的系統之一,本文旨在設計一個輕量清晰的任務系統。通用易擴展是本系統關註的重點。任務系統中當角色的條件滿足時,自動觸發每一類型的任務,每個任務有其所需的完成條件,當角色完成了指定的操作後,則會觸發任務自動完成,任務完成後一般玩家會領取對應的獎勵,結束任務,此任務的生命周期結束,如... ...
游戲伺服器設計之任務系統
介紹
任務系統是游戲中最重要的系統之一,本文旨在設計一個輕量清晰的任務系統。通用易擴展是本系統關註的重點。任務系統中當角色的條件滿足時,自動觸發每一類型的任務,每個任務有其所需的完成條件,當角色完成了指定的操作後,則會觸發任務自動完成,任務完成後一般玩家會領取對應的獎勵,結束任務,此任務的生命周期結束,如果這個任務有後續任務,那麼會自動觸發下一個任務,從玩家角度講,任務是一條故事線,所以經常會說主線、支線任務就是這個原因。
設計
當設計任務時有如下幾個重點:
任務需要以線的方式組織,一般都是在每個任務配置中指定下一個任務的id,每個任務線的第一個和最後一個比較特殊,第一個任務必須在角色屬性滿足條件下自動獲得,而最後一個任務因為是故事線的結尾所以不能觸發下一個任務,需要保持任務已結束的狀態,如果故事線增加了後續任務,那麼任務可以繼續往下順延。
任務需要滿足條件才能接取,所謂的條件一般都是角色屬性,比如角色等級。比如等級10級以上的可接取,為了抽象這個需求,任務可接條件設置兩個欄位角色屬性類型和屬性值,這個等級的例子就是等級:10。
任務接取後角色在游戲中做相關的操作,如果跟接取的任務相關,那麼任務的進度會自動更新,那麼二者是組合產生關聯的呢?我們使用事件機制,玩家的游戲行為拆分出一系列的事件類型,用三個欄位表示,事件類型,事件對象,事件值,比如打怪,事件類型為擊殺怪物,事件對象為樹妖,事件值為1。對應的任務完成條件也是這三個配置,不過任務配置中的值為目標值,另外有一種特殊情況比較常見就是狀態完成條件,比如某任務需要角色達到100級完成,這個時候就用一個特殊的事件類型,屬性表示狀態類的完成條件,本例中配置就應該為屬性:等級:100。
任務完成後需要觸發下一個任務,但是如果下一個任務條件不滿足,那麼也不允許獲得該任務,待角色屬性成長後滿足了條件再自動獲得。
任務配置除了支持以上說的參數外,需要流出一些可擴展參數,比如任務獎勵,任務綁定的npc,任務接、交過程中的對白、過場動畫等。任務系統使用csv做配置,增加配置只需要增加欄位就可以了,每個任務有map
類型的參數欄位保留了所有擴展配置。
任務操作的時序圖
任務操作的狀態圖
總結
- 系統中大量使用了事件機制,增加了易用性和可擴展性。角色上線載入數據,使用事件機制,避免了與資料庫模塊產生耦合,同時也很好的支持了非同步和同步模式。
- 任務系統與客戶端的協議細節沒有做實現,這個使用者在確定的事件下hook到然後通知客戶端即可,完全不需要修改任務系統。
- 任務系統的介面都已適配到腳本層,利用h2engine 的通用腳本層,無論是Python,lua,js,php都可以使用相同的介面調用任務系統。
- GitHub地址: https://github.com/fanchy/h2engine
- 關於任務系統使用的屬性管理器:http://www.cnblogs.com/zhiranok/p/h2engine_propmgr.html
- 關於游戲伺服器引擎h2engine:http://www.cnblogs.com/zhiranok/p/ffengine.html