RPG项目01_UI面板Game

基于“RPG项目01_技能释放”,将UI包导入Unity场景中,

将图片放置

拖拽

取消勾选(隐藏攻击切片)

对技能添加蒙版

调节父子物体大小一致

将子类蒙版复制

执行5次

运行即可看到技能使用完的冷却条

在Scripts下创建UI文件夹

写代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.UI;

public class UIBase : MonoBehaviour
{
    public Transform btnParent;
    public GameObject prefab;
    public UnityAction<int> funClickHandle;
    public UITween tween;
    protected List<RectTransform> childRect = new List<RectTransform>();
    protected Button btnBack;
    protected Text text;

    protected void Init()
    {
        tween = GetComponent<UITween>();
        btnBack = GameManager.FindType<Button>(transform, "BtnX");
        btnBack.onClick.AddListener(tween.UIBack);
    }
    protected void ClearBtn(Transform parent) {
        foreach (Transform t in parent) {
            Destroy(t.gameObject);
        }
    }
    public virtual void UpdateValue() {
    
    }
    public virtual void MenuStart(params UITween[] uis) {
        foreach (UITween item in uis) { 
            item.UIStart();
        }
    }
}
再UI文件夹下创建PlayerPanel代码:

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

public class PlayerPanel : UIBase
{
    [Header("==============子类变量================")]
    public UIBase panelMsn;
    public UIBase panelBag;
    Button btnMsn;
    Button btnBag;
    static Image hpImage;
    static Image mpImage;
    void Start()
    {
        hpImage = GameManager.FindType<Image>(transform, "MainUI/Hp");
        mpImage = GameManager.FindType<Image>(transform, "MainUI/Mp");
        btnMsn = GameManager.FindType<Button>(transform, "BtnMission");
        btnBag = GameManager.FindType<Button>(transform
            , "BtnBag");
        btnMsn.onClick.AddListener(delegate
        {
            panelMsn.MenuStart(panelMsn.GetComponent<UITween>());
        });
        btnBag.onClick.AddListener(delegate
        {
            //获取全部挂在UITween脚本的组件形成数组不定参数
            panelBag.MenuStart(panelBag.GetComponentsInChildren<UITween>());
        });
        for (int i = 0; i < btnParent.childCount; i++)
        {
            Button btn = GameManager.FindType<Button>(btnParent, "BtnSkill" + i);
            int n = i;
            btn.onClick.AddListener(delegate {
                MainGame.player.SkillClick(n + 1);
            });
        }
    }

    //刷新血量
    public static void UpdateHpUI(float hpValue, float mpValue)
    {
        hpImage.fillAmount = hpValue;
        mpImage.fillAmount = mpValue;
    }
}
将PalyerPanel挂载在MainPanel上

新增MaPlayer代码:

protected override void UpdateUI()
    {
        PlayerPanel.UpdateHpUI(GetHpRation(), (float)Mp/MpMax);
    }

将初始mp/最大mp调少一点:

运行E拔刀后F1释放技能即可看到mp蓝条减少

添加代码:

public void SkillClick(int num)
    {
        if (!Anim.GetCurrentAnimatorStateInfo(0).IsName("Idle_Fight"))
        {
            return;
        }
        SkillBase skill = skills[num];
        if (!skill.MayRelease())
        {
            return;
        }
        Anim.SetTrigger("CSkill" + num);
        ReleaseSkill(skill);
    }

选中技能1-6添加Button组件

新增PlayerPanel代码:(找到按钮)

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++点击技能释放技能缺少button事件+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

加入新按钮,

删除旧按钮,

新增两个到Bag包下

删除两个

delete

挪动Text位置

复制道具框,

在Content上增加尺寸适配器组件(自动计算)通常和Grid Layout Group配合使用

设置自动隐藏(当需要滚动条的时候显示,不需要时隐藏)

此时,两侧面板基本完成

新建代码BagPanel

代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class BagPanel : UIBase{
    Transform canvas;
    Transform bagTran;
    Transform equipTran;
    Button btnTakeOff;
    Text textHp;
    Text textMp;
    Text textLv;
    Text textExp;
    Text textAtt;
    Text textDef;
    Text textSpd;
    Text textMdf;
    private void Start(){  
    }
    public void InitText(){
        canvas = MainGame.canvas;
        bagTran = transform.Find("Bag");
        equipTran = transform.Find("Equip");
        text = GameManager.FindType<Text>(bagTran, "TextGold");
        Transform temp = equipTran.Find("TextParent");
        textHp = GameManager.FindType<Text>(temp, "TextHp");
        textMp = GameManager.FindType<Text>(temp, "TextMp");
        textLv = GameManager.FindType<Text>(temp, "TextLv");
        textExp = GameManager.FindType<Text>(temp, "TextExp");
        textAtt = GameManager.FindType<Text>(temp, "TextAtt");
        textDef = GameManager.FindType<Text>(temp, "TextDef");
        textSpd = GameManager.FindType<Text>(temp, "TextSpd");
        textMdf = GameManager.FindType<Text>(temp, "TextMdf");
    }
}
新增MainPanel代码类段代码:


 Message.CheckMessage();

修改Text为TextGold

在Canvas下创建Image

选一张图片

添加组件

添加组件

添加事件类型

再做一下鼠标移动到图标就会消失功能:

鼠标到图标位置,图标就会消失

知识点:如果用Selectable和Event Trigger就可以替代Button按钮做更复杂的UI

