在Unity的学习中,最早接触到的几样组件里一定会有Button这个组件,从Unity入门小游戏打砖块就可以看出,单纯使用UI就可以做出很多小游戏,下面介绍一下Button组件的相关功能。
Interactable(是否可用):勾选,按钮可用,取消勾选,按钮不可用,并进入Disabled状态。这个功能和勾选enable有点类似,只是,勾选Interactable,Button不会被隐藏,依然存在场景中,只是无法触发点击事件罢了。
Transition(过渡方式):按钮在状态改变时自身的过渡方式:总共有四种选择,分别是None(不做任何变动)、Color Tint(颜色改变) 、Sprite Swap(图片切换) 、Animation(执行动画)。这四种过渡方式其实就是当你点击按钮前、按下按钮时、离开按钮后按钮的一种变换过程而已。
(敲黑板,今天的重点)Navigation(按钮导航):在EventSystem中,存在一个当前被选中按钮,我们可以通过代码按下的上下左右,使被选中按钮进行更改。该导航有五种:
None(关闭):关闭导航。
Automatic(自动导航):自动识别最近的一个控件并导航到下一个控件。
Horizontal(水平导航):水平方向导航到下一个控件。
Vertical(垂直导航):垂直方向导航到下一个控件。
Explicit(指定导航):特别指定在按下特定方向键时从此按钮导航到哪一个控件。
那么问题就来了,当我们在场景运行的时候,如果需要更改控件的导航指向,需要如何通过代码进行控制呢?
如下,现在我的Button控件都是Explicit指定导航状态:
这个时候我需要改变他们之前设置的指向,不要让他们彼此指向相邻的控件,那么可用如下代码:
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的四个指向:
如果有问题的部分,希望大佬们留言,我会及时更改,谢谢。