这几天学习了背包系统 在这里和大家分享一下
我这里使用了之前做的超级玛丽来实现的 因为我懒得再做一个可以移动等触发碰撞的项目了
然后素材都是在网上下载的几个装备图片
1.准备工作
首先我们用UGUI创建出装备面板
我们用Gird Layout Group组件 肯恩给大家之前也了解过这个组件
我们可以理解为是专门用来排版的组件
在挂载这个组件的父物体下的所有子物体 每当创建或者实例化出来都会根据我们设置的大小和距离来自动排版
然后就实现一下我们按下一个键可以打开和关闭背包面板
public bool isEquip = false;//装备面板
public GameObject EquipPanel;
private void Update()
{
if (isEquip)
{
EquipPanel.SetActive(true);
}
else
{
EquipPanel.SetActive(false );
}
if(Input.GetKeyDown(KeyCode.P))
{
isEquip = !isEquip;
}
}
然后在unity中给EquipPanel赋值即可
这样 在game模式下按下p即可开启 再次按下即可关闭
我这里用的是取反 isEquip = !isEquip; 当然也可以使用累加点击次数 来用奇偶来判断
这样我们的准备工作就结束了 下面开始我们的数据存储
2.数据存储
我们可能知道每个脚本在每次游戏开始的时候 都会初始化
当然我们想在每次打开游戏之后 上次打的背包都清空了 那样真的太惨了
所以我们不能简单的继承MonoBehaviour类了 要使用ScriptableObject类来实现
首先我们写创建装备的代码 其中所有参数我都注释了
[CreateAssetMenu(fileName = "New Item", menuName = "Bag/New Item")]
public class Item : ScriptableObject
{
public string itemName;//装备名称
public Sprite itemSprite;//装备标志
public int itemcount;//装备数量
[TextArea]
public string itemInfo;//装备描述
public bool isEquip;//是否是装备类
}
一定要注意所继承的类
然后重点来了 返回untiy中
这个是在Project面板下右键可创建
为什么会出现这样呢 因为我们刚刚写的代码
然后创建一个New Item
我们可以自定义命名 以及里边所有参数
这一步很重要 这将会关系之后的操作
我们可以理解为这就是一类装备 鞋子 护甲 武器等
然后同理我们写背包的代码
[CreateAssetMenu(fileName = "New Inventory", menuName = "Bag/New Inventory")]
public class Inventory : ScriptableObject
{
public List<Item> itemList = new List<Item>();
}
这个我们的想法是创建一个List 然后每当捡到装备我们就添加到LIst中去
然后在unity中创建一个背包
至于为什么要弄多个背包呢 因为在一些游戏中 还需要有药水商 装备商的背包 这样方便管理
然后就轮到写场景中被捡到装备的脚本了
public Item thisitem;//装备
public Inventory Bag;//背包
private void OnTriggerEnter2D(Collider2D collision)
{
if (collision.tag == "Body")
{
Destroy(gameObject);
AddNewItem();
}
}
public void AddNewItem()//捡到装备
{
if (!Bag.itemList.Contains(thisitem))
{
//没有包含这件装备
Bag.itemList.Add(thisitem);
InventoryManager.CreateNewItem(thisitem);//这句之后会介绍到
thisitem.itemcount = 1;
}
else
{
thisitem.itemcount+=1;
}
InventoryManager.RefreshItem();//这句之后会介绍到
}
这个是继承MonoBehaviour类的
其中public的两个变量分别在unity中赋值装备类型(刚刚创建鞋子 衣服 武器等)背包类型(谁的背包)
然后我们就要同步UGUI和捡到的装备了
下面是两个代码 分别是管理图标 和背包管理器
public Item slotItem;//装备
public Image SlotImage;//本体Image
public Text SlotCount;//本体Text显示数量
public void OnClicked()
{
InventoryManager.UpdateInfo(slotItem.itemInfo);
}
public Inventory myBag;
public GameObject SlotGird;//之前创建好的格
public Slot slotprefebsl;//创建的预制体
public Text itemTextInfo;//信息Text
public static InventoryManager _instance;
private void Awake()
{
_instance = this;
}
private void OnEnable()
{
RefreshItem();
_instance.itemTextInfo.text = "";
}
public static void CreateNewItem(Item item )
{
Slot newitem = Instantiate(_instance . slotprefebsl, _instance.SlotGird.transform.position, Quaternion.identity);
newitem.gameObject.transform.SetParent(_instance.SlotGird.transform);//设置父物体
newitem.slotItem = item;
newitem.SlotImage.sprite = item.itemSprite;
newitem.SlotCount.text = item.itemcount.ToString();
}
public static void RefreshItem()
{
//修改数字
for(int i = 0; i < _instance.SlotGird.transform.childCount; i++)
{
if (_instance.SlotGird.transform.childCount == 0)
{
break;
}
Destroy(_instance.SlotGird.transform.GetChild(i).gameObject);
}
for(int i=0;i<_instance.myBag.itemList.Count; i++)
{
CreateNewItem(_instance.myBag.itemList[i]);
}
}
public static void UpdateInfo(string Description)
{
_instance.itemTextInfo.text = Description;
}
然后创建一个预制体 带有button的一个Image 给他挂载上Slot脚本
之后赋值
其中的SlotITem不用管 因为代码中已经赋值
第二个脚本挂在带有Gird Layout group的那个父物体
然后赋值就可以使用
还要给预制体上的Button赋值为本身的OnClicked
这样可以实现点击装备出现文字的效果
这篇博客介绍了背包系统简单做法
大家如果要使用话 每次之前记得清空背包和清零装备的个数
如果你也是unity爱好者 欢迎关注我的博客 我在这里持续跟新我的学习过程