当前位置: 首页 > news >正文

学习游制作记录(背包UI以及各种物品的存储)8.12

1.创建物品槽

ItemObject脚本:

    private void OnValidate()//这个函数可以在非运行状态更改对象的属性
{
GetComponent<SpriteRenderer>().sprite=itemData.icon;//直接可以看到物品的图标

        gameObject.name ="Item Object -"+itemData.ItemName;//修改名字
}

创建一个画布,在画布下再建一个图像UI,在图像UI下创建一个文本UI,设置文本在图像的右下角,且偏右显示

创建UI_ItemSlot脚本挂载在图像UI上:

    [SerializeField] private Image image;//图像和文本
[SerializeField] private TextMeshProUGUI textMeshPro;

    public InventoryItem Item;//物品数据
void Start()
{
if(Item != null)//初始化图像和数量
{
image.sprite = Item.data.icon;
}

        if(Item.stackSize>1)
{
textMeshPro.text =Item.stackSize.ToString();
}

        else
{
textMeshPro.text = " ";
}
}

2.实现背包里存放物品并排序显示

UI_ItemSlot脚本:

    public void UpdataSlot(InventoryItem _newItem)//传入物品类
{
Item = _newItem;

        image.color = Color.white;//没有物品时槽是透明的

        if (Item != null)
{
image.sprite = Item.data.icon;
}

        if (Item.stackSize > 1)
{
textMeshPro.text = Item.stackSize.ToString();
}

        else
{
textMeshPro.text = " ";
}
}

Inventory脚本:

为所有物品槽创建一个父对象,并给它挂载Gird layout Group组件,它可以自然分配子物体的位置

    [Header("Inventory UI")]
[SerializeField] private Transform InventorySlotParent;//槽位的父对象
private UI_ItemSlot[] itemSlot;//物品槽的数组

    private void UpdataSlotUI()//在添加和减少的函数里调用
{
for (int i = 0; i < inventoryItems.Count; i++)//检查列表所有物品类
{

            itemSlot[i].UpdataSlot(inventoryItems[i]);

        }
}

3.实现装备类的物品数据

ItemData脚本:

public enum ItemType//第一个分类——材料与装备
{
Material,
Equipment
}

创建ItemData_Equipment脚本:

public enum EquiomentType //装备的分类——武器,护甲,饰品和药水
{
Weapon,
Armor,
Amulet,
Flask
}

[CreateAssetMenu(fileName = "New Item Data", menuName = "Data/Equipment")]
public class ItemData_Equipment : ItemData
{
public EquiomentType equipmentType;
}

利用上述脚本创建几个物品

4.实现分类存储

将装备和材料分开存储

Inventory脚本:

    [SerializeField] public List<InventoryItem> stash;//仿照之前的方法重写一遍即可
public Dictionary<ItemData,InventoryItem> stashItemsDictionary; 

    [SerializeField] private Transform stashSlotParent;
private UI_ItemSlot[] stashSlot;

    private void UpdataSlotUI()
{
for (int i = 0; i < inventory.Count; i++)
{

            itemSlot[i].UpdataSlot(inventory[i]);

        }

        for(int i = 0;i< stash.Count;i++)//更新材料的存储
{
stashSlot[i].UpdataSlot(stash[i]);
}
}

    public void AddItem(ItemData _item)
{
if (_item.itemType == ItemType.Equipment)
{
AddToInventory(_item);

        }
else if( _item.itemType == ItemType.Material)
{
AddToStash(_item);//添加方法与之前类似,这里不作赘述
}

        UpdataSlotUI();
}

    public void RemoveItem(ItemData _item)//移除同理
{
if (_item.itemType == ItemType.Equipment)
{
RemoveInventory(_item);

        }

        else if( _item.itemType == ItemType.Material)
{
RemoveStash(_item);
}


        UpdataSlotUI();
}

只需要再创建一个槽位的父对象即可

http://www.dtcms.com/a/328513.html

相关文章:

  • kafka 消费者组的概念是什么?它是如何实现消息的点对点和发布/订阅模式?
  • Supabase快速入门与实战指南
  • LangChain 入门学习
  • Spring AI Alibaba - 聊天机器人快速上手
  • SpringAI 使用通义千问进行聊天对话开发
  • 考研复习-计算机组成原理-第五章-CPU
  • [NoC]Outstanding和Credit的概念详解
  • Fluent Bit 日志合并正则表达式(上)
  • Nginx 高级配置
  • Python训练Day41
  • 基于PAI-ChatLearn的GSPO强化学习实践
  • LLM - 搭建 Grounded SAM 2 模型的视觉检测与分割服务 API
  • CMake笔记:PUBLIC/PRIVATE/INTERFACE的使用
  • FreeRTOS---基础知识6---事件组
  • Effective C++ 条款37:绝不重新定义继承而来的缺省参数值
  • Linux系统编程Day13 -- 程序地址空间
  • Vue3 整合高德地图完成搜索、定位、选址功能,已封装为组件开箱即用(最新)
  • 前端对接豆包AI(vue3+TS版本)
  • 力扣-739.每日温度
  • Leetcode-138. 复制带随机指针的链表
  • AI智能体的“四大支柱”:CAP框架核心层、执行层、约束层、操作层详解​
  • 手机蓝牙无感开锁在智能柜锁与智能箱包中的整体解决方案
  • Iptables 详细使用指南
  • 10-docker基于dockerfile自动制作镜像
  • 计算机网络摘星题库800题笔记 第5章 传输层
  • Ansible 详细笔记
  • _init__.py的作用
  • 电路板的GND与外壳地EARTH通过电容电阻相连
  • 操作系统1.6:虚拟机
  • 图形设计器-Qt Designer (一)包含 LinuxCNC 小部件