仓库物品与装备物品替换

news2025/1/12 4:07:29

思路

1、创建UI面板以承载仓库中的物品和已装备的物品,以及物品名称和物品描述;

2、创建ItemData.cs装载物品的缩略图、描述并创建ItemData对象

3、创建一个脚本,声明并定义承载ItemData对象的数组、承载缩略图的数组。

4、显示缩略图、文本

5、实现物品交换

6、创建鼠标进、出和点击事件,分别用来显示相应物体名称、描述、缩略图和物品交换

实例

一、创建UI面板

含有物品栏、已装备物品、物品名和物品信息文本

二、创建ItemData对象

1、创建ItemData.cs,声明ItemData对象的属性

[CreateAssetMenu(menuName ="Items/Item")]
public class ItemData : ScriptableObject
{
    public string description;
    public Sprite thumbnail;
    public GameObject gameModle;
}

2、创建ItemData.cs的子类EquipmentData.cs,增加类型属性

[CreateAssetMenu(menuName = "Items/Equipment")]
public class EquipmentData : ItemData
{
    public enum ToolType
    {
        Hoe, WateringCan, Axe, Pickaxe
    }
    public ToolType toolType;
}

二者可以合并为:

[CreateAssetMenu(menuName ="Items/Item")]
public class ItemData : ScriptableObject
{
    public string description;
    public Sprite thumbnail;
    public GameObject gameModel;

    public enum ToolType
    {
        Hoe, WateringCan, Axe, Pickaxe
    }
    public ToolType toolType;
}

 3、在Unity中,创建各ItemData对象,分配各ItemData对象的物品信息(缩略图、描述、类型等)

三、分配ItemData对象

1、创建Manager空物体,添加InventoryManager.cs组件,设置单例

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using static InventorySlot;

public class InventoryManager : MonoBehaviour
{
    public static InventoryManager Instance { get; private set; }
    private void Awake()
    {
        if (Instance != null && Instance != this){ Destroy(this); }
        else { Instance = this; }
    }
}

2、编辑InventoryManager.cs,创建ItemData对象数组(物品栏中的物品)和ItemData对象

//ItemData对象数组(物品栏中的物品)
public ItemData[] tools = new ItemData[8];
//装备槽中已装备的物品
public ItemData equippedTool = null;

3、在Unity中为tools数组(物品栏中的物品)分配ItemData对象

4、目的:可以通过引用InventoryManager类,直接调用ItemData类的物品的物品信息

四、显示UI物品缩略图

1、直接显示手持物品槽中物品的缩略图(本实例中UI未设置)

(1) 给Manage添加UIManager.cs组件,设置单例

    public static UIManager Instance { get; private set; }
    private void Awake()
    {
        if (Instance != null && Instance != this) { Destroy(this);}
        else{ Instance = this; }
    }

(2)  编辑UIManager.cs,添加显示缩略图的方法,并在Start方法中调用这个方法

//手持物品的物品槽中的子物体的图片(缩略图)
public Image toolEquipSlotImage;

private void Start()
{
    RenderInventory();
}

public void RenderInventory()
{
    //临时变量equippedTool(手持物品)
    ItemData equippedTool = InventoryManager.Instance.equippedTool;
    if(equippedTool != null)
    {
        toolEquipSlotImage.sprite = equippedTool.thumbnail;
        toolEquipSlotImage.gameObject.SetActive(true);
        return;
    }
    toolEquipSlotImage.gameObject.SetActive(false);
}

2、显示已装备物品的缩略图(后续更改为添加InventorySlot.cs子类HandInventorySlot.cs组件)

(1) 给已装备物品槽(见UI面板图)添加InventorySlot.cs组件,创建一个单独的显示缩略图的方法

    //待显示的ItemData对象
    ItemData itemToDisplay;

    //待显示物品的的子物体
    public Image itemDisplayImage;

    public void Display(ItemData itemToDisplay)
    {
        if (itemToDisplay != null && itemToDisplay.thumbnail != null)
        {
            itemDisplayImage.sprite = itemToDisplay.thumbnail;
            this.itemToDisplay = itemToDisplay;
            itemDisplayImage.gameObject.SetActive(true);
            return;
        }
        itemDisplayImage.gameObject.SetActive(false);
        this.itemToDisplay = null;
    }

