首页 > 其他分享 >Unity类银河恶魔城学习记录12-7-2 p129 Craft UI - part 2源代码

Unity类银河恶魔城学习记录12-7-2 p129 Craft UI - part 2源代码

时间:2024-04-08 19:32:48浏览次数:21  
标签:12 void item Craft UI using 源代码 data public

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释,可供学习Alex教程的人参考
此代码仅为较上一P有所改变的代码

 



【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili

UI_CraftWindow.cs
using UnityEngine.UI;
using TMPro;
using UnityEngine;
using Unity.VisualScripting;

public class UI_CraftWindow : MonoBehaviour
{
    [SerializeField] private TextMeshProUGUI itemName;
    [SerializeField] private TextMeshProUGUI itemDescription;
    [SerializeField] private Image itemIcon;
    [SerializeField] private Button craftButton;

    [SerializeField] private Image[] materialsImage;

    public void SetUpCraftWIndow(ItemData_Equipment _data)
    {
        craftButton.onClick.RemoveAllListeners();//防止出现点击Button出现其他的函数

        for (int i = 0; i < materialsImage.Length; i++)//将所有的UI设置为clear颜色
        {
            materialsImage[i].color = Color.clear;
            materialsImage[i].GetComponentInChildren<TextMeshProUGUI>().color = Color.clear;
        }

        for(int i = 0;i < _data.craftingMaterials.Count; i++)
        {
            if(_data.craftingMaterials.Count > materialsImage.Length)
            {
                Debug.LogWarning("材料比格子数还多了");
            }

            materialsImage[i].sprite = _data.craftingMaterials[i].data.icon;
            materialsImage[i].color = Color.white;
            TextMeshProUGUI materialsSlotText = materialsImage[i].GetComponentInChildren<TextMeshProUGUI>();

            materialsSlotText.text = _data.craftingMaterials[i].stackSize.ToString();
            materialsSlotText.color = Color.white;
        }

        itemIcon.sprite = _data.icon;
        itemName.text = _data.itemName;
        itemDescription.text = _data.GetDescription();


        craftButton.onClick.AddListener(() => Inventory.instance.CanCraft(_data, _data.craftingMaterials));
    }
}

UI_CraftList.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;

public class UI_CraftList : MonoBehaviour,IPointerDownHandler
{
    
    [SerializeField] private GameObject craftSlotPrefab;//创建craftSlot的预制体
    [SerializeField] private List<ItemData_Equipment> craftEquipment;//一个将要导进craftList的data类型组
    [SerializeField] private Transform craftSlotParent;//便于寻找将要删除的craftSlot的父组件
    //[SerializeField] private UI_CraftSlot[] craftSlots;//暂时保存将要删除的craftSlot

    private void Start()
    {
        //AssignCraftSlots();
        transform.parent.GetChild(0).GetComponent<UI_CraftList>().SetupCraftList();
        SetupDefaultCraftWindow();
    }

    //private void AssignCraftSlots()//获得当前所有的craftSlot函数//主要用来为清空做准备
    //{
    //    craftSlots = craftSlotParent.GetComponentsInChildren<UI_CraftSlot>();
    //}

    public void SetupCraftList()//将所有保存在其中的装备类型实例化craftslot并存入CraftList的函数
    {
        //AssignCraftSlots();

        for (int i = 0; i < craftSlotParent.childCount;i++)//删除所有原来存在于其list里的slot
        {
            Destroy(craftSlotParent.GetChild(i).gameObject);
        }

        //craftSlots = null;//清空此槽,方便下一次装其他的装备

        for(int i = 0;i < craftEquipment.Count;i++)
        {
            GameObject newSlot = Instantiate(craftSlotPrefab, craftSlotParent);//创建的实例往craftPartent里塞
            newSlot.GetComponent<UI_CraftSlot>().SetUpCraftSlot(craftEquipment[i]);
        }
        
    }

    public void OnPointerDown(PointerEventData eventData)
    {
        SetupCraftList();
    }

    public void SetupDefaultCraftWindow()
    {
        if (craftEquipment[0] != null)
        {
            GetComponentInParent<UI>().craftWindow.SetUpCraftWIndow(craftEquipment[0]);
        }
    }
}

UI_CraftSlot.cs
using UnityEngine.EventSystems;

public class UI_CraftSlot : UI_itemSlot
{
    protected override void Start()
    {
        base.Start();


    }

    public void SetUpCraftSlot(ItemData_Equipment _data)//设置CraftSlot的公开函数
    {
        if (_data == null)
            return;
        item.data = _data;
        itemImage.sprite = _data.icon;
        itemText.text = _data.name;

        if(itemText.text.Length > 12)
        {
            itemText.fontSize = 24 * .7f;
        }
        else
        {
            itemText.fontSize = 24;
        }
       
    }
    private void OnValidate()
    {
        //UpdateSlots(item);
    }