新建脚本道具类GameObj

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//药品,装备
public enum ObjType { None, Drug, Equip };
//装备包含:
public enum EquipType { None, Helmet, Armor, Boots, Weapon, Shield };
//装备数据
public class GameObj{
    public string oname;
    public string msg;
    public int idx;
    public string type;
    public int _hp;
    public int _mp;
    public int _def;
    public int _mdf;
    public int _att;
    public int _spd;
    public bool isTakeOn;//判断是否穿上
    public virtual void UseObjValue(){

    }
    public virtual void TakeOff(){

    }
    public virtual void TakeOn(){

    }
}
修改BagPanel代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.InputSystem;
using UnityEngine.UI;
public class BagPanel : UIBase{
    Transform canvas;
    Transform bagTran;
    Transform equipTran;
    Button btnTakeOff;
    Text textHp;
    Text textMp;
    Text textLv;
    Text textExp;
    Text textAtt;
    Text textDef;
    Text textSpd;
    Text textMdf;
    void Start(){  
    }
    public void InitText(){
        canvas = MainGame.canvas;
        bagTran = transform.Find("Bag");
        equipTran = transform.Find("Equip");
        text = GameManager.FindType<Text>(bagTran, "TextGold");
        Transform temp = equipTran.Find("TextParent");
        textHp = GameManager.FindType<Text>(temp, "TextHp");
        textMp = GameManager.FindType<Text>(temp, "TextMp");
        textLv = GameManager.FindType<Text>(temp, "TextLv");
        textExp = GameManager.FindType<Text>(temp, "TextExp");
        textAtt = GameManager.FindType<Text>(temp, "TextAtt");
        textDef = GameManager.FindType<Text>(temp, "TextDef");
        textSpd = GameManager.FindType<Text>(temp, "TextSpd");
        textMdf = GameManager.FindType<Text>(temp, "TextMdf");
    }
    void AddEvent(GameObj obj, GameObject btn)
    {
        Image image = btn.GetComponent<Image>();
        EventTrigger et = btn.GetComponent<EventTrigger>();
        if (!et)
        {
            et = btn.AddComponent<EventTrigger>();
        }
        EventTrigger.Entry entry = new EventTrigger.Entry();
        entry.eventID = EventTriggerType.BeginDrag;//开始拖拽
        entry.callback.AddListener(delegate
        {
            image.raycastTarget = false;
            btn.transform.SetParent(canvas);
        }
        );
        et.triggers.Add(entry);
        //
        entry = new EventTrigger.Entry();
        entry.eventID = EventTriggerType.Drag;//拖拽中
        entry.callback.AddListener(delegate (BaseEventData arg)
        {
            PointerEventData ped = (PointerEventData)arg;//将基础数据变成鼠标数据
            Vector3 newPos;
            RectTransformUtility.ScreenPointToWorldPointInRectangle(
                btn.GetComponent<RectTransform>(), Mouse.current.position.ReadValue(),//在摄像机视角下鼠标当前坐标转换过去
                ped.enterEventCamera, out newPos);
            btn.transform.position = newPos;
        }
        );
        et.triggers.Add(entry);
        /;
        entry = new EventTrigger.Entry();
        entry.eventID = EventTriggerType.EndDrag;//结束拖拽
        entry.callback.AddListener(delegate (BaseEventData arg)
        {
            if (!EventSystem.current.IsPointerOverGameObject())
            {
                btn.transform.parent = btnParent;
                image.raycastTarget = true;
                return;
            }
            PointerEventData ped = (PointerEventData)arg;
            Transform target = ped.pointerEnter.transform;
            if (target)
            {
                if (target.tag == obj.GetType().ToString())
                {
                    obj.TakeOn();
                    //交换装备
                    ChangeGameObj(target.parent, btn);
                    //刷新数值
                    UpdatePlayerValue();
                }
                else if (target.name == obj.GetType().ToString() || target.name == obj.type)
                {
                    //交换药品
                    ChangeGameObj(target, btn);
                }
                else
                {
                    obj.isTakeOn = false;
                    btn.transform.parent = btnParent;
                }
            }
            image.raycastTarget = true;
        }
        );
        et.triggers.Add(entry);
        /
        entry = new EventTrigger.Entry();
        entry.eventID = EventTriggerType.PointerClick;//拖拽中
        entry.callback.AddListener(delegate (BaseEventData arg)
        {
            if (btn.tag != ObjType.Drug.ToString())
            {
                return;
            }
            //MainGame.player.UseDrugObj(btn.transform);
        }
        );
        et.triggers.Add(entry);
    }
    //刷新玩家数据
    public void UpdatePlayerValue()
    {
        textHp.text = "生命:" + MainGame.player.Hp + "/" + MainGame.player.HpMax;
        textMp.text = "魔力:" + MainGame.player.Mp + "/" + MainGame.player.MpMax;
        textAtt.text = "攻击:" + MainGame.player.Att;
        textDef.text = "防御:" + MainGame.player.Def;
        textMdf.text = "魔抗:" + MainGame.player.Mdf;
        textSpd.text = "速度:" + MainGame.player.Spd;
        textLv.text = "等级:" + MainGame.player.lv;
        textExp.text = "经验:" + MainGame.player.Exp;
    }
    void ChangeGameObj(Transform target, GameObject btn)
    {
        GameObj temp = new GameObj();
        if (target.childCount >= 2)
        {
            //temp = GameManager.GetGameObj(target.GetChild(0).name);
            //SetBtnTakeOff(target.GetChild(0), temp);
        }
        btn.transform.parent = target.transform;
        btn.transform.SetAsFirstSibling();
        btn.transform.localPosition = Vector3.zero;
        btn.GetComponent<RectTransform>().sizeDelta = target.GetComponent<RectTransform>().sizeDelta;
        //temp = GameManager.GetGameObj(btn.name);
        if (temp != null)
        {
            temp.isTakeOn = true;
        }

    }
    void SetBtnTakeOff(Transform btn, GameObj obj)
    {
        if (obj != null)
        {
            btn.parent = btnParent;
            obj.isTakeOn = false;
            btn.GetComponent<Image>().raycastTarget = true;
        }
    }
}
修改GameManager类:

using System.Collections.Generic;
using System.Xml;
using Unity.VisualScripting;
using UnityEngine;
public enum GameState { Play,Menu };
public class GameManager
{
    //当只需要一个的时候使用静态类
    public static GameState gameState = GameState.Play;
    //物品库
    public static Dictionary<string, GameObj> goods = new Dictionary<string, GameObj>();
    public static void Init()
    {

    }
    public static T FindType<T>(Transform t, string n)
    {
        return t.Find(n).GetComponent<T>();
    }
    public static T ParseEnum<T>(string value)
    {
        return (T)System.Enum.Parse(typeof(T), value, true);
    }
    #region 添加物品库
    //读取XML文件
    public static void SetGoods()
    {
        TextAsset t = LoadManager.LoadXml("XML");
        XmlDocument xml = new XmlDocument();
        xml.LoadXml(t.ToString().Trim());
        XmlElement root = xml.DocumentElement;
        XmlElement oInfo = (XmlElement)root.SelectSingleNode("DrugInfo");
        //节点列表 获取所有子节点
        XmlNodeList nodeList = oInfo.ChildNodes;
        foreach (XmlElement item in nodeList)
        {
            //Drug drug = new Drug();
            //drug.oname = item.GetAttribute("Name");
            //drug.msg = item.GetAttribute("Msg");
            //drug.idx = int.Parse(item.GetAttribute("Idx"));
            //drug.type = item.GetAttribute("Type");
            //drug._hp = int.Parse(item.GetAttribute("Hp"));
            //drug._mp = int.Parse(item.GetAttribute("Mp"));
            //AddGoodDict(drug);
        }
       
        //    oInfo = (XmlElement)root.SelectSingleNode("EquipInfo");
        //    nodeList = oInfo.ChildNodes;//每一个节点
        //    foreach (XmlElement item in nodeList)
        //    {
        //        Equip eq = new Equip();
        //        eq.oname = item.GetAttribute("Name");
        //        eq.msg = item.GetAttribute("Msg");
        //        eq.idx = int.Parse(item.GetAttribute("Idx"));
        //        eq.type = item.GetAttribute("Type");
        //        eq._att = int.Parse(item.GetAttribute("Att"));
        //        eq._def = int.Parse(item.GetAttribute("Def"));
        //        eq._mdf = int.Parse(item.GetAttribute("Mdf"));
        //        eq._spd = int.Parse(item.GetAttribute("Spd"));
        //        AddGoodDict(eq);
        //    }
        //}
        //public static void AddGoodDict(GameObj obj)
        //{
        //    if (obj == null)
        //    {
        //        return;
        //    }
        //    goods.Add(obj.oname, obj);
        //}
        //public static GameObj GetGameObj(string name)
        //{
        //    if (goods.ContainsKey(name))
        //    {
        //        return goods[name];
        //    }
        //    else
        //    {
        //        return null;
        //    }
        //}
        //public static GameObj GetGameObj(int idx)
        //{
        //    foreach (GameObj item in goods.Values)
        //    {
        //        if (item.idx == idx)
        //        {
        //            return item;
        //        }
        //    }
        //    return null;
        //}
        #endregion
    }
}
新建脚本药品类Drug