(2) 新建HandInventorySlot.cs

public class HandInventorySlot : InventorySlot

(3) 编辑UIManager.cs,添加显示缩略图的方法

    //已装备物品(物品栏旁边的装备栏)
    public HandInventorySlot toolHandSlot;
    public void RenderInventory()
    {
        //显示已装备物品缩略图
        toolHandSlot.Display(InventoryManager.Instance.equippedTool);
    }

3、显示物品栏中的物品的缩略图

(1) 编辑预制体InventorySlot,添加InventorySlot.cs组件(每个物品栏中的物品都能显示自己的缩略图)

(2) 编辑UIManager.cs,创建预制体InventorySlot数组(组成物品栏中的物品)

public InventorySlot[] toolSlots;

(3) 在UIManager.cs中创建RenderInventoryPanel方法,显示物品栏中物品对应的缩略图

void RenderInventoryPanel(ItemData[] slots, InventorySlot[] uiSlots)
{
    for (int i = 0; i < uiSlots.Length; i++)
    {
        uiSlots[i].Display(slots[i]);
    }
}

(4) 编辑UIManager.cs中的RenderInventory方法,调用RenderInventoryPanel方法(注意参数)

public void RenderInventory()
{
    ItemData[] inventoryToolSlot = InventoryManager.Instance.tools;
    RenderInventoryPanel(inventoryToolSlot, toolSlots);
}
五、显示文本

1、编辑UIManager.cs,添加显示文本的方法

public Text itemNameText;
public Text itemDescriptionText;

public void DisplayItemInfo(ItemData data)
{
    if(data == null)
    {
        itemNameText.text = "";
        itemDescriptionText.text = "";
        return;
    }
    itemNameText.text = data.name;
    itemDescriptionText.text = data.description;
}

2、编辑InventorySlot.cs,设置鼠标悬停,调用DisplayItemInfo方法显示文本

public class InventorySlot : MonoBehaviour, IPointerEnterHandler, IPointerExitHandler

{
    ItemData itemToDisplay;

    public void OnPointerEnter(PointerEventData eventData)
    {
        UIManager.Instance.DisplayItemInfo(itemToDisplay);
    }

    public void OnPointerExit(PointerEventData eventData)
    {
        UIManager.Instance.DisplayItemInfo(null);
    }
}
六、实现物品交换

1、编辑InventorySlot.cs,为物品栏中的物品分配索引值

//物品栏中被点击的物品的索引
int slotIndex;
//分配索引
public void AssignIndex(int slotIndex)
{
    this.slotIndex = slotIndex;
}

2、编辑UIManager.cs,为物品栏中各物品分配索引值,并在Start方法中调用分配索引值的方法

public InventorySlot[] toolSlots;
private void Start()
{
    AssignSlotIndex();
}
public void AssignSlotIndex()
{
    for (int i = 0; i < toolSlots.Length; i++)
    {
        toolSlots[i].AssignIndex(i);
    }
}

3、编辑InventoryManager.cs,创建物品由物品栏到装备栏的方法

public void InventoryToHand(int slotIndex)
{
        //取出物品栏中的物品(在位置A)缓存到toolToEquip这个临时变量(临时位置)中
        ItemData toolToEquip = tools[slotIndex];
        //把已装备的物品转移到移出的物品的位置(位置A)上
        tools[slotIndex] = equippedTool;
        //把临时变量中的物品从临时位置转移到装备物品的位置上
        equippedTool = toolToEquip;
        //更新物品缩略图
        UIManager.Instance.RenderInventory();
}

4、编辑InventorySlot.cs,增加点击事件

public class InventorySlot : MonoBehaviour, IPointerEnterHandler, IPointerExitHandler,IPointerClickHandler
{
public virtual void OnPointerClick(PointerEventData eventData)
{
    InventoryManager.Instance.InventoryToHand(slotIndex);
}
}

5、编辑InventoryManager.cs,创建物品由装备栏到物品栏的方法

    public void HandToInventory()
    {
            for(int i = 0;i < tools.Length; i++)
            {
                if(tools[i] == null)
                {
                    tools[i] = equippedTool;
                    equippedTool = null;
                    break;
                }
            }
            UIManager.Instance.RenderInventory();
    }

