RPG项目01_UI面板Game

news2024/11/28 22:36:40

基于“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

添加标签

拖拽

增加两个页面的偏移值

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

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

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

相关文章

【力扣 面试题02.07链表相交】一种思路极其清晰的解法

力扣一单简单题&#xff0c;看完大佬的题解真是佩服得五体投地&#xff01; 虽是一道简单题&#xff0c;当我吭哧吭哧写了几十行后&#xff0c;看到大佬仅仅几行直接秒掉&#xff0c;只能说算法的本质还是数学&#xff0c;数学逻辑思维真是太重要了&#xff0c;有时候真得慢慢去…

Zookeeper--环境安装实验

配置java环境: 1-解压 /opt/module/softwart下的java包到/opt/module下: tar -zxvf jdk-8u212-linux-x64.tar.gz -C /opt/module/ 2-配置java环境变量: (root用户)去/etc/profile.d/目录下编辑my_env.sh vi /etc/profile.d/my_env.sh export JAVA_HOME=/opt/module/jd…

【电子取证篇】汽车取证数据提取与汽车取证实例浅析(附标准下载)

【电子取证篇】汽车取证数据提取与汽车取证实例浅析&#xff08;附标准下载&#xff09; 关键词&#xff1a;汽车取证&#xff0c;车速鉴定、声像资料鉴定、汽车EDR提取分析 汽车EDR一般记录车辆碰撞前后的数秒&#xff08;5s左右&#xff09;相关数据&#xff0c;包括车辆速…

Linux系统---图书管理中的同步问题

顾得泉&#xff1a;个人主页 个人专栏&#xff1a;《Linux操作系统》 《C/C》 《LeedCode刷题》 键盘敲烂&#xff0c;年薪百万&#xff01; 一、问题描述 &#xff08;1&#xff09;图书馆阅览室最多能够容纳N&#xff08;N5&#xff09;名学生&#xff0c;若有更多学生想…

10.机器人系统仿真(urdf集成gazebo、rviz)

目录 1 机器人系统仿真的必要性与本篇学习目的 1.1 机器人系统仿真的必要性 1.2 一些概念 URDF是 Unified Robot Description Format 的首字母缩写&#xff0c;直译为统一(标准化)机器人描述格式&#xff0c;可以以一种 XML 的方式描述机器人的部分结构&#xff0c;比如底盘…

吉他初学者学习网站搭建系列(5)——如何做一个在线节拍器

文章目录 背景实现TransportLoop代码 在线尝试 背景 我们看吉他谱时&#xff0c;经常看到拍号&#xff0c;例如6/8。它的含义是一拍是一个八分音符&#xff0c;一小节有六拍。四分音符的时长是一秒&#xff0c;即60拍/分钟。基于这样的背景知识&#xff0c;我们就可以根据一些…

一文看懂 Linux 内核,清晰明了

Linux内核预备工作 理解Linux内核最好预备的知识点&#xff1a;懂C语言 懂一点操作系统的知识 熟悉少量相关算法 懂计算机体系结构 Linux内核的特点&#xff1a; 结合了 unix 操作系统的一些基础概念。 Linux内核的任务&#xff1a; 1. 从技术层面讲&#xff0c;内核是硬…

华为快应用中自定义Slider效果

文章目录 一、前言二、实现代码三、参考链接 一、前言 在华为快应用中官方提供了<slider>控件&#xff0c;但是这个控件的限制比较多&#xff0c;比如滑块无法自定义&#xff0c;所以这里进行下自定义&#xff0c;自己修改样式。 二、实现代码 整体效果如下: 源码如下…

全网最新最全的Appium自动化:Appium常用操作之等待操作

等待机制&#xff1a; 为了保证脚本的稳定性&#xff0c;有时候需要引入等待时间&#xff0c;等待页面加载元素后再进行操作&#xff0c;主要有三种等待时间设置方式。 方式一&#xff1a; sleep()&#xff1a;固定等待时间设置&#xff0c;python的time包里提供了休眠方法sle…

Windows测试端口连通性(Telnet勾选)

