在Unity的学习中,最早接触到的几样组件里一定会有Button这个组件,从Unity入门小游戏打砖块就可以看出,单纯使用UI就可以做出很多小游戏,下面介绍一下Button组件的相关功能。

unity GetMouseButtonUp手机上 unity button navigation_Unity3D

Interactable(是否可用):勾选,按钮可用,取消勾选,按钮不可用,并进入Disabled状态。这个功能和勾选enable有点类似,只是,勾选Interactable,Button不会被隐藏,依然存在场景中,只是无法触发点击事件罢了。

Transition(过渡方式):按钮在状态改变时自身的过渡方式:总共有四种选择,分别是None(不做任何变动)、Color Tint(颜色改变) 、Sprite Swap(图片切换) 、Animation(执行动画)。这四种过渡方式其实就是当你点击按钮前、按下按钮时、离开按钮后按钮的一种变换过程而已。

(敲黑板,今天的重点)Navigation(按钮导航):在EventSystem中,存在一个当前被选中按钮,我们可以通过代码按下的上下左右,使被选中按钮进行更改。该导航有五种:

None(关闭):关闭导航。

Automatic(自动导航):自动识别最近的一个控件并导航到下一个控件。

Horizontal(水平导航):水平方向导航到下一个控件。

Vertical(垂直导航):垂直方向导航到下一个控件。

Explicit(指定导航):特别指定在按下特定方向键时从此按钮导航到哪一个控件。

 

那么问题就来了,当我们在场景运行的时候,如果需要更改控件的导航指向,需要如何通过代码进行控制呢?

如下,现在我的Button控件都是Explicit指定导航状态:

unity GetMouseButtonUp手机上 unity button navigation_控件_02

这个时候我需要改变他们之前设置的指向,不要让他们彼此指向相邻的控件,那么可用如下代码:

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

public class Test : MonoBehaviour {
    //用于保存当前场景中的Button控件
    public Button[] buttons;
    //控件数组下标
    private int index;

	// Use this for initialization
	void Start () {

        index = 0;
	}
	
	// Update is called once per frame
	void Update () {
        //在这里我实现了,每从键盘上按下一次A,就改变下标为index的控件的四个方向的导航
		if(Input.GetKeyDown(KeyCode.A))
        {
            Button btn=buttons[index % buttons.Length];
            //创建一个新的Navigation导航控件
            Navigation nav1 = new Navigation();
            //设置这个控件的模式是制定导航
            nav1.mode = Navigation.Mode.Explicit;
            for (int i = 0; i < 4; i++)
            {
                int random=Random.Range(0, buttons.Length);
                print(random);
                if (i == 0)
                {
                    //令新建的navigation控件指向随机button
                    nav1.selectOnDown = buttons[random];
                }
                else if(i==1)
                {
                    nav1.selectOnUp = buttons[random];
                }
                else if (i == 2)
                {
                    nav1.selectOnLeft = buttons[random];
                }
                else if (i == 3)
                {
                    nav1.selectOnRight = buttons[random];
                }
            }
            //随机四次之后,四个方向的导航都设置完毕,然后把新建的导航控件赋值给要更改的Button控件
            btn.navigation = nav1;
            index++;
        }
	}
}

以上,就完成了动态更改Button的导航设定了。

之后在运行时按下一次A,结果如下,更改了Button1的四个指向:

unity GetMouseButtonUp手机上 unity button navigation_控件_03

如果有问题的部分,希望大佬们留言,我会及时更改,谢谢。