6、编辑HandInventorySlot.cs,设置点击已装备物品时,调用覆盖步骤4的点击事件的方法

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
using static InventorySlot;
public class HandInventorySlot : InventorySlot
{
    public override void OnPointerClick(PointerEventData eventData)
    {
        InventoryManager.Instance.HandToInventory();
    }
}

编辑UIManager.cs,设置显示已装备物品

public void RenderInventory()
{
    ItemData[] inventoryToolSlot = InventoryManager.Instance.tools;
    RenderInventoryPanel(inventoryToolSlot, toolSlots);

    // 显示已装备物品缩略图
    toolHandSlot.Display(InventoryManager.Instance.equippedTool);
}
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1968869.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

6.key的层级结构

redis的key允许多个单词形成层级结构&#xff0c;多个单词之间用:隔开&#xff0c;格式如下&#xff1a; 项目名:业务名:类型:id 这个格式并非固定的&#xff0c;可以根据自己的需求来删除或添加词条。 例如&#xff1a; taobao:user:1 taobao:product:1 如果value是一个java对…

【Golang 面试 - 进阶题】每日 3 题(十一)

✍个人博客&#xff1a;Pandaconda-CSDN博客 &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/UWz06 &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 Golang 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞&#x1f44d;收藏…

提升SEO排名的谷歌外链策略

​要提升SEO排名&#xff0c;谷歌外链策略必须聚焦于外链数量和质量的合理搭配。市场上那些SEO表现优秀的网站&#xff0c;无一例外地拥有数万甚至数十万的外链&#xff0c;而且这些外链在结构上表现出复杂和多样化。这不仅仅是因为数量众多&#xff0c;还因为这些外链质量的高…

酷家乐--应用频繁报出cause java.net.SocketTimeoutException: Read timed out怎么办

涉及到网络层面的问题一般都比较复杂&#xff0c;场景多&#xff0c;定位难&#xff0c;成为了大多数开发的噩梦&#xff0c;应该是最复杂的了。下面通过一个实际的例子来阐述遇到了要怎么办。 现象 部署在矩阵机房的较多应用频繁报出toad异常&#xff0c;Encounter unknown …

嵌入式学习第13天——C语言循环结构break和continue

break和continue break 功能&#xff1a; 1.用在switch中&#xff0c;用来跳出switch的case语句;如果case没有break&#xff0c;可能会产生case穿透。 2.用在循环中(while、do..while、for..)&#xff0c;提前结束循环&#xff0c;也就是跳出整个循环。 说明&#xff1a; …

spring的三级缓存与源码分析--解决循环依赖

三级缓存介绍 Spring 通过三层缓存来处理循环依赖&#xff0c;这些缓存分别是&#xff1a; 一级缓存&#xff08;内存中的 singletonObjects&#xff09; 二级缓存&#xff08;earlySingletonObjects&#xff09; 三级缓存&#xff08;singletonFactories&#xff09; 1. 一…

深入理解C语言结构体

目录 引言 一. 结构体的基本概念 1.结构体的声明 2. 结构体变量的创建和初始化 3. 结构体成员访问操作符 4.结构体的特殊声明 1. 匿名结构体 2. 嵌套结构体 3.结构体自引用 4. typedef 声明 二、结构体内存对⻬ 1.对⻬规则 2.为什么存在内存对⻬? 3.修改默认对齐…

ffmpeg命令-Windows下常用最全

查询命令 参数 说明 -version 显示版本。 -formats 显示可用的格式&#xff08;包括设备&#xff09;。 -demuxers 显示可用的demuxers。 -muxers 显示可用的muxers。 -devices 显示可用的设备。 -codecs 显示libavcodec已知的所有编解码器。 -decoders 显示可用…

基于SpringBoot+Vue的小区物业管理系统(带1w+文档)

基于SpringBootVue的小区物业管理系统(带1w文档) 基于SpringBootVue的小区物业管理系统(带1w文档) 小区物业管理系统采用B/S(Browser/Server)架构和MVC模型进行设计开发。在B/S架构下&#xff0c;用户在浏览器端进行使用&#xff0c;主要工作通过服务器端进行实现&#xff0c;用…

电脑缺少dll文件怎么解决?10款dll修复工具大盘点,赶紧收藏起来!

