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

添加标签

拖拽

增加两个页面的偏移值

修改MyPlayer代码:

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
}
 

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

/

即可实现拖拽物品道具

放置相同位置也可以交换

新建新输入系统文件夹Tools

修改MyPlayer代码:

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
}

找到关闭Bag按钮

实现点击背包x关闭

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

玩转大数据7:数据湖与数据仓库的比较与选择

1. 引言 在当今数字化的世界中&#xff0c;数据被视为一种宝贵的资源&#xff0c;而数据湖和数据仓库则是两种重要的数据处理工具。本文将详细介绍这两种工具的概念、作用以及它们之间的区别和联系。 1.1. 数据湖的概念和作用 数据湖是一个集中式存储和处理大量数据的平台&a…

3.5毫米音频连接器接线方式

3.5毫米音频连接器接线方式 耳机插头麦克风插头 绘制电路图注意事项 3.5毫米音频连接器分为单声道开关型和无开关型如下图&#xff1a; sleeve&#xff08;套筒&#xff09; tip&#xff08;尖端&#xff09; ring&#xff08;环&#xff09; 耳机插头 麦克风插头 绘制电路图…

【微服务】springboot整合quartz使用详解

目录 一、前言 二、quartz介绍 2.1 quartz概述 2.2 quartz优缺点 2.3 quartz核心概念 2.3.1 Scheduler 2.3.2 Trigger 2.3.3 Job 2.3.4 JobDetail 2.4 Quartz作业存储类型 2.5 适用场景 三、Cron表达式 3.1 Cron表达式语法 3.2 Cron表达式各元素说明 3.3 Cron表达…

北邮22级信通院数电:Verilog-FPGA(12)第十二周实验(2)彩虹呼吸灯(bug已解决 更新至3.0)

北邮22信通一枚~ 跟随课程进度更新北邮信通院数字系统设计的笔记、代码和文章 持续关注作者 迎接数电实验学习~ 获取更多文章&#xff0c;请访问专栏&#xff1a; 北邮22级信通院数电实验_青山如墨雨如画的博客-CSDN博客 目录 一.代码部分 1.1一些更新和讲解 1.2改正后的…

Vue配置代理解决跨域

Network的status中报CORS error指在前端&#xff08;Vue.js&#xff09;发起跨域请求时&#xff0c;被服务器拒绝访问的错误 在本地开发环境中&#xff0c;Vue.js 将默认从 http://localhost:8080 启动服务器。如果浏览器访问服务器时使用的 URL 不是该地址&#xff0c;就可能…

selenium 解决 id定位、class定位中,属性值带空格的解决办法

一、前置说明 selenium遇到下面这种元素&#xff1a; <th id"demo id" class"value1 value2 value3 ">1、虽然id一般不会有空格&#xff0c;但是前端错误的这种写法(如下图)&#xff0c;会造成使用id定位不到元素&#xff0c;如&#xff1a; find…

Unity3D对CSV文件操作(创建、读取、写入、修改)

系列文章目录 Unity工具 文章目录 系列文章目录前言一、Csv是什么&#xff1f;二、创建csv文件2-1、构建表数据2-2、创建表方法2-3、完整的脚本&#xff08;第一种方式&#xff09;2-4、运行结果2-5、完整的脚本&#xff08;第二种方式&#xff09;2-6、运行结果2-7、想用哪种…

《Linux源码趣读》| 好书推荐

目录 一. &#x1f981; 前言二. &#x1f981; 像小说一样趣读 Linux 源码三. &#x1f981; 学习路线 一. &#x1f981; 前言 最近、道然科技给狮子送了两本书&#xff1a;一本是付东来的《labuladong的算法笔记》、一本是闪客著的《Linux源码趣读》&#xff0c;《labulado…

Python并发-线程和进程

一、线程和进程对应的问题 **1.进程&#xff1a;**CPU密集型也叫计算密集型&#xff0c;指的是系统的硬盘、内存性能相对CPU要好很多&#xff0c;此时&#xff0c;系统运作大部分的状况是CPU Loading 100%&#xff0c;CPU要读/写I/O(硬盘/内存)&#xff0c;I/O在很短的时间就可…

