unity 手柄控制按钮切换显示的通用方法

news/2024/6/16 23:26:52 标签: unity, 游戏引擎

  在UI的基类内放入下面的代码

public void BaseUpdate()
    {
        if (isGameClick && Manager.isShowGuid)
        {
            return;
        }
        if (ControllerManager.Instance.GetKeyDown(XboxControllerKey.LUp, 0) || ControllerManager.Instance.GetKeyDown(XboxControllerKey.LUp, 1) || Input.GetKeyDown(KeyCode.W))
        {
            //上
            Vertical_Click(-1);
            Debug.Log("XBoxClick.DPadHorizontal2" + "-1");
        }
        if (ControllerManager.Instance.GetKeyDown(XboxControllerKey.LDown, 0) || ControllerManager.Instance.GetKeyDown(XboxControllerKey.LDown, 1) || Input.GetKeyDown(KeyCode.S))
        {
            //下
            Vertical_Click(1);
            Debug.Log("XBoxClick.DPadHorizontal2" + 1);
        }
        if (ControllerManager.Instance.GetKeyDown(XboxControllerKey.LLeft, 0) || ControllerManager.Instance.GetKeyDown(XboxControllerKey.LLeft, 1) || Input.GetKeyDown(KeyCode.A))
        {
            //左
            Horizontal_Click(-1);
            Debug.Log("XBoxClick.RightStickVertical" + "-1");
        }
        if (ControllerManager.Instance.GetKeyDown(XboxControllerKey.LRight, 0) || ControllerManager.Instance.GetKeyDown(XboxControllerKey.LRight, 1) || Input.GetKeyDown(KeyCode.D))
        {
            //右
            Horizontal_Click(1);
            Debug.Log("XBoxClick.RightStickVertical" + "-1");
        }

        if (ControllerManager.Instance.GetKeyDown(XboxControllerKey.A, 0) || ControllerManager.Instance.GetKeyDown(XboxControllerKey.A, 1) || Input.GetKeyDown(KeyCode.Q))
        {
            //A键
            Debug.Log("Update" + "-1");
            Sure_Click();
        }

        if (ControllerManager.Instance.GetKeyDown(XboxControllerKey.B, 0) || ControllerManager.Instance.GetKeyDown(XboxControllerKey.B, 1) || Input.GetKeyDown(KeyCode.Space))
        {
            //B键
            Back_Click();
        }
        if (isAllowClick)
        {
            clickTime += Time.deltaTime;
            if (clickTime > 0.2)
            {
                isAllowClick = false;
                clickTime = 0;
            }
        }
    }


    [HideInInspector]
    //横向选择
    public int h_Index = 0;
    [HideInInspector]
    //纵向选择
    public int v_Index = 0;

    public List<List<Button>> buttons = new List<List<Button>>();
    [HideInInspector]
    public bool isAllowClick = false;
    //[HideInInspector]
    public bool isGameClick = false;
    float clickTime = 0;

//选中的下标横向变换
    public virtual void Horizontal_Click(int num)
    {
        if (isAllowClick)
        {
            return;
        }
        isAllowClick = true;
        h_Index += num;

        RefreshDown();
        //Debug.Log("Horizontal_Click" + num); 
    }

//选中的下标纵向变换
    public virtual void Vertical_Click(int num)
    {
        if (isAllowClick)
        {
            return;
        }
        isAllowClick = true;
        v_Index += num;

        RefreshDown();
        //Debug.Log("Vertical_Click" + num);
    }
    Button selectBtn = null;
    //刷新选中显示
    public virtual void RefreshDown()
    {
        if (h_Index < 0)
        {
            h_Index = buttons.Count - 1;
        }
        if (h_Index >= buttons.Count)
        {
            h_Index = 0;
        }
        int vertiaclNum = 0;
        if (buttons.Count > 0)
        {
            vertiaclNum = buttons[h_Index].Count;
        }

        if (v_Index < 0)
        {
            v_Index = vertiaclNum - 1;
        }
        if (v_Index >= vertiaclNum)
        {
            v_Index = 0;
        }

        for (int i = 0; i < buttons.Count; i++)
        {
            var btns = buttons[i];
            for (int j = 0; j < btns.Count; j++)
            {
                bool isShow = i == h_Index && j == v_Index;
                if (isShow)
                {
                    selectBtn = btns[j];
                }

//将选中标志高亮的图显示出来

//需要自己添加高亮图,改名
                btns[j].transform.Find("ClickDown").gameObject.SetActive(isShow);
            }
        }
    }

