欢迎光临
我们一直在努力

Unity3D RPG 入门项目(五)装备配置、商店系统、玩家属性面板

核心知识点:装备 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 完整项目,实现前后端可拓展业务架构。

    赞(0)
    未经允许不得转载:171主机测评 » Unity3D RPG 入门项目(五)装备配置、商店系统、玩家属性面板
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址