代码:

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

public class Drug : GameObj
{
    public override void UseObjValue()
    {
        MainGame.player.AddHp(_hp);
        MainGame.player.AddMp(_mp);
    }
}
继续修改GameManager代码:

using System.Collections.Generic;
using System.Xml;
using Unity.VisualScripting;
using UnityEngine;
public enum GameState { Play,Menu };
public class GameManager
{
    //当只需要一个的时候使用静态类
    public static GameState gameState = GameState.Play;
    //物品库
    public static Dictionary<string, GameObj> goods = new Dictionary<string, GameObj>();
    public static void Init()
    {

    }
    public static T FindType<T>(Transform t, string n)
    {
        return t.Find(n).GetComponent<T>();
    }
    public static T ParseEnum<T>(string value)
    {
        return (T)System.Enum.Parse(typeof(T), value, true);
    }
    #region 添加物品库
    //读取XML文件
    public static void SetGoods()
    {
        TextAsset t = LoadManager.LoadXml("XML");
        XmlDocument xml = new XmlDocument();
        xml.LoadXml(t.ToString().Trim());
        XmlElement root = xml.DocumentElement;
        XmlElement oInfo = (XmlElement)root.SelectSingleNode("DrugInfo");
        //节点列表 获取所有子节点
        XmlNodeList nodeList = oInfo.ChildNodes;
        foreach (XmlElement item in nodeList)
        {
            Drug drug = new Drug();
            drug.oname = item.GetAttribute("Name");
            drug.msg = item.GetAttribute("Msg");
            drug.idx = int.Parse(item.GetAttribute("Idx"));
            drug.type = item.GetAttribute("Type");
            drug._hp = int.Parse(item.GetAttribute("Hp"));
            drug._mp = int.Parse(item.GetAttribute("Mp"));
            AddGoodDict(drug);
        }
       
        //oInfo = (XmlElement)root.SelectSingleNode("EquipInfo");
        //nodeList = oInfo.ChildNodes;//每一个节点
        //foreach (XmlElement item in nodeList)
        //{
        //    Equip eq = new Equip();
        //    eq.oname = item.GetAttribute("Name");
        //    eq.msg = item.GetAttribute("Msg");
        //    eq.idx = int.Parse(item.GetAttribute("Idx"));
        //    eq.type = item.GetAttribute("Type");
        //    eq._att = int.Parse(item.GetAttribute("Att"));
        //    eq._def = int.Parse(item.GetAttribute("Def"));
        //    eq._mdf = int.Parse(item.GetAttribute("Mdf"));
        //    eq._spd = int.Parse(item.GetAttribute("Spd"));
        //    AddGoodDict(eq);
        //}
    }
    public static void AddGoodDict(GameObj obj)
        {
            if (obj == null)
            {
                return;
            }
            goods.Add(obj.oname, obj);
        }
        //public static GameObj GetGameObj(string name)
        //{
        //    if (goods.ContainsKey(name))
        //    {
        //        return goods[name];
        //    }
        //    else
        //    {
        //        return null;
        //    }
        //}
        //public static GameObj GetGameObj(int idx)
        //{
        //    foreach (GameObj item in goods.Values)
        //    {
        //        if (item.idx == idx)
        //        {
        //            return item;
        //        }
        //    }
        //    return null;
        //}
        #endregion
    
}
再创建Equip道具类

代码:

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

public class Equip : GameObj
{
    public override void TakeOff()
    {
        //
    }
}
继续修改GameManager类:

using System.Collections.Generic;
using System.Xml;
using Unity.VisualScripting;
using UnityEngine;
public enum GameState { Play,Menu };
public class GameManager
{
    //当只需要一个的时候使用静态类
    public static GameState gameState = GameState.Play;
    //物品库
    public static Dictionary<string, GameObj> goods = new Dictionary<string, GameObj>();
    public static void Init()
    {
        SetGoods();
    }
    public static T FindType<T>(Transform t, string n)
    {
        return t.Find(n).GetComponent<T>();
    }
    public static T ParseEnum<T>(string value)
    {
        return (T)System.Enum.Parse(typeof(T), value, true);
    }
    #region 添加物品库
    //读取XML文件
    public static void SetGoods()
    {
        TextAsset t = LoadManager.LoadXml("XML");
        XmlDocument xml = new XmlDocument();
        xml.LoadXml(t.ToString().Trim());
        XmlElement root = xml.DocumentElement;
        XmlElement oInfo = (XmlElement)root.SelectSingleNode("DrugInfo");
        //节点列表 获取所有子节点
        XmlNodeList nodeList = oInfo.ChildNodes;
        foreach (XmlElement item in nodeList)
        {
            Drug drug = new Drug();
            drug.oname = item.GetAttribute("Name");
            drug.msg = item.GetAttribute("Msg");
            drug.idx = int.Parse(item.GetAttribute("Idx"));
            drug.type = item.GetAttribute("Type");
            drug._hp = int.Parse(item.GetAttribute("Hp"));
            drug._mp = int.Parse(item.GetAttribute("Mp"));
            AddGoodDict(drug);
        }
       
        oInfo = (XmlElement)root.SelectSingleNode("EquipInfo");
        //节点列表 获取所有子节点
        nodeList = oInfo.ChildNodes;
        foreach (XmlElement item in nodeList)
        {
            //alt + 回车 一键全改错误eq
            Equip eqq = new Equip();
            eqq.oname = item.GetAttribute("Name");
            eqq.msg = item.GetAttribute("Msg");
            eqq.idx = int.Parse(item.GetAttribute("Idx"));
            eqq.type = item.GetAttribute("Type");
            eqq._att = int.Parse(item.GetAttribute("Att"));
            eqq._def = int.Parse(item.GetAttribute("Def"));
            eqq._mdf = int.Parse(item.GetAttribute("Mdf"));
            eqq._spd = int.Parse(item.GetAttribute("Spd"));
            AddGoodDict(eqq);
        }
    }
    public static void AddGoodDict(GameObj obj)
        {
            if (obj == null)
            {
                return;
            }
            goods.Add(obj.oname, obj);
        }
    public static GameObj GetGameObj(string name)
    {
        if (goods.ContainsKey(name))
        {
            return goods[name];
        }
        else
        {
            return null;
        }
    }
    public static GameObj GetGameObj(int idx)
    {
        foreach (GameObj item in goods.Values)
        {
            if (item.idx == idx)
            {
                return item;
            }
        }
        return null;
    }
    #endregion

}
修改BagPanel类:

修改背包面板BagPanel代码,在Start下加内容:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.InputSystem;
using UnityEngine.UI;
public class BagPanel : UIBase{
    Transform canvas;
    Transform bagTran;
    Transform equipTran;
    Button btnTakeOff;
    Text textHp;
    Text textMp;
    Text textLv;
    Text textExp;
    Text textAtt;
    Text textDef;
    Text textSpd;
    Text textMdf;
    void Start(){
        InitText();
        btnTakeOff = GameManager.FindType<Button>(equipTran, "BtnTakeOff");
        btnTakeOff.onClick.AddListener(delegate
        {
            foreach (Transform item in equipTran.Find("Eq"))
            {
                if (item.childCount >= 2)
                {
                    GameObj temp = GameManager.GetGameObj(item.GetChild(0).name);
                    temp.TakeOff();
                    UpdatePlayerValue();
                    SetBtnTakeOff(item.GetChild(0), temp);
                }
            }
        });
        tween = bagTran.GetComponent<UITween>();
        tween.AddEventStartHandle(UpdateValue);
        btnBack = GameManager.FindType<Button>(bagTran, "BtnX");
        btnBack.onClick.AddListener(delegate
        {
            tween.UIBack();
            equipTran.GetComponent<UITween>().UIBack();
        });
    }
    public void InitText(){
        canvas = MainGame.canvas;
        bagTran = transform.Find("Bag");
        equipTran = transform.Find("Equip");
        text = GameManager.FindType<Text>(bagTran, "TextGold");
        Transform temp = equipTran.Find("TextParent");
        textHp = GameManager.FindType<Text>(temp, "TextHp");
        textMp = GameManager.FindType<Text>(temp, "TextMp");
        textLv = GameManager.FindType<Text>(temp, "TextLv");
        textExp = GameManager.FindType<Text>(temp, "TextExp");
        textAtt = GameManager.FindType<Text>(temp, "TextAtt");
        textDef = GameManager.FindType<Text>(temp, "TextDef");
        textSpd = GameManager.FindType<Text>(temp, "TextSpd");
        textMdf = GameManager.FindType<Text>(temp, "TextMdf");
    }
    void AddEvent(GameObj obj, GameObject btn)
    {
        Image image = btn.GetComponent<Image>();
        EventTrigger et = btn.GetComponent<EventTrigger>();
        if (!et)
        {
            et = btn.AddComponent<EventTrigger>();
        }
        EventTrigger.Entry entry = new EventTrigger.Entry();
        entry.eventID = EventTriggerType.BeginDrag;//开始拖拽
        entry.callback.AddListener(delegate
        {
            image.raycastTarget = false;
            btn.transform.SetParent(canvas);
        }
        );
        et.triggers.Add(entry);
        //
        entry = new EventTrigger.Entry();
        entry.eventID = EventTriggerType.Drag;//拖拽中
        entry.callback.AddListener(delegate (BaseEventData arg)
        {
            PointerEventData ped = (PointerEventData)arg;//将基础数据变成鼠标数据
            Vector3 newPos;
            RectTransformUtility.ScreenPointToWorldPointInRectangle(
                btn.GetComponent<RectTransform>(), Mouse.current.position.ReadValue(),//在摄像机视角下鼠标当前坐标转换过去
                ped.enterEventCamera, out newPos);
            btn.transform.position = newPos;
        }
        );
        et.triggers.Add(entry);
        /;
        entry = new EventTrigger.Entry();
        entry.eventID = EventTriggerType.EndDrag;//结束拖拽
        entry.callback.AddListener(delegate (BaseEventData arg)
        {
            if (!EventSystem.current.IsPointerOverGameObject())
            {
                btn.transform.parent = btnParent;
                image.raycastTarget = true;
                return;
            }
            PointerEventData ped = (PointerEventData)arg;
            Transform target = ped.pointerEnter.transform;
            if (target)
            {
                if (target.tag == obj.GetType().ToString())
                {
                    obj.TakeOn();
                    //交换装备
                    ChangeGameObj(target.parent, btn);
                    //刷新数值
                    UpdatePlayerValue();
                }
                else if (target.name == obj.GetType().ToString() || target.name == obj.type)
                {
                    //交换药品
                    ChangeGameObj(target, btn);
                }
                else
                {
                    obj.isTakeOn = false;
                    btn.transform.parent = btnParent;
                }
            }
            image.raycastTarget = true;
        }
        );
        et.triggers.Add(entry);
        /
        entry = new EventTrigger.Entry();
        entry.eventID = EventTriggerType.PointerClick;//拖拽中
        entry.callback.AddListener(delegate (BaseEventData arg)
        {
            if (btn.tag != ObjType.Drug.ToString())
            {
                return;
            }
            //MainGame.player.UseDrugObj(btn.transform);
        }
        );
        et.triggers.Add(entry);
    }
    //刷新玩家数据
    public void UpdatePlayerValue()
    {
        textHp.text = "生命:" + MainGame.player.Hp + "/" + MainGame.player.HpMax;
        textMp.text = "魔力:" + MainGame.player.Mp + "/" + MainGame.player.MpMax;
        textAtt.text = "攻击:" + MainGame.player.Att;
        textDef.text = "防御:" + MainGame.player.Def;
        textMdf.text = "魔抗:" + MainGame.player.Mdf;
        textSpd.text = "速度:" + MainGame.player.Spd;
        textLv.text = "等级:" + MainGame.player.lv;
        textExp.text = "经验:" + MainGame.player.Exp;
    }
    void ChangeGameObj(Transform target, GameObject btn)
    {
        GameObj temp = new GameObj();
        if (target.childCount >= 2)
        {
            temp = GameManager.GetGameObj(target.GetChild(0).name);
            SetBtnTakeOff(target.GetChild(0), temp);
        }
        btn.transform.parent = target.transform;
        btn.transform.SetAsFirstSibling();
        btn.transform.localPosition = Vector3.zero;
        btn.GetComponent<RectTransform>().sizeDelta = target.GetComponent<RectTransform>().sizeDelta;
        temp = GameManager.GetGameObj(btn.name);
        if (temp != null)
        {
            temp.isTakeOn = true;
        }

    }
    void SetBtnTakeOff(Transform btn, GameObj obj)
    {
        if (obj != null)
        {
            btn.parent = btnParent;
            obj.isTakeOn = false;
            btn.GetComponent<Image>().raycastTarget = true;
        }
    }
}
新增BagPanel代码:

public override void UpdateValue()
    {
        ClearBtn(btnParent);
        //暂时写不了,需要新增MyPlayer代码的函数
    }

新增MyPlayer代码:

添加一个方法

修改MyPlayer代码,利用xml文档的函数添加两个道具

using System;
using System.Collections;
using System.Collections.Generic;
using Unity.VisualScripting;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.InputSystem;
using UnityEngine.UI;

public class MyPlayer : People
{

    [Header("=================子类变量=================")]
    public Transform toolPanel;//道具面板
    public Transform skillPanel;//技能面板
    public BagPanel bag;//包

    CharacterController contro;
    Controls action;

    float rvalue;
    float spdFast = 1;
    bool isHold;//握住刀
    GameObject sword;
    GameObject swordBack;
    public Image imageHp;
    public Image imageMp;
    //bagTools = 背包工具
    Dictionary<GameObj, int> bagTools = new Dictionary<GameObj, int>();
    Dictionary<EquipType, Equip> equips = new Dictionary<EquipType, Equip>();
    void Start()
    {
        //base.Start();
        InitValue();
        InitSkill();
        //获取自身角色控制器
        contro = GetComponent<CharacterController>();
        SetInput();
        sword = transform.Find("Sword_Hand").gameObject;
        swordBack = transform.Find("Sword_Back").gameObject;
        bag.InitText();
        // AddTool(GameManager.GetGameObj("大还丹"), 5);
        //3.5.7.6是xml文档里的道具(数字是编号)
        //作用是利用xml文档里添加两个道具
        AddTool(GameManager.GetGameObj(3), 5);
        AddTool(GameManager.GetGameObj(7), 6);
    }
    void Update()
    {
        if (GameManager.gameState != GameState.Play)
        {
            return;
        }
        Ctrl();
        UpdateSkillTime();
    }
    void SetInput()
    {
        action = new Controls();
        action.Enable();
        action.MyCtrl.Move.started += Move;
        action.MyCtrl.Move.performed += Move;
        action.MyCtrl.Move.canceled += StopMove;
        action.MyCtrl.Jump.started += Jump;
        action.MyCtrl.Rotate.started += Rotate;
        action.MyCtrl.Rotate.performed += Rotate;
        action.MyCtrl.Fast.started += FastSpeed;
        action.MyCtrl.Fast.performed += FastSpeed;
        action.MyCtrl.Fast.canceled += FastSpeed;
        action.MyCtrl.GetTool.started += ClickNpcAndTool;
        action.MyCtrl.HoldRotate.performed += Hold;
        action.MyCtrl.HoldRotate.canceled += Hold;
        action.MyAtt.Att.started += Attack;
        action.MyAtt.SwordOut.started += SwordOut;
        action.Skill.F1.started += SkillAtt;
        action.Skill.F2.started += SkillAtt;
        action.Skill.F3.started += SkillAtt;
        action.Skill.F4.started += SkillAtt;
        action.Skill.F5.started += SkillAtt;
        action.Skill.F6.started += SkillAtt;
       // action.Tools._1.started += GetkeyClick;
       // action.Tools._2.started += GetkeyClick;
       // action.Tools._3.started += GetkeyClick;
      //  action.Tools._4.started += GetkeyClick;
        //action.Tools._5.started += GetkeyClick;
        //action.Tools._6.started += GetkeyClick;
        //action.Tools._7.started += GetkeyClick;
        //action.Tools._8.started += GetkeyClick;
    }

    private void GetkeyClick(InputAction.CallbackContext context)
    {
        string[] str = context.control.ToString().Split('/');
        int num = int.Parse(str[2]) - 1;
     // UseObj(num);
    }

    private void SwordOut(InputAction.CallbackContext context)
    {
        if (GameManager.gameState != GameState.Play)
        {
            return;
        }
        Anim.SetBool("SwordOut", !Anim.GetBool("SwordOut"));
    }
    #region 攻击
    void SetSwordVisible(int n)
    {
        sword.SetActive(n != 0);
        swordBack.SetActive(n == 0);
    }
    private void Attack(InputAction.CallbackContext context)
    {
        if (GameManager.gameState != GameState.Play)
        {
            return;
        }
        if (EventSystem.current.IsPointerOverGameObject())
        {
            return;
        }
        if (Anim.GetCurrentAnimatorStateInfo(0).IsName("Idle_Fight"))
        {
            Anim.SetInteger("Att", 1);
            Anim.SetTrigger("AttTrigger");

        }
        else
        {
            int num = Anim.GetInteger("Att");
            if (num == 6)
            {
                return;
            }
            if (Anim.GetCurrentAnimatorStateInfo(0).IsName("Light_Attk_" + num))
            {
                Anim.SetInteger("Att", num + 1);
            }
        }
    }
    public void PlayerAttack(string hurt)
    {
        Collider[] cs = Physics.OverlapBox(attPoint.position, Vector3.one * 0.5f,
            attPoint.rotation, LayerMask.GetMask("Enemy"));
        if (cs.Length <= 0)
        {
            return;
        }
        int value = (int)(Att * Anim.GetInteger("Att") * 0.5f);
        foreach (Collider c in cs)
        {
            print(value);
        }
    }

    public void PlayerAttackHard(string hurt)
    {
        Collider[] cs = Physics.OverlapBox(attPoint.position, Vector3.one * 0.5f,
  
           attPoint.rotation, LayerMask.GetMask("Enemy"));
        if (cs.Length <= 0)
        {
            return;
        }
        int value = (int)(Att * Anim.GetInteger("Att") * 0.5f);
        foreach (Collider c in cs)
        {
            print(value);
            print("让敌人播放击倒特效");
        }
    }
    #endregion

    #region 人物控制
    void Ctrl()
    {
        if (Anim.GetCurrentAnimatorStateInfo(0).IsName("Run") || Anim.GetCurrentAnimatorStateInfo(0).IsName("Run_Inplace") || Anim.GetCurrentAnimatorStateInfo(0).IsName("Idle")
            || Anim.GetCurrentAnimatorStateInfo(0).IsName("Idle_Fight"))
        {
            float f = action.MyCtrl.Move.ReadValue<float>();
            contro.Move(transform.forward * f * Time.deltaTime * spdFast * Spd);
            contro.Move(transform.up * -9.8f * Time.deltaTime);
            if (isHold)
            {
                transform.Rotate(transform.up * rvalue * 0.3f);
            }

        }
    }
    private void Hold(InputAction.CallbackContext context)
    {
        if (GameManager.gameState != GameState.Play)
        {
            return;
        }
        if (context.phase == InputActionPhase.Canceled)
        {
            isHold = false;
        }
        else
        {
            isHold = true;
        }
    }
    private void ClickNpcAndTool(InputAction.CallbackContext context)
    {
        //throw new NotImplementedException();
    }

