Unity2D初级背包设计后篇 拓展举例与不足分析

Unity2D初级背包设计中篇 MVC分层撰写(万字详解)-CSDN博客、

如果你已经搞懂了中篇,那么对这个背包的拓展将极为简单,我就在这里举个例子吧

目录

1.添加物品描述信息

2.拓展思路与不足分析

        1.没有删除只有丢弃功能,所以可以添加垃圾桶

        2.格子有限,可以再做的大一些,也可以添加翻页功能

3.排序与分类功能

4. 逻辑层再封装

5.背包存储可以转为json而不再是让编辑器保存


1.添加物品描述信息

M层修改:

统一到SoltData之中获得 

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

[Serializable]
public class SlotData {
    public ItemData item;
    public int currentCount = 0; // 物品数量

    private Action OnChange;

    #region 增(Add)

    // 添加物品到槽位
    public void Add(int numToAdd = 1) {
        this.currentCount += numToAdd;
        OnChange?.Invoke();
    }

    // 设置槽位的物品和数量
    public void AddItem(ItemData item, int count = 1) {
        this.item = item;
        this.currentCount = count;
        OnChange?.Invoke();
    }

    #endregion

    #region 删(Remove)

    // 减少槽位中的物品数量
    public void Reduce(int numToReduce = 1) {
        currentCount -= numToReduce;
        if (currentCount == 0) {
            Clear();
        }
        else {
            OnChange?.Invoke();
        }
    }

    // 清空槽位
    public void Clear() {
        item = null;
        currentCount = 0;
        OnChange?.Invoke();
    }

    #endregion

    #region 查(Check)

    // 检查槽位是否为空
    public bool IsEmpty() {
        return currentCount == 0;
    }

    // 检查槽位是否可以添加物品
    public bool CanAddItem() {
        return currentCount < item.maxCount;
    }

    // 获取槽位的空余空间
    public int GetFreeSpace() {
        return item.maxCount - currentCount;
    }

    #endregion

    #region 改(Update)

    // 移动槽位数据
    public void MoveSlot(SlotData data) {
        this.item = data.item;
        this.currentCount = data.currentCount;
        OnChange?.Invoke();
    }

    // 添加监听器
    public void AddListener(Action OnChange) {
        this.OnChange = OnChange;
    }

    //获取物品描述
    public string GetDescription() {
        return item.Description;
    }
    #endregion
}

V层修改:

背包UI持有该描述的组件 因此将显示和隐藏写到BagUI类 

using System.Collections.Generic;
using TMPro;
using Unity.VisualScripting;
using UnityEngine;
using UnityEngine.UI;

public class BagUI : MonoBehaviour {
    [SerializeField] private Button close;
    [SerializeField] private GameObject BG;
    [SerializeField] private GameObject slotGrid;
    [SerializeField] private List<SlotUI> soltuiList = new List<SlotUI>();
    [SerializeField] private TextMeshProUGUI DText;

    // Start is called once before the first execution of Update after the MonoBehaviour is created
    void Start() {
        InitElement();
        InitSlotUI();
       
    }

    // Update is called once per frame
    void Update() {
        ColseBag();
    }
    public void InitElement() {
        if(BG==null)
        BG = transform.Find("BG").gameObject;
        if (close == null)
        close = transform.Find("BG/BgElement/Close").GetComponent<Button>();
        if(slotGrid)
        slotGrid = transform.Find("BG/SlotGrid").gameObject;

        if (close != null) {
            close.onClick.AddListener(() => {
                if (BG != null)
                    BG.SetActive(!BG.activeSelf);
                else {
                    Debug.LogWarning("没找到BG对象");
                    return;
                }
            });
        }
        else
            Debug.LogWarning("没有加载到close按钮");

    }

    public void UpdataUI() {
        for (int i = 0; i < InventoryManager.Instance.BagInventory.slotList.Count; i++) {
            soltuiList[i].SetData(InventoryManager.Instance.BagInventory.slotList[i]);
        }
    }

    public void InitSlotUI() {
        if (slotGrid != null) {
            foreach (SlotUI slotUi in slotGrid.GetComponentsInChildren<SlotUI>()) {
                soltuiList.Add(slotUi);
            }
        }
        UpdataUI();
    }


    public void ColseBag() {
        if (Input.GetKeyDown(KeyCode.Tab))
            BG.SetActive(!BG.activeSelf);
    }

    public void ShowDescription(string description) {
        DText.gameObject.SetActive(true);

        DText.text = description;
    }
    public void HideDescription() {
        DText.gameObject.SetActive(false);
        DText.text = "";
    }

}

        之后当鼠标移入SoltUI之后,触发上面两种方法 ,这里可以采用事件发送的方法,也可以直接去持有对象

        

using System;
using TMPro;
using Unity.VisualScripting;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.EventSystems;
using UnityEngine.UI;

public class SlotUI : MonoBehaviour,IPointerClickHandler,IPointerEnterHandler, IPointerExitHandler {
    protected SlotData slotData;
    
    protected Image icon;
    protected TextMeshProUGUI num;