//确认

    public virtual void Sure_Click()
    {
        if (isAllowClick)
        {//防止连击
            return;
        }
        isAllowClick = true;
        if (selectBtn != null)
        {
            selectBtn.onClick.Invoke();
        }
    }

//返回键

    public virtual void Back_Click()
    {
        if (isAllowClick)
        {
            return;
        }
        isAllowClick = true;
    }

将下面代码放入UI的子类

//将要控制显示的按钮

 public List<Button> buttons1 = new List<Button>();

    public List<Button> buttons2 = new List<Button>();

    public List<Button> buttons3 = new List<Button>();

    public List<Button> buttons4 = new List<Button>();

private void Start()
    {

        buttons.Add(buttons3);
        buttons.Add(buttons1);
        buttons.Add(buttons2);
        buttons.Add(buttons4);
        RefreshDown();
    }

  private void OnEnable()
    {

//设置开始显示选中的按钮
        h_Index = 1;

    }

//将父类的BaseUpdate放入update生效

  private void Update()
    {
            BaseUpdate();
    }

//重写确定部分可以加入自己需要的内容

public override void Sure_Click()
    {
        Manager.isHandShank = true;
        base.Sure_Click();
    }
    public override void Back_Click()
    {
        base.Back_Click();

        UIManager.Instance.exitPanel.OnEnter();
    }


http://www.niftyadmin.cn/n/169898.html

相关文章

OJ练习第52题——插入区间

插入区间 力扣链接&#xff1a;57.插入区间 题目描述 给你一个 无重叠的 &#xff0c;按照区间起始端点排序的区间列表。 在列表中插入一个新的区间&#xff0c;你需要确保列表中的区间仍然有序且不重叠&#xff08;如果有必要的话&#xff0c;可以合并区间&#xff09;。 …

通过编写猫咪相册应用学习HTML

文章目录1. 标题元素标签2. p元素用于在网站上创建一段文本3. 注释4. 页面主要部分标识标签5. 通过使用img元素来为你的网站添加图片6. 使用锚点元素(a)链接到另一个页面7. 使用 section 元素将照片内容与未来的内容分开8. 无序列表(ul)元素&#xff0c;列表项(li)元素在列表中…

Python中模块是个啥

昨天有粉丝问我说&#xff0c;啥是模块&#xff1f;经常听别人口中提这个词&#xff0c;但就是不懂。 模块可以认为是一盒主题积木&#xff0c;通过它可以拼出某一主题的东西。这与之前介绍的函数不同&#xff0c;一个函数相当于一块积木&#xff0c;而一个模块中可以包括很多函…

【Spring boot】RedisTemplate中String、Hash、List设置过期时间

Redis中String设置时间的方法 redisTemplate.opsForValue().set("loginCode","254588",2, TimeUnit.SECONDS);//过期时间2秒 redisTemplate.opsForValue().set("loginCode","254588",2, TimeUnit.MINUTES);//过期时间2分钟 redisTemp…

hdfs的异构存储

文章目录1 背景2 hdfs异构存储类型和存储策略2.1 hdfs支持的存储类型2.2 hdfs如何知道数据存储目录是那种存储类型2.3 存储策略2.3.1 在hdfs中支持如下存储策略2.3.2 存储策略表2.3.4 Storage Policy Resolution2.3.5 配置存储策略2.3.6 基于存储策略的数据移动2.3.7 存储策略命…

如何有效编写企业工作手册?

工作手册是一种指导工作流程和操作方法的文件&#xff0c;通常用于组织和管理企业内部的工作流程。它可以提供一个标准、统一和可重复的方法来执行任务&#xff0c;使企业内部的工作流程更加高效和精确。工作手册通常包括以下职责&#xff1a;工作流程&#xff1a;工作手册会详…

ESP32设备驱动-ADXL335加速计驱动

ADXL335加速计驱动 文章目录 ADXL335加速计驱动1、ADXL335介绍2、硬件准备3、软件准备4、驱动实现1、ADXL335介绍 ADXL335 是一款小型、薄型、低功耗、完整的 3 轴加速度计,具有信号调理电压输出。 该产品以 3 g 的最小满量程测量加速度。它可以测量倾斜传感应用中的静态重力…

【2023-03-21】windows平台编译SRS

【2023-03-20】windows平台编译SRS 合集资料:FFMpge\OpenCV\libVLC\Nginx\SRS视频流合集 SRS文档:Windows下的SRS 1. cygwin64 SRS现在有windows版本了,是基于cygwin64实现的,请参考srs-windows。 cygwin是一个在windows平台上运行的unix模拟环境,使用一个Dll(动态链…