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();
    }

猜你喜欢

转载自blog.csdn.net/qq_40717065/article/details/129690644