   [SerializeField]private BagUI bagUI;

    private void Start() {
       
        icon = transform.Find("icon").GetComponent<Image>();
        num = transform.Find("num").GetComponent<TextMeshProUGUI>();
    
    }
    public SlotData GetData(){ 
        return slotData;
    }

    /// <summary>
    /// 为该脚本上的对象赋值一个SlotData
    /// </summary>
    public void SetData(SlotData slotData) { 
        this.slotData = slotData;

        //事件监听 - 订阅者
        slotData.AddListener(UpdateUI2Slot);

        UpdateUI2Slot();
    }

    / <summary>
    / 监听对象
    / </summary>
    //public void ChangeUI(){
    //    UpdateUI2Slot();
    //}

    private void UpdateUI2Slot(){

        if (slotData==null || slotData.item == null || slotData.currentCount <= 0) {
           
            icon.enabled = false;
            num.enabled = false;
        }
        else {
            icon.enabled = true;
            num.enabled = true;
            icon.sprite = slotData.item.itemSprite;
            num.text = slotData.currentCount.ToString();

        }
    }

    public void OnPointerClick(PointerEventData eventData) {
        Debug.Log("发生了点击");
        ItemMoveHandler.Instance.OnSlotClick(this);
    }

    public void OnPointerEnter(PointerEventData eventData) {
        Debug.Log("鼠标进入");
        if (slotData.item != null)
        bagUI.ShowDescription(slotData.GetDescription());
    }

    public void OnPointerExit(PointerEventData eventData) {
        Debug.Log("鼠标离开");
        if (slotData.item != null)
            bagUI.HideDescription();
    }
}

 

2.拓展思路与不足分析

        1.没有删除只有丢弃功能,所以可以添加垃圾桶

        2.格子有限,可以再做的大一些,也可以添加翻页功能

3.排序与分类功能

这个我将会在通用背包文章之中进行详细解释

4. 逻辑层再封装

因为物品小类自有的枚举工具/消耗品/可捡起的枚举在配置上比较烦

应该做到实时判断,也就是策划只需要给物品配置 ,然后一键导入就行了

    只需要:

    不再需要:

5.背包存储可以转为json而不再是让编辑器保存

以上,2D初级背包结束

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vue(七) vue进阶

目录 第一课&#xff1a;Vue方法、计算机属性及侦听器 一、数组变化侦测 方法1&#xff1a;变更方法 方法2&#xff1a;替换一个数组 例子&#xff1a;小Demo:合并两个数组 二、计算属性 1.基础&#xff08;不推荐&#xff09; 2.使用计算属性来完成案例 3.使用函数的方…

Spring Boot 2 学习指南与资料分享

Spring Boot 2 学习资料 Spring Boot 2 学习资料 Spring Boot 2 学习资料 在当今竞争激烈的 Java 后端开发领域&#xff0c;Spring Boot 2 凭借其卓越的特性&#xff0c;为开发者们开辟了一条高效、便捷的开发之路。如果你渴望深入学习 Spring Boot 2&#xff0c;以下这份精心…

YangQG 面试题汇总

一、交叉链表 问题&#xff1a; 给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点&#xff0c;返回 null 。 解题思想&#xff1a; 双指针 备注&#xff1a;不是快慢指针&#xff0c;如果两个长度相…

fastapi 使用

参考&#xff1a; https://fastapi.tiangolo.com/zh/tutorial/first-steps/https://fastapi.tiangolo.com/zh/tutorial/first-steps/ FastAPI 用于基于标准 Python 类型提示使用 Python 构建 API&#xff0c;使用 ASGI 的标准来构建 Python Web 框架和服务器。所有简单理解&a…

2024年度漏洞态势分析报告,需要访问自取即可!(PDF版本)

2024年度漏洞态势分析报告&#xff0c;需要访问自取即可!(PDF版本),大家有什么好的也可以发一下看看

泛目录和泛站有什么差别

啥是 SEO 泛目录&#xff1f; 咱先来说说 SEO 泛目录是啥。想象一下&#xff0c;你有一个巨大的图书馆&#xff0c;里面的书架上摆满了各种各样的书&#xff0c;每一本书都代表着一个网页。而 SEO 泛目录呢&#xff0c;就像是一个超级图书管理员&#xff0c;它的任务就是把这些…

k8s基础(6)—Kubernetes-存储

Kubernetes-存储概述 k8s的持久券简介 Kubernetes的持久卷&#xff08;PersistentVolume, PV&#xff09;和持久卷声明&#xff08;PersistentVolumeClaim, PVC&#xff09;为用户在Kubernetes中使用卷提供了抽象。PV是集群中的一块存储&#xff0c;PVC是对这部分存储的请求。…

深度学习-卷积神经网络反向传播梯度公式推导

这篇文章非常棒&#xff0c;单样本单通道的反向传播梯度公式推导我都理解了。为了防止找不到原网页&#xff0c;所以特复制于此 参考&#xff1a; https://zhuanlan.zhihu.com/p/640697443

论文笔记(四十七)Diffusion policy: Visuomotor policy learning via action diffusion(下)

