核心知识点:装备 XML 配置拓展、装备 / 药品多类型解析、背包悬浮提示拖拽屏蔽、商店 UI 搭建、分类滚动列表、NPC 交互弹窗、商店购买逻辑、玩家角色属性设计、UI 刷新性能规范、系统低耦合架构思想
一、装备 XML 配置拓展与解析改造
1 概念
在原有物品配置基础上新增装备分类,拓展装备专属属性(攻击、防御、移速、穿戴部位、适用职业),改造解析脚本区分药品 / 装备两类实体,通过枚举区分物品类型,读取时差异化赋值。
2 特性 / 规则
XML 新增装备 Item 节点,新增属性:atk、def、speed、wearType、jobType;
枚举划分:物品大类(药品 / 装备)、穿戴部位(头盔 / 铠甲 / 左右手 / 鞋子 / 饰品)、职业(战士 / 法师 / 通用);
解析时做分支判断:药品只读取回血回蓝,装备读取攻防速度穿戴属性;
统一 ID 区间区分,药品 1001 起、装备 2001 起,测试按键快速生成道具。
3 语法 & 代码片段
<Item id="2001" name="铁剑" icon="sword1" type="Equip" atk="20" wear="Right" job="Warrior" sell="50"/>
// 物品类型枚举
public enum ItemType { Drug, Equip }
// 穿戴部位
public enum WearType { Head, Body, LeftHand, RightHand, Shoe, Accessory }
// 适用职业
public enum JobType { Warrior, Mage, All }
// 解析分支逻辑
if(type == ItemType.Drug)
{
info.HpAdd = int.Parse(node.Attributes["hpAdd"].Value);
info.MpAdd = int.Parse(node.Attributes["mpAdd"].Value);
}
else if(type == ItemType.Equip)
{
info.Atk = int.Parse(node.Attributes["atk"].Value);
info.Def = int.Parse(node.Attributes["def"].Value);
info.Speed = int.Parse(node.Attributes["speed"].Value);
info.Wear = (WearType)Enum.Parse(typeof(WearType), node.Attributes["wear"].Value);
info.Job = (JobType)Enum.Parse(typeof(JobType), node.Attributes["job"].Value);
}
4 相关知识点对比
单实体不分类型 VS 药品 / 装备分字段解析
统一实体全字段:大量字段闲置,数据冗余; 分支解析:对应类型只读取对应属性,内存占用更低,逻辑清晰。
5 模块拓展
新增饰品、套装属性,拓展装备品质字段(白 / 蓝 / 紫 / 橙)。
二、背包悬浮提示拖拽屏蔽处理
1 概念
拖拽物品时鼠标划过其他格子会误触发悬浮描述弹窗,新增静态全局拖拽标记,拖拽全程禁用提示显示,松开后恢复正常检测。
2 特性 / 规则
静态 bool 变量isDragging,所有物品共用;
IBeginDrag置 true、IEndDrag置 false;
鼠标移入时先判断拖拽标记,拖拽中直接跳过弹窗生成;
不单独给每个物体创建变量,减少内存开销。
3 语法 & 代码片段
// 拖拽全局静态标记
public static bool isDragging = false;
public void OnPointerEnter(PointerEventData eventData){
if(isDragging) return; // 拖拽中不弹出提示
TipPanel.Instance.ShowTip(itemId, Input.mousePosition);
}
public void OnBeginDrag(PointerEventData data){
isDragging = true;
// 拖拽逻辑…
}
public void OnEndDrag(PointerEventData data){
isDragging = false;
// 落点逻辑…
}
4 相关知识点对比
单物体局部变量 VS 全局静态标记
局部变量:每个拖拽物体单独控制,多物品拖拽状态不同步; 静态全局:全局统一拖拽状态,任意物品拖拽全部屏蔽提示。
5 模块拓展
拓展批量拖拽、堆叠道具拖拽时提示锁定。
三、商店 UI 整体搭建
1 概念
ScrollRect 竖直滚动商店列表,区分药品 / 装备分类按钮,单个商品 Item 预制包含图标、名称、属性文本、购买按钮,依托 Grid 布局自动排列。
2 特性 / 规则
Scroll 关闭水平滚动,Content 适配高度自动延展;
单个商品 Item 结构:Sprite 图标、名称文本、效果描述、售价文本、购买 Btn;
分类按钮切换时清空原有列表,重新实例对应类型商品;
全部 UI 界面继承通用 BasePanel 弹窗父类,统一滑入动画。
3 语法 & 代码片段
public RectTransform content;
public GameObject shopItemPrefab;
// 切换分类,清空列表再生成
void RefreshShop(ItemType type){
// 销毁原有商品
foreach(Transform child in content) Destroy(child.gameObject);
// 筛选对应类型配置
List<ItemInfo> list = ItemConfig.Instance.GetAllByType(type);
foreach(var data in list){
GameObject obj = Instantiate(shopItemPrefab, content);
obj.GetComponent<ShopItem>().SetData(data);
}
}
4 相关知识点对比
不清空直接新增 VS 先销毁再生成
不清空:多次切换商品堆叠,界面重复叠加; 销毁重建:列表始终只展示当前分类商品,无冗余物体。
5 模块拓展
商品限购、折扣标签 UI、道具批量购买输入框。
四、NPC 点击交互逻辑
1 概念
场景 NPC 挂载碰撞体,鼠标点击弹出商店面板,鼠标移入切换专属对话光标,移出恢复默认。
2 特性 / 规则
NPC 物体添加 Collider2D/3D,挂载 IPointerClickHandler;
OnMouseEnter 调用 CursorManager 切换对话鼠标,Exit 恢复;
点击调用 ShopPanel 单例 Show 方法弹出商店;
逻辑与商店业务完全解耦,NPC 仅负责打开界面。
3 语法 & 代码片段
public void OnPointerClick(PointerEventData data){
ShopPanel.Instance.Show();
}
public void OnMouseEnter(){
CursorManager.Instance.SetDialogCursor();
}
public void OnMouseExit(){
CursorManager.Instance.ResetCursor();
}
4 相关知识点对比
NPC 内置商店逻辑 VS NPC 只做界面入口
内置业务:NPC 与商店强耦合,修改商店要同步改 NPC; 入口分离:NPC 仅弹窗,商店逻辑独立,低耦合易维护。
5 模块拓展
任务 NPC、商城 NPC 区分不同光标与弹窗。
五、商店商品数据刷新与分类切换
1 概念
读取 XML 配置,根据 ItemType 筛选对应道具批量生成商品条目,每个 ShopItem 脚本读取 ID 渲染图标、属性、售价。
2 特性 / 规则
配置工具类开放按类型筛选接口,返回对应物品集合;
商品描述文本根据物品类型动态拼接回血 / 攻防属性;
切换药品 / 装备按钮触发 RefreshShop,重建列表;
资源通过 Resources 按配置图标名动态加载 Sprite。
3 语法 & 代码片段
// ShopItem赋值
public void SetData(ItemInfo info){
itemId = info.ItemId;
icon.sprite = Resources.Load<Sprite>("Icon/" + info.Icon);
nameTxt.text = info.ItemName;
string desc = "";
if(info.Type == ItemType.Drug)
desc = $"回复HP{info.HpAdd} MP{info.MpAdd}";
else
desc = $"攻击{info.Atk} 防御{info.Def}";
descTxt.text = desc;
priceTxt.text = $"售价:{info.SellPrice}";
}
4 相关知识点对比
硬编码商品数据 VS XML 配置动态生成
硬编码:新增商品必须修改代码; 配置读取:策划修改 XML,程序无需改动。
5 模块拓展
商品星级、品质颜色文字区分。
六、商店购买完整业务逻辑
1 概念
点击商品购买按钮弹出数量输入弹窗,输入数字校验金币,扣除对应金额后调用背包添加道具接口。
2 特性 / 规则
弹窗输入框限制数字,空值弹出提示;
读取物品单价 × 购买数量计算总价;
读取 PlayerStatus 玩家金币,不足弹窗提示充值;
金币充足扣减,调用 BagManager.AddItem 存入背包,同步刷新背包金币 UI。
3 语法 & 代码片段
// 购买确认逻辑
public void BuyConfirm(int itemId, int count){
var data = ItemConfig.Instance.GetItem(itemId);
int total = data.SellPrice * count;
var player = PlayerStatus.Instance;
if(player.Gold < total){
TipPanel.Instance.ShowTip("金币不足,请充值");
return;
}
player.Gold -= total;
BagManager.Instance.AddItem(itemId, count);
TipPanel.Instance.ShowTip("购买成功");
BuyPanel.Instance.Close();
}
4 相关知识点对比
直接扣金币不校验 VS 前置余额判断
无校验:金币负数,数据逻辑错误; 前置判断:资源不足拦截,数据合法。
5 模块拓展
批量最大数量自动填充、打折总价计算。
七、玩家 PlayerStatus 角色属性单例
1 概念
全局单例存储玩家静态 / 动态属性,统一提供属性读写接口,背包、商店、装备面板统一读取,MVC 模型层核心数据载体。
2 特性 / 规则
基础属性:金币、等级、当前 / 最大经验、角色名、职业;
战斗属性:当前血量、最大血量、蓝量;
攻击 / 防御 / 速度分基础值、装备加成值,总属性实时计算;
所有 UI 不存数据,打开界面从单例读取刷新。
3 语法 & 代码片段
public class PlayerStatus{
public static PlayerStatus Instance { get; private set; }
// 经济
public int Gold;
// 等级经验
public int Level;
public int Exp, MaxExp;
// 生命法力
public int CurHp, MaxHp;
public int CurMp, MaxMp;
// 基础属性
public int BaseAtk, BaseDef, BaseSpeed;
// 装备加成
public int EquipAtk, EquipDef, EquipSpeed;
// 总属性计算
public int TotalAtk => BaseAtk + EquipAtk;
public int TotalDef => BaseDef + EquipSpeed;
}
4 相关知识点对比
UI 存储角色数据 VS 全局 Model 单例存储
UI 存数据:关闭界面数据丢失,多界面同步困难; Model 单例:数据永久留存,任意界面读取统一数据源。
5 模块拓展
属性本地 XML / 数据库持久化、升级经验判断逻辑。
八、角色属性面板 UI 渲染
1 概念
独立弹窗展示玩家总战斗属性,打开时一次性拼接文本显示基础 + 装备加成,全程不在 Update 实时刷新。
2 特性 / 规则
继承 BasePanel,重 Show 方法做一次性数据刷新;
文本拼接区分基础属性、装备加成、最终总值;
仅打开界面读取一次 PlayerStatus,杜绝每帧刷新 UI 造成性能浪费;
文字分层展示:单条属性详情 + 角色综合总结。
3 语法 & 代码片段
public override void Show(){
base.Show();
var p = PlayerStatus.Instance;
string atkStr = $"基础攻击:{p.BaseAtk} 装备加成:{p.EquipAtk}\\n总攻击:{p.TotalAtk}";
string defStr = $"基础防御:{p.BaseDef} 装备加成:{p.EquipDef}\\n总防御:{p.TotalDef}";
string all = $"角色等级:{p.Level}\\n{atkStr}\\n{defStr}";
allTxt.text = all;
}
4 相关知识点对比
Update 持续刷新 UI VS 界面打开一次性刷新
Update 刷新:每帧字符串拼接、赋值,大量无用运算卡顿; 打开刷新:仅界面弹出执行一次,性能消耗极低。
5 模块拓展
装备穿戴后自动刷新属性面板、等级提升弹窗。
九、项目低耦合架构开发规范
1 概念
各系统(背包 / 商店 / 角色 / NPC)完全分离,只通过统一数据层(PlayerStatus、ItemConfig)交互,不互相持有引用,新增功能不改动旧模块代码。
2 特性 / 规则
NPC 只负责打开商店面板,不操作金币、背包;
商店购买只调用背包添加接口,不直接修改格子;
背包、属性面板全部读取全局玩家单例,互不依赖;
所有静态数据统一 XML 配置,业务逻辑只操作配置工具类。
3 相关知识点对比
系统强耦合互相持有 VS 分层解耦统一数据层
强耦合:修改一个系统要同步改动多处关联代码,Bug 连锁; 分层解耦:模块独立,新增商店功能不改动背包、角色底层。
5 模块拓展
MVC 完整分层落地,拆分 Model/View/Controller 三层。
综合拓展
1 完整业务流程
XML 装备配表解析 → NPC 点击弹出商店 → 药品 / 装备分类滚动列表 → 输入数量购买扣金币 → 道具存入背包 → 背包查看道具 → 属性面板读取装备加成总属性;
2 高频 Bug 排查清单
拖拽提示弹窗闪烁:未添加全局 isDragging 静态标记;
商店商品重复堆叠:切换分类未销毁原有 Item;
购买无道具:AddItem 接口参数 ID 错误;
属性数值不变:装备加成值未同步更新 PlayerStatus;
界面每帧卡顿:Update 内持续刷新 UI 文本;
3 考点
XML 多类型配置解析、全局单例 Model 数据层、商店购买业务流程、UI 一次性刷新性能规范、低耦合系统设计、拖拽全局状态控制;
4 进阶拓展学习方向
装备穿戴系统、装备套装加成、经验升级逻辑、数据库存档、断线重连同步玩家数据;
5 实战落地要求
整合装备、商店、NPC、角色属性整套模块写入 RPG 完整项目,实现前后端可拓展业务架构。

