一、搭建场景
可参考
二、创建物品信息
(游戏中控制所有可交互的物品的业务中心InventoryManager,场景中的游戏物品Item,背包里的物品Slot,一般在游戏制作时的命名规则)
(一)物品的分类
1、创建一个枚举变量对场景中的物品(Item)进行分类,一般可以分为装备类,药品类等,其中装备又可以分为盔甲和武器等
2、创建ScriptableObject类
using UnityEngine;
[CreateAssetMenu(menuName = "装备/物品")]
public class ItemSO : ScriptableObject
{
public Sprite itemSprite;//物品图片
public EquipType equipType;//物品类型
public string itemName;//物品名称
[TextArea(4,4)]//Text的特性,可以自定义书写范围的大小
public string details;//物品简介
public string ID;//生成时创建一个ID
public float addDefand;//装备提高的防御力
public float addDamage;//装备提高的伤害
public float addMaxHp;//装备提高最大血量
public float recoverHp;//装备回血量
}
在获取物品时,需要知道它是否是第一次获得,所以需要在获取时创建一个ID具体使用方法。下方会有介绍
3、创建ScriptableObject
这里的名称和路径可以自行命名,创建后可在Inspector窗户中查看可配置信息
4、配置物品信息
这里就展示两种,其他可以自行配置,请各种类型的都配置一种
5、创建场景中物体的Prefab,并创建代码Item,将其挂载在Prefab上
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Item : MonoBehaviour
{
public ItemSO itemSO;
}
6、给每一个Prefab挂载一个触发器(Trigger)只有这样,Player才可以触发它
(二)创建生成在背包里的Slot预制体
1、创建Slot代码挂载在预制体上
public class Slot : MonoBehaviour=
{
public Image slotImage;
public ItemSO slotItemSO;//生成后传递过来
}
三、逻辑处理
(要实现的结果——当玩家触碰到场景中的Item时,会销毁掉它,并在背包中生成一个拥有它所有信息的Slot)
(一)创建业务中心InventroyManager
1、将其写成单例模式便于后续的使用和调取
public class InventoryManager : MonoBehaviour
{
private static InventoryManager instance;
public static InventoryManager Instance => instance;
private void Awake()
{
if(instance != null)
{
Destroy(this);
}
else
{
instance = this;
}
}
2、创建用于获取背包组件的代码BagManager(这个代码仅用于获取组件和一些简单的按钮功能,挂载在与InventoryManager相同的游戏物体上)
先获取以下组件
public Text level;
public Text hp;
public Text damage;
public Text defand;
public Text slectItemName;
public Text slectItemDetails;
[Header("------")]
public Text recoverHp;
public Text addHp;
public Text addDamage;
public Text addDefand;
[Header("------")]
public Transform weapons;//背包武器生成位置
public Transform equips;//装备生成位置
public Transform medicines;//药品生成位置
public Slot slotPre;
[Header("------")]//in bag
public List<ItemSO> packageList = new List<ItemSO>();
3、实现当玩家触碰到场景中的Item时,生成一个Slot在背包中
(1)在InventoryManager中获取到BagManager(要使用一个类中的参数一定要先获取它)
[HideInInspector]public BagManager bagManager;
private void Awake()
{
if(instance != null)
{
Destroy(this);
}
else
{
instance = this;
}
bagManager = GetComponent<BagManager>();
}
(2)创建一个静态方法CreatSlotItem并传递一个参数Item,具体代码如下,由于类型很多,所以使用Switch语句最佳
public static void CreatSlotItem(Item item)//判断物品类型,生成Slot在不同位置
{
Slot newSlot = null;//临时变量
switch (item.itemSO.equipType)
{
case EquipType.helmet :
newSlot = Instantiate(instance.bagManager.slotPre,instance.bagManager.equips);
break;
case EquipType.armor :
newSlot = Instantiate(instance.bagManager.slotPre,instance.bagManager.equips);
break;
case EquipType.bracer :
newSlot = Instantiate(instance.bagManager.slotPre,instance.bagManager.equips);
break;
case EquipType.kneecap :
newSlot = Instantiate(instance.bagManager.slotPre,instance.bagManager.equips);
break;
case EquipType.weapon :
newSlot = Instantiate(instance.bagManager.slotPre,instance.bagManager.weapons);
break;
case EquipType.medicine :
newSlot =Instantiate(instance.bagManager.slotPre,instance.bagManager.medicines);
break;
}
instance.bagManager.packageList.Add(item.itemSO);//添加到列表中
newSlot.slotImage.sprite = item.itemSO.itemSprite;
newSlot.slotItemSO = item.itemSO;//生成时传递Slot;
}
(3)在Item中执行
这样就实现了当玩家触碰到物品时,会销毁场景中的Item并在背包中生成一个Slot,实现了玩家获取物品的效果
注意:这一切的基础是你已经完成了一个游戏背包场景的搭建