Diffusion policy: Visuomotor policy learning via action diffusion&#xff08;下&#xff09; 文章概括5. 评估5.1 模拟环境和数据集5.2 评估方法论5.3 关键发现5.4 消融研究 6 真实世界评估6.1 真实世界Push-T任务6.2 杯子翻转任务6.3 酱汁倒入和涂抹任务 7. 实际双臂任务…

C#学习笔记 --- 简单应用

1.operator 运算符重载&#xff1a;使自定义类可以当做操作数一样进行使用。规则自己定。 2.partial 分部类&#xff1a; 同名方法写在不同位置&#xff0c;可以当成一个类使用。 3.索引器&#xff1a;使自定义类可以像数组一样通过索引值 访问到对应的数据。 4.params 数…

汽车基础软件AutoSAR自学攻略(四)-AutoSAR CP分层架构(3) (万字长文-配21张彩图)

汽车基础软件AutoSAR自学攻略(四)-AutoSAR CP分层架构(3) (万字长文-配21张彩图) 前面的两篇博文简述了AutoSAR CP分层架构的概念&#xff0c;下面我们来具体到每一层的具体内容进行讲解&#xff0c;每一层的每一个功能块力求用一个总览图&#xff0c;外加一个例子的图给大家进…

【2024年华为OD机试】 (CD卷,100分)- 最大N个数与最小N个数的和(Java JS PythonC/C++)

一、问题描述 题目描述 给定一个数组&#xff0c;编写一个函数来计算它的最大N个数与最小N个数的和。你需要对数组进行去重。 说明&#xff1a; 数组中数字范围 [0, 1000]最大N个数与最小N个数不能有重叠&#xff0c;如有重叠&#xff0c;输入非法返回 -1输入非法返回 -1 …

WINFORM - DevExpress -> DevExpress总结[安装、案例]

安装devexpress软件 路径尽量不换&#xff0c;后面破解不容易出问题 vs工具箱添加控件例如: ①使用控制台进入DevExpress安装目录: cd C:\Program Files (x86)\DevExpress 20.1\Components\Tools ②添加DevExpress控件&#xff1a; ToolboxCreator.exe/ini:toolboxcreator…

cursor+deepseek构建自己的AI编程助手

文章目录 准备工作在Cursor中添加deepseek 准备工作 下载安装Cursor &#xff08;默认安装在C盘&#xff09; 注册deepseek获取API key 在Cursor中添加deepseek 1、打开cursor&#xff0c;选择设置 选择Model&#xff0c;添加deepseek-chat 注意这里去掉其他的勾选项&…

《零基础Go语言算法实战》【题目 2-7】defer 关键字特性

《零基础Go语言算法实战》 【题目 2-7】defer 关键字特性 下面代码的输出是什么&#xff1f;请说明原因。 package main import ( "fmt" ) func main() { deferFunc() func deferFunc() { defer func() { fmt.Println("value1") }() defer func() {…

如何规模化实现完全自动驾驶?Mobileye提出解题“新”思路

在CES 2025上&#xff0c;Mobileye展示了端到端自动驾驶系统Mobileye Drive™&#xff0c;通过高度集成的传感器、算法和计算平台&#xff0c;可以实现自动驾驶功能的全覆盖。 Mobileye创始人兼首席执行官Amnon Shashua教授 期间&#xff0c;Mobileye创始人兼首席执行官Amnon …

腾讯云AI代码助手编程挑战赛-智能聊天助手

作品简介 本作品开发于腾讯云 AI 代码助手编程挑战赛&#xff0c;旨在体验腾讯云 AI 代码助手在项目开发中的助力。通过这一开发过程&#xff0c;体验到了 AI 辅助编程的高效性。 技术架构 前端: 使用 VUE3、TypeScript、TDesign 和 ElementUI 实现。 后端: 基于 Python 开发…

超大规模分类(三):KNN softmax

传统的分类损失计算输入数据和每个类别中心的距离&#xff0c;来优化模型的训练。KNN softmax通过选择和输入数据最相关的top-K个类别&#xff0c;仅计算输入数据和top-K个类别中心的距离&#xff0c;以减小计算量。 KNN softmax首次诞生于达摩院机器智能技术实验室发表的SIGKD…

MySQL素材怎么导入Navicat???

不管用什么方法都要先关掉MySQL服务&#xff0c;并且提前备份数据&#xff01; 1.有sql文件时候。 打开navicat&#xff0c;运行sql文件 然后点击后面三个点&#xff0c;选中要运行的sql文件&#xff0c;开始。 鼠标右键刷新一下&#xff0c;就能看到sql文件中的表了 2.没有s…

程序员独立开发竞品分析:确定网站使用什么建站系统

要确定一个网站使用的建站系统&#xff0c;可以通过以下几种方法尝试分析&#xff1a; 查看页面源代码&#xff1a; 打开网站&#xff0c;右键点击页面并选择“查看页面源代码”。在代码中查找一些常见的建站系统标志&#xff0c;例如&#xff1a; WordPress 的迹象&#xff1a…