1. 程式人生 > >Unity3D---UGUI---Button相關、點選、按下、擡起、長按事件

Unity3D---UGUI---Button相關、點選、按下、擡起、長按事件

一、先介紹一下Inspector面板裡的東西

Button裡一共有兩個指令碼。

image.png

Image(Script)

  • 這個跟Image裡是一樣的

Button(Script)

  • Interactable(互動):Button是否可以點選的開關,關閉進入Disabled狀態

image.png

  • Transition(變化):設定Button按下,彈起,不可用的顯示狀態

1.None(空):不管怎麼樣都只使用Image(Script)裡設定的圖片的

2.Color Tint(著色):在Image(Script)裡設定的圖片基礎上進行著色

  • Target Graphic(目標圖形):可選擇任意Graphic物件進行著色
  • Normal Color(正常狀態顏色)
  • Highlighted Color(突出狀態顏色):滑鼠懸停或者選擇狀態的顏色
  • Pressed Color(按下狀態顏色)
  • Disabled Color(不可用狀態顏色)
  • Color Multiplier(增加顏色):這個不知道有什麼用,emmmm 保持預設就好了
  • Fade Duration(消失時間):其實就是著色時間與褪色時間

3.Sprite Swap(圖片切換):選項跟Color Tint中的相似,區別在於設定的是圖片

4.Animation(執行動畫)

image.png

  • Navigation(導航):選中該按鈕後可以用方向鍵比如WASD以及上下左右按鍵選擇其他按鈕,前提是導航目標按鈕也開啟了導航功能,可通過回車或者空格點選按鈕響應點選事件

1.None(關閉)

2.Horizontal(水平導航):左右能導航到按鈕

3.Automatic(自動導航):上下左右按鍵都能導航到按鈕

4.Vertical(垂直導航):上下能導航到按鈕

5.Explicit(指定導航):指定上下左右按鍵能導航到那個按鈕上

image.png

  • Visualize(視覺化):把按鍵能夠導航到的路徑視覺化,高亮的黃色箭頭為當前按鈕可導航到的目標(目前只看到該視覺化,可能還有其他?)

二、Button點選事件

點選事件很簡單,直接在Button裡能找到一個On Click()的地方,選擇Editor And Runtime。

 

image.png

 

然後選擇元件

 

image.png


然後選擇執行該控制元件的指令碼函式,像顯示隱藏就直接GameObject>>SetActive(bool)

image.png

 

如果該函式需要傳參,在下面會需要填寫引數,比如我選擇的是GameObject>>SetActive(bool),則需傳送bool值,空為false,√為true。之後點選該按鈕就能隱藏BackImage這個控制元件了。控制其他得也同理。

 

image.png

三、Button按下、擡起、長按事件

按下事件對於遊戲開發來說很重要,之前工作開發專案是MMORPG遊戲,像攻擊類的按鍵,都是通過按下來觸發
與其說是Button長按,不如說是所有能接受事件的所有控制元件的長按都可以這麼實現。
點選Button,然後看到該Button的Inspector然後點選AddComponent >> Event >> Event Trigger。或者可以直接上面搜尋框搜尋。

 

image.png

 

之後能看到Event Trigger元件,然後點選裡面的Add New Event Type >> PointerDown,再新增PointerUp,現在估計有人知道我為什麼把按下,擡起,長按放在一起了,長按是通過PointerDow(按下)、PointerUp(擡起)實現的

 

image.png

建立一個指令碼,程式碼貼在下面

using UnityEngine;
public class ChangAn : MonoBehaviour 
{
    public float Ping;
    private bool IsStart = false;
    private float LastTime = 0;
    void Update () {
        if (IsStart && Ping > 0 && LastTime > 0 && Time.time - LastTime > Ping)
        {
            Debug.Log("長按觸發");
            IsStart = false;
            LastTime = 0;
        }
    }
    public void LongPress(bool bStart)
    {
        IsStart = bStart;
        if(IsStart)
        {
            LastTime = Time.time;
            Debug.Log("長按開始");
        }
        else if(LastTime != 0)
        {
            LastTime = 0;
            Debug.Log("長按取消");
        }    
    }
}

然後把寫好的指令碼檔案拖到你想設定長按功能的控制元件裡,然後設定好,Down傳True,Up傳false,Ping傳3,長按3秒觸發長按

 

image.png

Unity3D的C# API文件中還有有很多其他得函式,目前我知道的覺得能使用到的函式就整理出來了下面幾個,進入按鈕離開按鈕在PC的某些遊戲會用到,滑鼠懸停在按鈕上的話出現一些小提示,離開這些小提示又會消失,通過這連個函式能夠實現

using UnityEngine;
using UnityEngine.EventSystems;

public class OnImage : EventTrigger
{
    public override void OnPointerDown(PointerEventData eventData)
    {
        base.OnPointerDown(eventData);
        Debug.Log("按下" + this.gameObject.name);
    }
    public override void OnPointerUp(PointerEventData eventData)
    {
        base.OnPointerUp(eventData);
        Debug.Log("擡起" + this.gameObject.name);
    }
    public override void OnPointerExit(PointerEventData eventData)
    {
        base.OnPointerExit(eventData);
        Debug.Log("離開" + this.gameObject.name);
    }
    public override void OnPointerEnter(PointerEventData eventData)
    {
        base.OnPointerEnter(eventData);
        Debug.Log("進入" + this.gameObject.name);
    }
}

這段時間通過學習,更新一下用來實現Button相關、點選、按下、擡起、長按事件,原理還是差不多,只是呼叫的方法變了
程式碼如下

using UnityEngine;
using UnityEngine.EventSystems;

public class OnImage : MonoBehaviour,IPointerDownHandler,IPointerUpHandler,IPointerExitHandler,IPointerEnterHandler
{
    public float Ping;
    private bool IsStart = false;
    private float LastTime = 0;

    void Update()
    {
        if (IsStart && Time.time - LastTime > Ping)
        {
            IsStart = false;
            Debug.Log("長按");
        }
    }
    public void OnPointerDown(PointerEventData eventData)
    {
        LongPress(true);
        Debug.Log("按下");
    }
    public void OnPointerUp(PointerEventData eventData)
    {
        if(IsStart)
        {
            LongPress(false);
            Debug.Log("擡起");
        }      
    }
    public void OnPointerExit(PointerEventData eventData)
    {
        Debug.Log("離開");
    }
    public void OnPointerEnter(PointerEventData eventData)
    {
        Debug.Log("進入");
    }
    public void LongPress(bool bStart)
    {
        IsStart = bStart;
        LastTime = Time.time;
    }
}

如果對Event Trigger其他的函式還有興趣的話可以看官方的API
Event Trigger官方API



作者:Xeroo
連結:https://www.jianshu.com/p/9f0f90acc84f
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯絡作者獲得授權並註明出處。