Unity UGUI背包系统(三) 之 实现物品存储到背包
1、把UI“GridPanel”下子物体“GridImage”全部赋值给脚本“GridPanel”的“Grids”,具体如下图
2、删除场景中的“ItemImage”,给预制体“ItemImage”下的“IitemText”赋值给预制体“ItemImage”上的脚本“ItemImage”的“itemText”,具体如下图
3、在文件夹“Scripts”下新建一个脚本“KnapsackManager”,然后双击脚本或者右键“Open C# Project”打开脚本,具体如下图
4、在打开的“KnapsackManager”脚本上编写代码,首先设置变量获取“GridPanel”脚本,设置字典存储物品信息,并实现脚本单例化,然后实现存储物品的接口函数,函数中包含判断物品是否是字典里面的物品,判断背包是否满了,最后把物品生成到背包里,接着实现模拟数据库加载数据,被物品信息存到字典中,具体代码和代码说明如下图
5、“KnapsackManager”脚本的具体内容如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class KnapsackManager : MonoBehaviour {
public GridPanel gridPanel;
private Dictionary<int, Item> itemList;
private static KnapsackManager instance;
public static KnapsackManager Instance {
get {
return instance;
}
}
void Awake() {
instance = this;
this.LoadData();
}
public void StoreItem(int itemId) {
if (!itemList.ContainsKey(itemId)) {
return;
}
Transform emptyGrid = gridPanel.GetEmptyGrid();
if (emptyGrid == null) {
Debug.Log("背包已满");
return;
}
Item item = itemList[itemId];
GameObject itemPrefab = Resources.Load<GameObject>("Prefabs/ItemImage");
itemPrefab.GetComponent<ItemImage>().UpdateItem(item.Name);
GameObject itemGo = GameObject.Instantiate(itemPrefab);
itemGo.transform.SetParent(emptyGrid);
itemGo.transform.localPosition = Vector3.zero;
itemGo.transform.localScale = Vector3.one;
}
//模拟数据库数据加载
private void LoadData() {
itemList = new Dictionary<int, Item>();
Weapon w1 = new Weapon(0, "牛刀", "牛B的刀", 20, 10, "", 100);
Weapon w2 = new Weapon(1, "羊刀", "杀羊刀。", 15, 10, "", 20);
Weapon w3 = new Weapon(2, "宝剑", "大宝剑!", 120, 50, "", 500);
Weapon w4 = new Weapon(3, "军枪", "可以对敌人射击,很厉害的一把枪。", 1500, 125, "", 720);
Consumable c1 = new Consumable(4, "红瓶", "加血", 25, 11, "", 20, 0);
Consumable c2 = new Consumable(5, "蓝瓶", "加蓝", 39, 19, "", 0, 20);
Armor a1 = new Armor(6, "头盔", "保护脑袋!", 128, 83, "", 5, 40, 1);
Armor a2 = new Armor(7, "护肩", "上古护肩,锈迹斑斑。", 1000, 0, "", 15, 40, 11);
Armor a3 = new Armor(8, "胸甲", "皇上御赐胸甲。", 153, 0, "", 25, 30, 11);
Armor a4 = new Armor(9, "护腿", "预防风寒,从腿做起", 999, 60, "", 19, 30, 51);
itemList.Add(w1.Id, w1);
itemList.Add(w2.Id, w2);
itemList.Add(w3.Id, w3);
itemList.Add(w4.Id, w4);
itemList.Add(c1.Id, c1);
itemList.Add(c2.Id, c2);
itemList.Add(a1.Id, a1);
itemList.Add(a2.Id, a2);
itemList.Add(a3.Id, a3);
itemList.Add(a4.Id, a4);
}
}
6、脚本编译正确,回到Unity界面,把脚本拖到UI“KnapsackUI”上,并把UI“GridPanel”赋值给脚本的“Grid Panel”变量,由于使用“Resources.Load”加载预制体,所以记得把预制体放在新建的“Resources”文件夹下,具体如下图
7、在“Scripts”文件夹下新建脚本“InputDetector”模拟物品拾取,双击脚本或者右键“Open C# Project”,打开脚本,具体如下图
8、在打开的“InputDetector”脚本上编辑代码,在Update函数下按下“鼠标中键”模拟物体随机拾取,具体的代码及代码说明如下图
9、“InputDetector”脚本的具体内容如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class ItemImage : MonoBehaviour {
public Text itemText;
//本节以字体为例
public void UpdateItem(string name) {
itemText.text = name;
}
//实际多是图片,可以使用这个更新图片
[HideInInspector]
public Image itemImage;
public void UpdateItemImage(Sprite icon)
{
itemImage.sprite = icon;
}
}
10、脚本编译正确,回到Unity界面,把脚本拖给主摄像机“MainCamera”,具体如下图
11、运行场景,按下鼠标中键,即可看到游戏视图中,背包添加了物品,连续按下中间,但满了的时候,控制台Console提示背包已满信息,具体如下图
12、到此,《Unity UGUI背包系统(三) 之 实现物品存储到背包》讲解结束,谢谢