电脑缺少dll文件怎么解决&#xff1f;DLL&#xff08;动态链接库&#xff09;是一种重要文件&#xff0c;包含了一系列指令&#xff0c;用于运行几乎所有 Win10、Win8和 Win7的程序。如果Windows 操作系统中缺少DLL文件&#xff0c;您可能会无法启动所需的程序或应用。在 Win10…

【AndroidStudio】修改app名称、版本号、图标

文章目录 1. 修改app名称(AndroidManifest.xml-app_name字段)2. 修改app版本号和版本名称3. 修改app图标4. 修改app启动过渡图片 1. 修改app名称(AndroidManifest.xml-app_name字段) 2. 修改app版本号和版本名称 通常是app目录下的build.gradle文件找到“versionCode”和“ver…

基于域名+基于ip+基于端口的虚拟主机+上线商务系统

一、回顾 1.jdk环境 tomcat服务器需要jdk环境 版本对应 ​ tomcat9>jdk1.8 配置系统变量JAVA_HOME sed -i $aexport JAVA_HOME/usr/local/jdk22/ /etc/profile sed -i $aexport PATH$JAVA_HOME/bin:$PATH /etc/profile ​ source /etc/profile ​ java -version java…

LeetCode | 441 | 排列硬币 | 二分查找

&#x1f64b;大家好&#xff01;我是毛毛张! &#x1f308;个人首页&#xff1a; 神马都会亿点点的毛毛张 今天分享的是LeetCode中一道标签为简单的算法题&#xff0c;本质是一道数学题 文章目录 1.题目描述2.题解2.1 公式解法2.2 暴力解法2.3 二分查找 LeetCode链接&#…

【 问题 】 AT32 F413CB 设置SRAM大小为64KB 导致Flash后64KB代码执行变慢 解决办法

背景 AT32的SRAM可以设置为16KB/32KB/64KB的不同大小&#xff0c;设置SRAM大小将导致Flash的部分空间的读写速度减缓&#xff0c;如下图&#xff1a; 这个问题看似不是很大&#xff0c;但是当运行一些很保证实时性&#xff0c;速度性的代码时&#xff0c;就会产生一些问题。 …

react-日期选择器封装

文件 import { useMemo, useState, useEffect } from "react" import dayjs, { Dayjs } from "dayjs" import "dayjs/locale/zh-cn" import "./App.css" dayjs.locale("zh-cn")function SimpleCalendar() {// 当前时间对象…

【数值计算方法】数值积分微分-python实现-p2

原文链接&#xff1a;https://www.cnblogs.com/aksoam/p/18279394 更多精彩&#xff0c;关注博客园主页&#xff0c;不断学习&#xff01;不断进步&#xff01; 我的主页 csdn很少看私信&#xff0c;有事请b站私信 博客园主页-发文字笔记-常用 有限元鹰的主页 内容&#xf…

基于ThinkPHP开发的校园跑腿社区小程序系统源码,包含前后端代码

基于ThinkPHP开发的校园跑腿社区小程序系统源码&#xff0c;包含前后端代码 最新独立版校园跑腿校园社区小程序系统源码 | 附教程 测试环境&#xff1a;NginxPHP7.2MySQL5.6 多校版本&#xff0c;多模块&#xff0c;适合跑腿&#xff0c;外卖&#xff0c;表白&#xff0c;二…

【Android】Kotlin 实现底部弹框日历组件

需求 如下图所示, 底部弹出日历组件 原生插件使用的有一个好处是可以根据你的系统语言切换插件内的语言, 刚好我们这个app面向的国外用户, 而产品对日历组件的日期显示有特别要求, 因此这无疑减少了我们切换语言的开发工作量 代码 1. custom_bottom_datepicker.xml <R…

Java小白入门到实战应用教程-权限修饰符

Java小白入门到实战应用教程-权限修饰符 前言 在前面的内容中我们其实已经接触到了权限修饰符&#xff1a;public 在java中权限修饰符除了public外&#xff0c;还有private、protected、默认权限。 权限修饰符可用来修饰类、成员变量、方法(函数)。 其中修饰类只能用publi…

springboot的表现层/控制层controller开发

第一步&#xff1a;新建文件和注入业务层对象 需要使用的注解&#xff1a; 第一个声明是restful风格开发 第二个是需要设置网页访问路径 RestController RequestMapping("/fuels")//http://localhost/fuels注入服务层对象&#xff1a; Autowiredprivate FuelServ…