    public override void OnPointerDown(PointerEventData eventData)
    {
        ui.craftWindow.SetUpCraftWIndow(item.data as ItemData_Equipment);
    }
}
UI_statslot.cs
using UnityEngine;

public class UI : MonoBehaviour
{
    [SerializeField] private GameObject characterUI;
    [SerializeField] private GameObject skillTreeUI;
    [SerializeField] private GameObject craftUI;
    [SerializeField] private GameObject optionsUI;

    public UI_itemTooltip itemToolTip;
    public UI_statToolTip statToopTip;
    public UI_CraftWindow craftWindow;
    public void Start()
    {
        SwitchTo(null);
        itemToolTip.gameObject.SetActive(false);
        statToopTip.gameObject.SetActive(false);
    }

    private void Update()
    {
        if(Input.GetKeyDown(KeyCode.C))
        {
            SwitchWithKeyTo(characterUI);
        }

        if(Input.GetKeyDown(KeyCode.B))
        {
            SwitchWithKeyTo(craftUI);
        }

        if(Input.GetKeyDown(KeyCode.K))
        {
            SwitchWithKeyTo(skillTreeUI);
        }

        if(Input.GetKeyDown(KeyCode.O))
        {
            SwitchWithKeyTo(optionsUI);
        }    
    }

    public void SwitchTo(GameObject _menu)//切换窗口函数
    {
        for (int i = 0; i < transform.childCount; i++)
        {
            transform.GetChild(i).gameObject.SetActive(false);
        }

        if (_menu != null)
        {
            _menu.SetActive(true);
        }
    }

    public void SwitchWithKeyTo(GameObject _menu)//键盘切换窗口函数
    {
        if (_menu != null && _menu.activeSelf)//通过判断是否传入mune和mune是否激活来决定使设置为可视或不可使
        {
            _menu.SetActive(false);
            return;
        }

        SwitchTo(_menu);
    }
}


UI_itemSlot.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using TMPro;
using UnityEngine.EventSystems;

public class UI_itemSlot : MonoBehaviour ,IPointerDownHandler, IPointerEnterHandler, IPointerExitHandler
{
    [SerializeField] protected Image itemImage;
    [SerializeField] protected TextMeshProUGUI itemText;

    protected UI ui;

    public InventoryItem item;

    protected virtual void Start()
    {
        ui = GetComponentInParent<UI>();
    }

    public void UpdateSlots(InventoryItem _newItem)
    {
        item = _newItem;

        itemImage.color = Color.white;

        if (item != null)
        {
            itemImage.sprite = item.data.icon;

            if (item.stackSize > 1)
            {
                itemText.text = item.stackSize.ToString();

            }
            else
            {
                itemText.text = "";
            }
        }
    }

    public void CleanUpSlot()//解决出现UI没有跟着Inventory变化的bug
    {
        item = null;

        itemImage.sprite = null;
        itemImage.color = Color.clear;

        itemText.text = "";
    }

    public virtual void OnPointerDown(PointerEventData eventData)
    {
        if(item == null)//修复点击空白处会报错的bug
        {
            return;
        }

        if(Input.GetKey(KeyCode.LeftControl))
        {
            Inventory.instance.RemoveItem(item.data);
            ui.itemToolTip.HideToolTip();
            return;
        }

        if (item.data.itemType == ItemType.Equipment)
            Inventory.instance.EquipItem(item.data);

        ui.itemToolTip.HideToolTip();//修复已经装备了装备还会出现详细信息栏的bug
    }

    public void OnPointerEnter(PointerEventData eventData)
    {
        if (item == null || item.data == null)
            return;

        
        ui.itemToolTip.ShowToolTip(item.data as ItemData_Equipment);
    }

    public void OnPointerExit(PointerEventData eventData)
    {
        if (item == null || item.data == null)
            return;

        ui.itemToolTip.HideToolTip();
    }
}

UI_equipementSlots.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;

public class UI_equipementSlots : UI_itemSlot
{
    public EquipmentType slotType;//这怎么拿到的

    private void OnValidate()
    {
        gameObject.name = "Equipment slot -" + slotType.ToString();
    }

    public override void OnPointerDown(PointerEventData eventData)
    {
        if (item == null || item.data == null)//修复点击空白处会报错的bug
            return;
        //点击装备槽后卸下装备
        Inventory.instance.AddItem(item.data as ItemData_Equipment);
        Inventory.instance.Unequipment(item.data as ItemData_Equipment);

        ui.itemToolTip.HideToolTip();//修复已经装备了装备还会出现详细信息栏的bug

        CleanUpSlot();


    }
}