    private void FastSpeed(InputAction.CallbackContext context)
    {
        if (GameManager.gameState != GameState.Play)
        {
            return;
        }
        if (Anim.GetCurrentAnimatorStateInfo(0).IsName("Run") || Anim.GetCurrentAnimatorStateInfo(0).IsName("Run_Inplace"))
        {
            if (context.phase == InputActionPhase.Canceled)
            {
                spdFast = 1;
            }
            else
            {
                spdFast = 2;
            }
        }
    }

    private void Rotate(InputAction.CallbackContext context)
    {
        if (GameManager.gameState != GameState.Play)
        {
            return;
        }
        rvalue = context.ReadValue<float>();
    }

    private void Jump(InputAction.CallbackContext context)
    {
        if (GameManager.gameState != GameState.Play)
        {
            return;
        }
        Anim.SetTrigger("Jump");
    }

    private void StopMove(InputAction.CallbackContext context)
    {
        Anim.SetBool("IsRun", false);
    }

    private void Move(InputAction.CallbackContext context)
    {
        if (GameManager.gameState != GameState.Play)
        {
            return;
        }
        Anim.SetBool("IsRun", true);
    }


    #endregion

    #region 技能
    protected override void InitSkill()
    {
        SphereSkill thunderBombCut = new SphereSkill(this, "雷爆斩", SkillType.Magic, 3, Att * 10, -100, 20, 0.3f, 0);
        skills.Add(1, thunderBombCut);

        SphereSkill windCircleCut = new SphereSkill(this, "旋风斩", SkillType.Physics, 3, Att * 8, -50, 20, 0.2f, 0);
        skills.Add(2, windCircleCut);

        StraightSkill thunderLightCut = new StraightSkill(this, "雷光斩", SkillType.Physics, 7, 0.5f, Att * 7, -50, 20, 0.2f, 0);
        skills.Add(3, thunderLightCut);

        SphereSkill oneCut = new SphereSkill(this, "归一斩", SkillType.Physics, 7, Att * 7, -30, 8, 0.2f, 0);
        skills.Add(4, oneCut);

        StraightSkill crossCut = new StraightSkill(this, "十字斩", SkillType.Physics, 25, 0.5f, Att * 3, -40, 20, 0.2f, 0);
        skills.Add(5, crossCut);


        SphereSkill thunderLargeCut = new SphereSkill(this, "轰雷斩", SkillType.Magic, 7, Att * 15, -120, 25, 0.35f, 0);
        skills.Add(6, thunderLargeCut);
    }
    private void SkillAtt(InputAction.CallbackContext context)
    {
        if (!Anim.GetCurrentAnimatorStateInfo(0).IsName("Idle_Fight"))
        {
            return;
        }
        string[] str = context.control.ToString().Split('/');
        int num = int.Parse(str[2][1].ToString());
        SkillBase skill = skills[num];
        if (!skill.MayRelease())
        {
            return;
        }
        Anim.SetTrigger("CSkill" + num);
        ReleaseSkill(skill);
    }

    public void SkillClick(int num)
    {
        if (!Anim.GetCurrentAnimatorStateInfo(0).IsName("Idle_Fight"))
        {
            return;
        }
        SkillBase skill = skills[num];
        if (!skill.MayRelease())
        {
            return;
        }
        Anim.SetTrigger("CSkill" + num);
        ReleaseSkill(skill);
    }

    void UpdateSkillTime()
    {
        for (int i = 0; i < skillPanel.childCount; i++)
        {
            if (skills[i + 1].IsRelease)
            {
                continue;
            }
            Image image = skillPanel.GetChild(i).GetChild(0).GetComponent<Image>();
            image.fillAmount = skills[i + 1].GetFillTime();
        }
    }
    #endregion

    protected override void UpdateUI()
    {
        PlayerPanel.UpdateHpUI(GetHpRation(), (float)Mp/MpMax);
    }