ZLMediakit-method ANNOUNCE failed: 401 Unauthorized(ffmpeg、obs推流rtmp到ZLM发现的问题)

错误截图 解决办法&#xff1a;能推流成功&#xff0c;但是不能写入到wvp数据库中 修改配置文件config.ini 改成0 修改之后 重启服务 systemctl restart zlm*推流成功 解决办法&#xff1a;能推流&#xff0c;能写入数据库中 替换zlm版本&#xff0c;可以用我文章中提供的编译…

【STM32入门】3.OLED屏幕

1.OLED引脚 OLED屏幕的接线按图所示&#xff0c;本例中用的是4管脚OLED屏幕 2.驱动程序 配套的驱动程序是“OLED.c"&#xff0c;主要由以下函数构成&#xff1a;1、初始化&#xff1b;2、清屏&#xff1b;3、显示字符&#xff1b;4、显示字符串&#xff1b;5、显示数字…

计算机毕业设计 基于SpringBoot的高校毕业与学位资格审核系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

LAMP安装部署网站

目录 什么是LAMP? 实验&#xff08;搭建一个论坛&#xff09; 一&#xff0c;安装apache 1.关闭防火墙&#xff0c;将安装Apache所需软件包传到/opt目录下 2.安装环境依赖包 3.配置软件模块 4.编译及安装 5.优化配置文件路径&#xff0c;并把httpd服务的可执行程序文件…

什么是网站劫持

网站劫持是一种网络安全威胁&#xff0c;它通过非法访问或篡改网站的内容来获取机密信息或者破坏计算机系统。如果您遇到了网站劫持问题&#xff0c;建议您立即联系相关的安全机构或者技术支持团队&#xff0c;以获得更专业的帮助和解决方案。

python数据分析之二、读取excel数据并绘制折线图,柱状图、饼状图

今天开始第二篇&#xff0c;也是那位可爱的同学的期末作业 题目基本描述如下&#xff1a;给一个简单的execl表格数据&#xff0c;用并列折线图&#xff0c;并列柱状图和饼图来表现数据。 现给定表格数据如下&#xff1a; 地区人口数0-14岁5-64岁65岁及以上全国14940542613671…

LeetCode124.二叉树中最大路径和

第一次只花了20分钟左右就完全靠自己把一道hard题做出来了。我这个方法还是非常简单非常容易理解的&#xff0c;虽然时间复杂度达到了O(n2)。以下是我的代码&#xff1a; class Solution {int max;public int maxPathSum(TreeNode root) {max Integer.MIN_VALUE;return dfs2(…

船舶机电设备振动数据采集监控系统解决方案

船舶运行中&#xff0c;通常需要通过振动数据采集系统对船舶的各个机电设备运行进行监控&#xff0c;有助于在设备故障时快速预警&#xff0c;进行诊断、分析和维护&#xff0c;保证船舶机电设备正常工作&#xff0c;从而确保工作人员及船舶的安全。 船舶各种机电设备会产生大…

机器连接和工业边缘计算

软件应用和IT创新是制造业投资的主要驱动力。解决方案架构应围绕特定标准进行整合&#xff0c;并采用架构蓝图和最佳实践来满足最终用户的需求。此外&#xff0c;边缘计算&#xff08;Edge Computing&#xff09;也将在制造业中加速部署。 边缘计算是制造业的下一个变革驱动力。…

PyQt基础_011_对话框类控件QMessage

基本功能 import sys from PyQt5.QtCore import * from PyQt5.QtGui import * from PyQt5.QtWidgets import *class WinForm( QWidget): def __init__(self): super(WinForm,self).__init__() self.setWindowTitle("QMessageBox") self.resize(300, 100) self.myButt…

Unity3D实现鼠标悬浮UI或物体上显示文字信息

系列文章目录 Unity工具 文章目录 系列文章目录前言最终效果一、UI事件显示文字1-1 ui事件需要引用命名空间using UnityEngine.EventSystems;1-2 IPointerEnterHandler 接口1-3 IPointerExitHandler 接口1-4 IPointerMoveHandler 接口 二、场景搭建2-1 实现如下 三、代码实现3…