道具系統是游戲的核心系統之一,常見的業務功能包括 “角色背包”, “道具商店”, “怪物掉落” 等,都依賴道具系統,
在實作這些功能之前,首先要解決的問題就是要定義我們的游戲世界中,到底會有哪些道具, 以及這些道具是如何分類的?
這就是我們這期要做的“道具字典“,首先必須要有一個“字典”來說明這個道具是什么,接下來才能有“背包”系統,來表示角色的背包里有些什么道具,數量有多少,
一、道具分類
1.概念設計
我們先參照魔獸世界的道具分類,整理出分類大致如下(見腦圖),

圖1.道具分類圖

圖2.裝備分類圖
從圖中可以看出,整個分類是一個樹形結構,
“道具“大類下,目前是一個二層的樹形結構,里面包括“雕文”,“坐騎”,“食物”等,這些分類和現有系統聯系不緊密,需要額外開發使用這些道具的玩法系統,可以暫時先不過多考慮,
“裝備”大類下,是一個三層的樹形結構,裝備系統和戰斗結算,人物戰斗屬性關系緊密,我們接下來將前主要設計裝備字典,
2.資料庫設計
前幾章,實作了系統的資料字典,但那個字典主要適用于列舉選項,是一個平面型的資料結構,對裝備型別就不適用了,
比如,在分類選擇時,想要選擇 “武器” -> “單手武器” -> "單手劍",這樣一級一級往下選擇,就難以實作了,
因此,需要額外設計一張能夠處理樹形結構的“道具型別表”,在資料字典表的基礎上,加兩個欄位 level(當前層級), rootCode(根節點編碼)即可,
建表陳述句如下:
CREATE TABLE `item_type` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主鍵id', `code` varchar(20) NOT NULL DEFAULT '' COMMENT '編碼', `parent_code` varchar(20) NOT NULL DEFAULT '' COMMENT '父編碼', `root_code` varchar(20) NOT NULL DEFAULT '' COMMENT '根節點編碼', `level` int NOT NULL DEFAULT '0' COMMENT '層級', `value` varchar(20) NOT NULL DEFAULT '' COMMENT '值', `remark` varchar(100) NOT NULL DEFAULT '' COMMENT '備注', `create_user` varchar(20) NOT NULL DEFAULT '' COMMENT '創建人', `update_user` varchar(20) NOT NULL DEFAULT '' COMMENT '修改人', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創建時間', `update_time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '修改時間', `is_delete` tinyint NOT NULL DEFAULT '0' COMMENT '是否洗掉 0-否 1-是', `version` int NOT NULL DEFAULT '0' COMMENT '版本號', PRIMARY KEY (`id`), UNIQUE KEY `uidx_code` (`code`), KEY `idx_parent_code` (`parent_code`) ) ENGINE=InnoDB AUTO_INCREMENT=90 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='道具型別字典表';item_type.sql
3.內容管理
表結構有了,參照前面的章節,只要建好對應的物體類,在RMS系統中,添加對應的選單,實作相應的邏輯即可,
注意啟動時,把道具分類也加載到快取中(在StartUpListener類中),
(可參照原始碼,就不展開了,具體型別編碼在源代碼里的策劃檔案中,也可自行定義)
二、道具字典
有了分類,接下來就可以定義道具字典了(即定義游戲中所有可能出現的道具),
1.道具編碼
為了區分道具的型別,我們有必要制定一套編碼規范,來唯一標識一個道具,格式如下:
道具型別標識 = 型別編碼(5位) + 序列號(5位),比如:單手劍 = 61101, 鈍劍是此型別中的第一個道具,編碼為6110100001,
背包道具ID = 道具型別標識(10位)+ 時間戳(12位)+ 序列號(4位),比如:打怪掉落的鈍劍,在玩家背包里的道具ID為 61101000012103151200360001,
即,系統中同型別的裝備,最多可以定義10萬種,同一種裝備,1秒鐘最多可以產生1萬個,
這里型別編碼是在策劃檔案中定義好,序列號是在Redis中做incr操作獲取,具體可參見原始碼,
2.資料表結構設計
在設計資料表的時候,考慮到不管是普通道具,還是裝備道具,都有一些通用的屬性,比如:名稱、描述、品質、是否可交易、是否唯一、是否可丟棄等等,
對此,可以設計一張道具基礎表,item_common,來記錄所有道具的基本資訊,
而裝備表特有的屬性,比如:傷害值,護甲值,生命值,力量,敏捷,等等,則存到裝備表里 item_equipmen,
等后面設計普通道具表時,比如烹飪,卷軸,坐騎等,則可以擴展到 item_normal 等表中,
這樣設計,可以防止單表的欄位過多,
CREATE TABLE `item_common` ( `id` varchar(20) NOT NULL COMMENT '唯一編碼(型別編碼+序號編碼)', `type_code` varchar(10) NOT NULL DEFAULT '' COMMENT '型別編碼', `name` varchar(20) NOT NULL DEFAULT '' COMMENT '物品名稱', `description` varchar(500) NOT NULL DEFAULT '' COMMENT '物品描述', `quality` varchar(10) NOT NULL DEFAULT '' COMMENT '物品品質', `item_level` int NOT NULL DEFAULT '1' COMMENT '物品等級', `required_level` int NOT NULL DEFAULT '1' COMMENT '等級要求', `required_job` varchar(10) NOT NULL DEFAULT '' COMMENT '職業要求', `stack_size` int NOT NULL DEFAULT '1' COMMENT '堆疊數量', `price_buy` int NOT NULL DEFAULT '0' COMMENT '購買價格', `price_sell` int NOT NULL DEFAULT '0' COMMENT '出售價格', `can_trade` tinyint NOT NULL DEFAULT '1' COMMENT '是否可交易 0:否 1:是', `can_drop` tinyint NOT NULL DEFAULT '1' COMMENT '是否可丟棄 0:否 1:是', `is_unique` tinyint NOT NULL DEFAULT '0' COMMENT '是否唯一 0:否 1:是', `extend_prop` varchar(8000) NOT NULL DEFAULT '' COMMENT '擴展屬性', `create_user` varchar(20) NOT NULL DEFAULT '' COMMENT '創建人', `update_user` varchar(20) NOT NULL DEFAULT '' COMMENT '修改人', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創建時間', `update_time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '修改時間', `is_delete` tinyint NOT NULL DEFAULT '0' COMMENT '是否洗掉 0-否 1-是', `version` int NOT NULL DEFAULT '0' COMMENT '版本號', PRIMARY KEY (`id`), KEY `idx_item_type_code` (`type_code`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='道具字典表';item_common
CREATE TABLE `item_equipment` ( `id` varchar(20) NOT NULL COMMENT '唯一編碼(型別編碼+序號編碼)', `type_code` varchar(10) NOT NULL DEFAULT '' COMMENT '型別編碼', `name` varchar(20) NOT NULL DEFAULT '' COMMENT '裝備名稱', `damage_min` int NOT NULL DEFAULT '0' COMMENT '最小傷害', `damage_max` int NOT NULL DEFAULT '0' COMMENT '最大傷害', `armour` int NOT NULL DEFAULT '0' COMMENT '護甲值', `hp` int NOT NULL DEFAULT '0' COMMENT '生命值', `strength` int NOT NULL DEFAULT '0' COMMENT '力量', `agility` int NOT NULL DEFAULT '0' COMMENT '敏捷', `intellect` int NOT NULL DEFAULT '0' COMMENT '智力', `stamina` int NOT NULL DEFAULT '0' COMMENT '耐力', `extend_attr` varchar(8000) NOT NULL DEFAULT '' COMMENT '擴展屬性', `create_user` varchar(20) NOT NULL DEFAULT '' COMMENT '創建人', `update_user` varchar(20) NOT NULL DEFAULT '' COMMENT '修改人', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創建時間', `update_time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '修改時間', `is_delete` tinyint NOT NULL DEFAULT '0' COMMENT '是否洗掉 0-否 1-是', `version` int NOT NULL DEFAULT '0' COMMENT '版本號', PRIMARY KEY (`id`), KEY `idx_equipment_type_code` (`type_code`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='裝備字典表';item_equipment
具體到代碼中建模的類圖,大致如下:

三、效果演示

四、小結
本章主要實作的道具分類和道具字典的基本配置,
道具種類繁多,需要策劃一個個配,這里我只配了十幾個單手劍的屬性,用作演示,
預計下一章會在游戲模塊簡單實作下角色背包
本文原文地址:https://www.cnblogs.com/lyosaki88/p/idlewow_16.html 本章原始碼下載地址: https://474b.com/f/14960372-485827531-39583c (訪問密碼:9502)
專案交流群:329989095
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/270774.html
標籤:其他
上一篇:Unity相機范圍適應物體大小
下一篇:unity渲染篇:烘焙模型貼圖