“win““r”之后&#xff0c;telnet地址端口号 在最新版本的Windows中&#xff0c;默认情况下并没有安装Telnet客户端。如果遇到"telnet不是内部或外部命令…"的错误&#xff0c;请手动安装Telnet客户端。你可以在控制面板的"程序和功能"选项卡中找到&quo…

基于Git的代码工程管理——学习记录一

一、Git简概[1] Git是一个分布式版本控制系统&#xff0c;它跟踪任何一组计算机文件的更改&#xff0c;通常用于在软件开发过程中协调协作开发源代码的程序员之间的工作。其为实现快速、数据完整性以及分布式非线性工作流程&#xff08;在不同计算机上运行数千个并行分支&#…

搬运工让你分分钟了解Web接口测试

01、什么是接口 百度说&#xff1a;接口泛指实体把自己提供给外界的一种抽象化物&#xff08;可以为另一实体&#xff09;&#xff0c;用以由内部操作分离出外部沟通方法&#xff0c;使其能被内部修改而不影响外界其他实体与其交互的方式 上面这句有点抽象&#xff0c;网上的…

跨语种「AI同传」颠覆语音翻译!Meta谷歌连发重大突破

Meta谷歌接连放出重磅成果&#xff01;Meta开源无缝交流语音翻译模型&#xff0c;谷歌放出无监督语音翻译重大突破Translation 3。 就在Meta AI成立10周年之际&#xff0c;研究团队重磅开源了在语音翻译领域的突破性进展——「无缝交流」&#xff08;Seamless Communication&a…

python中的输入输出

文章目录 输入函数input()例子1.如何输入获得两个字符串?&#xff08;若输入abc def或abc,def)2.如何输入获得两个整数?&#xff08;若输入34,567)3.如何输入后获得一个元素均为数值型的列表?&#xff08;若输入12,3.4,567或[12,3.4,567]&#xff09; 输出输出函数print()pr…

第十六届山东省职业院校技能大赛 中职组网络建设与运维赛项样题

第十六届山东省职业院校技能大赛 中职组网络建设与运维赛项样题 赛题说明 一、竞赛项目简介 “网络建设与运维”竞赛共分为以下三个模块&#xff1a; > 网络理论测试&#xff1a; > 网络建设与调试&#xff1b; > 服务搭建与运维。 模块 比赛时长 分值 模块一 网络…

【恋上数据结构】二叉堆学习笔记

二叉堆 需求分析 Top K 问题 什么是 Top K 问题&#xff1f; 从海量数据中找出前 K 个数据。 比如&#xff1a;从 100 万个整数中找出最大的 100 个整数Top K 问题的解法之一&#xff1a;可以用数据结构 “堆” 来解决。 堆 堆是一种【完全二叉树】&#xff0c;可以分为【…

Hadoop学习笔记(HDP)-Part.07 安装MySQL

目录 Part.01 关于HDP Part.02 核心组件原理 Part.03 资源规划 Part.04 基础环境配置 Part.05 Yum源配置 Part.06 安装OracleJDK Part.07 安装MySQL Part.08 部署Ambari集群 Part.09 安装OpenLDAP Part.10 创建集群 Part.11 安装Kerberos Part.12 安装HDFS Part.13 安装Ranger …

手动创建spring bean并注入

文章目录 前言一、jar包中,相同class不同类加载器加载的时候是同一个class嘛&#xff1f;二、利用ConfigurableListableBeanFactory手动注册bean注册bean,并自动注入依赖bean根据类型获取注入的bean,两个bean是一个吗? 三、同一份字节码,class隔离,bean隔离总结 前言 注入一个…

Linux的IO模型——阻塞IO

当要读数据recvfrom时&#xff0c;其实就需要两个阶段&#xff0c;一是将硬盘数据读到内核缓冲区&#xff0c;二是将内核缓冲区数据拷贝到用户缓冲区。而阻塞IO就是在两个阶段中用户进程都必须阻塞等待。

ES通过抽样agg聚合性能提升3-5倍

一直以来&#xff0c;es的agg聚合分析性能都比较差&#xff08;对应sql的 group by&#xff09;。特别是在超多数据中做聚合&#xff0c;在搜索的条件命中特别多结果的情况下&#xff0c;聚合分析会非常非常的慢。 一个聚合条件&#xff1a;聚合分析请求的时间 search time a…