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
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯絡作者獲得授權並註明出處。