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的四個指向:
如果有問題的部分,希望大佬們留言,我會及時更改,謝謝。