背包系统的实现

本文详细介绍了在Unity游戏中实现背包系统的步骤,包括背包UI搭建、信息框功能和背包数据管理器的设计。背包UI涉及BagPanel和Tooltip的自动布局;信息框由ItemMgr、ItemView和Tooltip组成,实现鼠标悬停显示物品信息;数据管理器包含BagMgr和BagPanel,负责物品管理和UI交互。文章还探讨了字典、单例模式、Transform.Find与GameObject.Find的使用区别。
摘要由CSDN通过智能技术生成

背包系统由提示框部分背包管理器部分组成
在这里插入图片描述

背包系统UI搭建

在这里插入图片描述
BagPanel中的自动布局
Content

在这里插入图片描述

Tooltip中的自动布局
Content
在这里插入图片描述

信息框部分

在这里插入图片描述
信息框组成:ItemMgr(物品信息管理器)、ItemView(物品信息显示)、Tooltip(信息框窗口)
信息框的功能:当鼠标移动到了物品的图片上,就会让Tooltip(信息框)出现
信息框的分析

  1. ItemMgr

ItemMgr是对物品的信息进行管理,比如说在游戏中获得了一把“”等级5华贵的长剑”的武器,这把武器的物品信息就是 等级:lvl5、名字:华贵的长剑、武器类型:长剑、图片路径:XX ….等等信息
同时注意ItemMgr只允许开启一个,所以要将其设置为单例模式

具体代码:

public class ItemMgr : MonoBehaviour
{
   
  
    public static ItemMgr instance = new ItemMgr();

    public class ItemInfo
    {
   
        public int id;//物品编号做字典中实例存储,也可以认为是一个种类id,比如说神丹是第四类物品,它的种类id为4,而它的类型是通过new出的药品类
        public int lvl;
        public string name;
        public string path;//路径
        public string desc;//物品描述

     
        public ItemInfo(int id, string name, string description, string path, int lvl)
        {
   
            this.id = id;
            this.name = name;
            this.desc = description;
            this.path = path;
            this.lvl = lvl;

        }
        public override string ToString()
        {
   
            string s = "LVL:" + lvl;
            return s;

        }
    }
    public class Weapon : ItemInfo
    {
    
        public int Damage {
    get; set; }
        public Weapon(int id, string name, string description, string path, int lvl, int damage) : base(id, name, description, path, lvl)
        {
   
            Damage = damage;
        }
        public override string ToString()
        {
   
            string s = base.ToString();
            s = s + "\r\n" + "DMG: " + Damage;
            return s;

        }
    }

    public class Potion : ItemInfo
    {
   
        public int HP {
    get; private set; }
        public int MP {
    get; private set; }
        public Potion(int id, string name, string description, string path, int lvl, int hp, int mp) : base(id,name,description, path, lvl)
        {
   
            HP = hp;
            MP = mp;
        }
        public override string ToString()
        {
   
            string s = base.ToString();
            s = s + "\r\n" + "HP: " + HP;
            s = s + "\r\n" + "MP: " + MP;
            return s;
        }

    }

    public class Armor /*盔甲*/: ItemInfo
    {
   
        public int Power {
    get; private set; }//力量

        public int Defend {
    get; private set; }//防御

        public int Agility {
    get; private set; }//敏捷

        public Armor(int id, string name, string description, string path, int lvl, int power, int defend, int agility) : base(id, name, description, path, lvl)
        {
   
            Power = power;
            Defend = defend;
            Agility = agility;
        }

        public override string ToString()
        {
   
            string s = base.ToString();
            s = s + "\r\n" + "PWR: " + Power;
            s = s + "\r\n" + "DEF: " + Defend;
            s = s + "\r\n" + "ATK: " + Agility;
            return s;
        }
    }


    private Dictionary<int, ItemInfo> itemById = new Dictionary<int, ItemInfo>();

    public void AddItem(ItemInfo item)
    {
   
        itemById[item.id] = item;
    }
    public ItemInfo GetItem(int id)
    {
   
        return itemById[id];
    }

    public ItemMgr()
    {
   
        AddItem(new Weapon(0, "天地神源", "来自天神的本源之力", "Sword Icon", 100, 5000));
        AddItem(new Armor(1, "造化神甲", "来历神秘的战甲", "Character", 41, 100, 500, 9000));
        AddItem(new Potion(2, "神丹", "成神", "Button Round Foreground Green", 0, 100, 100));
        AddItem(new Potion(3, "魔丹", "成魔", "Button Round Foreground Green", 0, 100, 100));
    }


}



代码分析:
1、对物品背包管理器进行单例化
public static ItemMgr instance = new ItemMgr();
这种方式并不是单例模式,而是单纯的让Item只产生一个类,如果刻意生成第个二对象也是可以的。但是这里要使用ItemMgr构造函数就初始化,为了避免二义性所以使用这种方式

完整的写法
 private ItemMgr()
    {
    }
    private static ItemMgr instance;
    public ItemMgr GetInstance()
    {
   
        if (instance == null)
        {
   
            instance = new ItemMgr();
            instance.AddItem(new Weapon(0, "天地神源", "来自天神的本源之力", "Sword Icon", 100, 5000));
        }
        return instance;
    }

而这种C#的写法,如果脚本继承自MonoBehavior的话,会造成错误,所以要注意脚本是否继承MonoBehavior。
如果继承了MonoBehavior的话,Unity官方有推荐的单例写法
public static ItemMgr instance;
void Awake()
{
   
   instance=this;
}



2、物品信息类的设计和生成构造函数

ItemInfo作为物品信息类的设计
id:物品信息id —— 每个物品都需要要有一个编号id,比如说雷电环绕的长剑这种武器,你可以有很多把,但是这种剑只有一个物品id,你可以你拥有的无数把雷电环绕的长剑看做一模一样的复制品。而武器类型中可以有不同编号的同类型武器
lvl:等级
name:名称 —— 每个物品也许类型相同,但是物品的名称都会不同,就像是黑色长剑、白色长剑,这两把剑都是武器类型,但是名称却是独一无二的
path:存放的路径 —— 每个物品都有自己的图片等信息,而path就是用来记录这些物品在unity中存放的资源。
desc:物品的描述

 public class ItemInfo
    {
   
        public int id;
        public int lvl;
        public string name;
        public string path;//路径
        public string desc;//物品描述

     
        public ItemInfo(int typeid, string name, string description, string path, int lvl)
        {
   
            this.typeid = typeid;
            this.name = name;
            this.desc = description;
            this.path = path;
            this.lvl = lvl;

        }
        public override string ToString()
        {
   
            string s = "LVL:" + lvl;
            return s;

        }
    }

3、继承ItemInfo类的各个子类
不同物品类型有着不同的信息,或者说自己独有的类型,像武器可以加攻击力而血瓶可以恢复生命值。但是两者的属性是不可能相同的,所以这些不同类型物品要从iteminfo中派生出来。而派生的各个子类都属于自己独有的类型,所有实例化的对象都是属于各个子类的类型道具。
  同时注意ToString()是各个派生里独有属性的格式化输出,在继承基类的输出外,还要增加新的输出
  

 public class Potion/*药品*/ : ItemInfo
    {
   
        public int
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值