    #region 物品道具
    public Dictionary<GameObj, int> GetTools()
    {
        return bagTools;
    }
    public void AddTool(GameObj gObj, int num)
    {
        if (gObj == null)
        {
            return;
        }
        GameObj temp = GameManager.GetGameObj(gObj.oname);
        if (bagTools.ContainsKey(temp))
        {
            bagTools[temp] += num;
        }
        else
        {
            // bagTools[temp] = num;
            bagTools.Add(gObj, num);
        }
        bag.UpdateValue();
    }
    //public void UseDrugObj(Transform t)
    //{
    //    GameObj obj = GameManager.GetGameObj(t.name);
    //    obj.UseObjValue();
    //    bag.UpdatePlayerValue();
    //    bagTools[obj]--;
    //    t.GetComponentInChildren<Text>().text = bagTools[obj].ToString();
    //    if (bagTools[obj] == 0)
    //    {
    //        bagTools.Remove(obj);
    //        Destroy(t.gameObject);
    //    }
    //}
    //private void UseObj(int num)
    //{
    //    Transform temp = toolPanel.GetChild(num);
    //    if (temp.childCount < 2)
    //    {
    //        return;
    //    }
    //    Transform t = temp.GetChild(0);
    //    UseDrugObj(t);
    //}
    #endregion
}
再次修改BagPanel代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.InputSystem;
using UnityEngine.UI;
public class BagPanel : UIBase{
    Transform canvas;
    Transform bagTran;
    Transform equipTran;
    Button btnTakeOff;
    Text textHp;
    Text textMp;
    Text textLv;
    Text textExp;
    Text textAtt;
    Text textDef;
    Text textSpd;
    Text textMdf;
    void Start(){
        InitText();
        btnTakeOff = GameManager.FindType<Button>(equipTran, "BtnTakeOff");
        btnTakeOff.onClick.AddListener(delegate
        {
            foreach (Transform item in equipTran.Find("Eq"))
            {
                if (item.childCount >= 2)
                {
                    GameObj temp = GameManager.GetGameObj(item.GetChild(0).name);
                    temp.TakeOff();
                    UpdatePlayerValue();
                    SetBtnTakeOff(item.GetChild(0), temp);
                }
            }
        });
        tween = bagTran.GetComponent<UITween>();
        tween.AddEventStartHandle(UpdateValue);
        btnBack = GameManager.FindType<Button>(bagTran, "BtnX");
        btnBack.onClick.AddListener(delegate
        {
            tween.UIBack();
            equipTran.GetComponent<UITween>().UIBack();
        });
    }
    public override void UpdateValue()
    {
        ClearBtn(btnParent);
        Dictionary<GameObj, int>.KeyCollection keys = MainGame.player.GetTools().Keys;
        foreach (GameObj item in keys)
        {
            if (item.isTakeOn)
            {
                continue;
            }

            GameObject btn = Instantiate(prefab, btnParent);
            btn.GetComponent<Image>().sprite = LoadManager.LoadSprite("Obj/" + item.oname);
            btn.name = item.oname;
            btn.tag = item.GetType().ToString();
            btn.GetComponentInChildren<Text>().text = MainGame.player.GetTools()[item].ToString();
            AddEvent(item, btn);
        }
    }
    public void InitText(){
        canvas = MainGame.canvas;
        bagTran = transform.Find("Bag");
        equipTran = transform.Find("Equip");
        text = GameManager.FindType<Text>(bagTran, "TextGold");
        Transform temp = equipTran.Find("TextParent");
        textHp = GameManager.FindType<Text>(temp, "TextHp");
        textMp = GameManager.FindType<Text>(temp, "TextMp");
        textLv = GameManager.FindType<Text>(temp, "TextLv");
        textExp = GameManager.FindType<Text>(temp, "TextExp");
        textAtt = GameManager.FindType<Text>(temp, "TextAtt");
        textDef = GameManager.FindType<Text>(temp, "TextDef");
        textSpd = GameManager.FindType<Text>(temp, "TextSpd");
        textMdf = GameManager.FindType<Text>(temp, "TextMdf");
    }
    void AddEvent(GameObj obj, GameObject btn)
    {
        Image image = btn.GetComponent<Image>();
        EventTrigger et = btn.GetComponent<EventTrigger>();
        if (!et)
        {
            et = btn.AddComponent<EventTrigger>();
        }
        EventTrigger.Entry entry = new EventTrigger.Entry();
        entry.eventID = EventTriggerType.BeginDrag;//开始拖拽
        entry.callback.AddListener(delegate
        {
            image.raycastTarget = false;
            btn.transform.SetParent(canvas);
        }
        );
        et.triggers.Add(entry);
        //
        entry = new EventTrigger.Entry();
        entry.eventID = EventTriggerType.Drag;//拖拽中
        entry.callback.AddListener(delegate (BaseEventData arg)
        {
            PointerEventData ped = (PointerEventData)arg;//将基础数据变成鼠标数据
            Vector3 newPos;
            RectTransformUtility.ScreenPointToWorldPointInRectangle(
                btn.GetComponent<RectTransform>(), Mouse.current.position.ReadValue(),//在摄像机视角下鼠标当前坐标转换过去
                ped.enterEventCamera, out newPos);
            btn.transform.position = newPos;
        }
        );
        et.triggers.Add(entry);
        /;
        entry = new EventTrigger.Entry();
        entry.eventID = EventTriggerType.EndDrag;//结束拖拽
        entry.callback.AddListener(delegate (BaseEventData arg)
        {
            if (!EventSystem.current.IsPointerOverGameObject())
            {
                btn.transform.parent = btnParent;
                image.raycastTarget = true;
                return;
            }
            PointerEventData ped = (PointerEventData)arg;
            Transform target = ped.pointerEnter.transform;
            if (target)
            {
                if (target.tag == obj.GetType().ToString())
                {
                    obj.TakeOn();
                    //交换装备
                    ChangeGameObj(target.parent, btn);
                    //刷新数值
                    UpdatePlayerValue();
                }
                else if (target.name == obj.GetType().ToString() || target.name == obj.type)
                {
                    //交换药品
                    ChangeGameObj(target, btn);
                }
                else
                {
                    obj.isTakeOn = false;
                    btn.transform.parent = btnParent;
                }
            }
            image.raycastTarget = true;
        }
        );
        et.triggers.Add(entry);
        /
        entry = new EventTrigger.Entry();
        entry.eventID = EventTriggerType.PointerClick;//拖拽中
        entry.callback.AddListener(delegate (BaseEventData arg)
        {
            if (btn.tag != ObjType.Drug.ToString())
            {
                return;
            }
            //MainGame.player.UseDrugObj(btn.transform);
        }
        );
        et.triggers.Add(entry);
    }
    //刷新玩家数据
    public void UpdatePlayerValue()
    {
        textHp.text = "生命:" + MainGame.player.Hp + "/" + MainGame.player.HpMax;
        textMp.text = "魔力:" + MainGame.player.Mp + "/" + MainGame.player.MpMax;
        textAtt.text = "攻击:" + MainGame.player.Att;
        textDef.text = "防御:" + MainGame.player.Def;
        textMdf.text = "魔抗:" + MainGame.player.Mdf;
        textSpd.text = "速度:" + MainGame.player.Spd;
        textLv.text = "等级:" + MainGame.player.lv;
        textExp.text = "经验:" + MainGame.player.Exp;
    }
    void ChangeGameObj(Transform target, GameObject btn)
    {
        GameObj temp = new GameObj();
        if (target.childCount >= 2)
        {
            temp = GameManager.GetGameObj(target.GetChild(0).name);
            SetBtnTakeOff(target.GetChild(0), temp);
        }
        btn.transform.parent = target.transform;
        btn.transform.SetAsFirstSibling();
        btn.transform.localPosition = Vector3.zero;
        btn.GetComponent<RectTransform>().sizeDelta = target.GetComponent<RectTransform>().sizeDelta;
        temp = GameManager.GetGameObj(btn.name);
        if (temp != null)
        {
            temp.isTakeOn = true;
        }

    }
    void SetBtnTakeOff(Transform btn, GameObj obj)
    {
        if (obj != null)
        {
            btn.parent = btnParent;
            obj.isTakeOn = false;
            btn.GetComponent<Image>().raycastTarget = true;
        }
    }
}

挂载脚本

将content拖拽

修改unity场景中TxtParent为TextParent

拖拽Text预制体

添加图片作为一件脱装备,设置正常尺寸

修改Button名为BtnTakeOff

将UITween代码分别挂载在Bag和Equip上

拖拽背包面板BagPanel

添加标签

拖拽

增加两个页面的偏移值

接下来需要做下侧道具栏的层级显示

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

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

相关文章

设计模式——七大设计原则

设计模式——七大设计原则 1、单一职责原则&#xff08;SRP&#xff09;2、开放封闭原则&#xff08;OCP&#xff09;3、依赖倒转原则&#xff08;DIP&#xff09;4、里氏替换原则 (LSP)5、接口隔离原则 (ISP)6、合成/聚合复用原则 (CARP)7、迪米特法则 (LoD) 了解 设计模式 的…

使用C语言创建高性能网络爬虫IP池

目录 一、引言 二、IP池的设计 1、需求分析 2、架构设计 3、关键技术 三、IP池的实现 1、存储实现 2、调度实现 3、通信实现 4、异常处理实现 四、代码示例 五、性能优化 六、测试与分析 七、结论 一、引言 随着互联网的快速发展&#xff0c;网络爬虫成为了获取…

2-1、地址加法器CS:IP

