背包系统由提示框部分和背包管理器部分组成
背包系统UI搭建
BagPanel中的自动布局
Content
Tooltip中的自动布局
Content
信息框部分
信息框组成:ItemMgr(物品信息管理器)、ItemView(物品信息显示)、Tooltip(信息框窗口)
信息框的功能:当鼠标移动到了物品的图片上,就会让Tooltip(信息框)出现
信息框的分析
- 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