标签:12,void,item,Craft,UI,using,源代码,data,public
From: https://blog.csdn.net/Homura_/article/details/137520831

相关文章

  • CSCI 2122任缓存和内存层次结构 解析
    CSCI2122任务5截止日期:2024年4月9日星期二晚上11:59,通过git提交目标本课业的目的是练习用C进行编码,并强化中讨论的概念类的指针、缓存和内存层次结构。在这项任务中,您将实现一个使用有限内存的缓存模拟器。准备1.完成工作分配0,或确保已安装完成工作分配所需的工具。2.克隆......
  • CF1292B 题解
    Aroma'sSeatch题意简述题目链接。一个二维平面内有无限个点,从\(0\)开始编号,编号为\(0\)的点的坐标为\((x_{0},y_{0})\)。对于一个编号为\(i(i>0)\)的点,它的坐标为\((a_{x}\cdotx_{i-1}+b_{x},a_y\cdoty_{i-1}+b_{y})\)。Aroma最开始在点\((x_s,y_s)\)处,她每......
  • P4112DrawingPointsDivOne
    二分具有单调性,考虑二分答案对于\(x\)考虑怎么\(check\),可以暴力的展开\(x\)次,再缩小\(x\)次,如果得到的结果和初始状态相同,那么就合法,否则不合法//Author:xiaruizeconstintN=1e3+10;intn;piia[N];bools[N][N],cur[N][N],mp[N][N];boolcheck(intx)......
  • 电容隔离型±10V输入隔离放大器特点:ISOC 124P
    产品特点:50KHz(-3dB)高带宽与ISO124P隔离器Pin-Pin兼容低成本小体积,标准DIP16Pin阻燃材料封装精度等级:±0.01级,全量程内非线性度0.01%信号输入与输出之间:3000VDC隔离耐压电源范围:±4.5V~±18V双极运算:Vo=±10V方便易用,固定单位增益配置小体积:22.8X10.2X8.5......
  • ISO124P兼容|ISO EC系列电容隔离放大器|隔离变送器|4-20mA/|0-10V隔离放大转换
    模拟电压信号隔离器。50KHz(-3dB)高带宽与ISO124P隔离器Pin-Pin兼容。ISOC124P模拟电压信号隔离放大器是一种采用电容耦合隔离的混合集成电路,该放大器采用了全新的调制-解调电容耦合隔离技术。模块中信号以数字的形式通过电容隔离层进行传输,通过数字调制和电容耦合隔离方......
  • ACM2012-900-2P-T001 贴片共模电感
    ACM2012-900-2P-T001规格信息:系列:ACM高度:1.3mm长度:2mm类型:CommonModeFiltersforHigh-SpeedDifferentialSignalLine,GeneralSignalLine宽度:1.2mm阻抗:90Ohms安装风格:SMD/SMT最大直流电阻:190mOhms最大直流电流:400mA测试频率:100MHz滤波器类型:信号线线路数:2不同......
  • AD7237A和AD7247A双12位DA
    这份文件是关于AnalogDevices公司生产的AD7237A和AD7247A双12位DACPORTs(数字模拟转换器)的技术手册。以下是其核心内容的概要:产品概述:AD7237A/AD7247A是单芯片上的双12位DACPORTs。设计紧凑,节省空间,提高可靠性。改进的接口时间,易于与现代微处理器直接接口。支持12V至15V......
  • 产品汪12:产品经理如何做用户调研和访谈
    到底要不要做用户调研?如果要做的话该怎么做用户调研?在一个完整的产品流程里面,用户调研是非常重要的,其贯穿了产品发展的始终。回到史玉柱的案例,当年推出脑白金的时候,史玉柱在江苏很多城市进行了大量的走访(用户调研),和一帮老头老太太聊天唠家常,询问了解他们使用脑白金的情况,了......
  • Matlab 安装及添加 SPM 12
    Matlab安装及添加SPM12因为课题需要,需要学习Matlab的使用,又开始学习一个新的知识!快乐的(bcd)研究生~~~下载安装Matlab首先我从网上一些资源那里下载了Matlab安装压缩包(从百度网盘下的,压缩包都12.02G!下了我好久啊!!!)下载完成后就是这样子的啦~然后进行解压安装(这里解压也......
  • Unity类银河恶魔城学习记录12-7-1 p129 Craft UI - part 1源代码
    Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释,可供学习Alex教程的人参考此代码仅为较上一P有所改变的代码【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibiliUI_CraftList.csusingSystem.Collections;usingSystem.Collections.Generic;usin......