1. 程式人生 > >NGUI基礎之Button(一)Navigation

NGUI基礎之Button(一)Navigation

        在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的四個指向:

如果有問題的部分,希望大佬們留言,我會及時更改,謝謝。