Unity背包系统一:实现物品获取效果

本文介绍了如何在Unity中搭建游戏场景,创建物品分类、ScriptableObject、Item和Slot预制体,以及逻辑处理部分的InventoryManager实现。通过单例模式管理物品获取和背包生成,详细描述了物品类型区分和背包组件的设置,以实现在玩家触碰场景物品时销毁并生成背包中的对应Slot。
摘要由CSDN通过智能技术生成


点击查看目前已实现效果

一、搭建场景

可参考
在这里插入图片描述

二、创建物品信息

(游戏中控制所有可交互的物品的业务中心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,实现了玩家获取物品的效果


注意:这一切的基础是你已经完成了一个游戏背包场景的搭建

  • 32
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值