语雀原文链接 文章目录 1、CPU组成2、通用寄存器16位寄存器的存储16位寄存器兼容8位word 和 byte进位问题 3、地址加法器不同的段地址和偏移地址表示同一个物理地址偏移地址的范围一个段的起始地址一定是16的倍数 4、CS:IPCS IP工作过程jmp修改CS:IP 5、DS和[address]DS和[add…

高级搜索——伸展树Splay详解

文章目录 伸展树Splay伸展树Splay的定义局部性原理Splay的伸展操作逐层伸展双层伸展zig-zig/zag-zagzig-zag/zag-zigzig/zag双层伸展的效果与效率 伸展树的实现动态版本实现递增分配器节点定义Splay类及其接口定义伸展操作左单旋右单旋右左/左右双旋伸展 查找操作删除操作插入操…

Spring 保姆级带你认识,让你如何轻松应对面试官

Spring 保姆级带你认识&#xff0c;让你如何轻松应对面试官 1.Spring是什么&#xff1f;作用是什么&#xff1f; Spring是一个轻量级的JavaEE框架&#xff0c;它主要解决企业应用中的复杂性问题。Spring框架有三个核心部分&#xff1a;IoC容器、AOP和数据访问/集成层。Spring…

java--抽象类

1.什么是抽象类 ①在java中有一个关键字叫&#xff1a;abstract&#xff0c;它就是抽象的意思&#xff0c;可以用它修饰类、成员方法。 ②abstract修饰类&#xff0c;这个类就是抽象类&#xff1b;修饰方法&#xff0c;这个方法就是抽象方法。 2.抽象类的注意事项、特点 ①抽…

Vue3-ElementPlus按需导入

1.安装 pnpm add element-plus 2.配置按需导入&#xff1a; 官方文档&#xff1a;快速开始 | Element Plus 按照官网按需导入中的自动导入步骤来进行 pnpm add -D unplugin-vue-components unplugin-auto-import 观察Vite代码与原vite文件的差别&#xff0c;将原vite文件中没…

[数据结构]-map和set

前言 作者&#xff1a;小蜗牛向前冲 名言&#xff1a;我可以接受失败&#xff0c;但我不能接受放弃 如果觉的博主的文章还不错的话&#xff0c;还请点赞&#xff0c;收藏&#xff0c;关注&#x1f440;支持博主。如果发现有问题的地方欢迎❀大家在评论区指正 目录 一、键值对…

【数据结构】二叉树的实现

目录 1. 前言2. 二叉树的实现2.1 创建一棵树2.2 前序遍历2.2.1 分析2.2.2 代码实现2.2.3 递归展开图 2.3 中序遍历2.3.1 分析2.3.2 代码实现2.3.3 递归展开图 2.4 后序遍历2.4.1 分析2.4.2 代码实现2.4.3 递归展开图 2.5 求节点个数2.5.1 分析2.5.2 代码实现 2.6 求叶子节点个数…

Linux 环境下的性能测试——top与stress

对于Linux 环境&#xff0c;top命令是使用频繁且信息较全的命令&#xff0c; 它对于所有正在运行的进行和系统负荷提供实时更新的概览信息。stress是个简单且全面的性能测试工具。通过它可以模拟各种高负载情况。 通过top与stress这两个命令的结合使用&#xff0c;基本可以达到…

解决:ModuleNotFoundError: No module named ‘exceptions’

解决&#xff1a;ModuleNotFoundError: No module named ‘exceptions’ 文章目录 解决&#xff1a;ModuleNotFoundError: No module named exceptions背景报错问题翻译&#xff1a;报错位置代码报错原因解决方法今天的分享就到此结束了 背景 在使用之前的代码时&#xff0c;报…

报表控件Stimulsoft 操作演示:访问编译的报告

使用编译计算模式的报告能够执行使用报告脚本语言实现的各种脚本。然而&#xff0c;这些场景并不总是安全的&#xff0c;从网络安全的角度来看&#xff0c;可能会导致负面情况。经过分析情况&#xff0c;我们决定加强有关编译模式报告的安全策略。但让我们一步一步来。顺便说一…

IDEA版SSM入门到实战(Maven+MyBatis+Spring+SpringMVC) -Mybatis核心配置详解

第一章 Mybatis核心配置详解【mybatis-config.xml】 1.1 核心配置文件概述 MyBatis 的配置文件包含了会深深影响 MyBatis 行为的设置和属性信息。 1.2 核心配置文件根标签 没有实际语义&#xff0c;主要作用&#xff1a;所有子标签均需要设置在跟标签内部 1.3 核心配置文件…

【数电笔记】17-具体函数的卡诺图填入

目录 说明&#xff1a; 用卡诺图表示逻辑函数 1. 基本步骤 2. 例题 2.1 例1-真值表转换卡诺图 2.2 例2-标准与或式画卡诺图 2.3 例3-非标准与或式画卡诺图&#xff08;常见,重点掌握&#xff09; 说明&#xff1a; 笔记配套视频来源&#xff1a;B站&#xff1b;本系列笔…

学生档案管理系统研究

摘 要 学生档案管理系统是一个教育单位不可缺少的部分,它的内容对于学校的决策者和管理者来说都至关重要,所以学生档案管理系统应该能够为用户提供充足的信息和快捷的查询手段。但一直以来人们使用传统人工的方式管理文件档案&#xff0c;这种管理方式存在着许多缺点,如:效率低…

gpt阅读论文利器

1. txyz.ai 读论文 严伯钧 3. consensus 两亿科学论文的资源库. 用英文. 中国经济发展, 美国加州没有,减肥没有. 2. chrome插件 gpt sidebar 3. gpt academic 论文润色和学术翻译 ,一键输出公式. 英语口语8000句. 托福备考计划表. 百词斩托福. 薄荷外刊. 分区笔记精读法.…

java--接口的其他细节

1.jdk8开始&#xff0c;接口新增了三种形式的方法 ①默认方法(实例方法)&#xff1a;使用用default修饰&#xff0c;默认会被加上public修饰。注意&#xff1a;只能使用接口的实现类对象调用 ②私有方法&#xff1a;必须用private修饰(jdk9开始才支持) ③类方法(静态方法)&a…

数字化车间|用可视化技术提升车间工作效率

数字化车间正在成为现代制造业的重要组成部分。随着科技的不断进步&#xff0c;传统的车间生产方式逐渐地被数字化和自动化取代。数字化车间将机器和软件进行整合&#xff0c;实现了生产过程的高效、精确和可追溯。在数字化车间中&#xff0c;机器之间可以进行无缝的通信和协作…

vue: 线上项目element-ui的icon偶尔乱码问题

线上环境偶尔会复现&#xff0c; 具体&#xff1a; 一般使用不会出现这个问题&#xff0c;因为一般引入的是element-ui的css文件&#xff0c;问题出在于为了主题色变化啊&#xff0c;需要用到scss变量引入了scss文件。 import “~element-ui/packages/theme-chalk/src/index”…

XCharts——Unity上最好用的免费开源图表插件!(一)基本介绍

只讲实用干货&#xff01;&#xff01;&#xff01;&#xff08;过于细节的或是未提及到的可直接问&#xff09; 目录 XCharts介绍 插件简介 插件下载 XCharts基本使用 类型介绍 1.折线图&#xff08;LineChart&#xff09; 2.柱形图&#xff08;BarChart&#xff09; …