一、先介紹一下Inspector面板里的東西
Button里一共有兩個(gè)腳本蹦哼。
Image(Script)
- 這個(gè)跟Image里是一樣的
Button(Script)
Interactable(交互):Button是否可以點(diǎn)擊的開關(guān)鳄哭,關(guān)閉進(jìn)入Disabled狀態(tài)
Transition(變化):設(shè)置Button按下,彈起纲熏,不可用的顯示狀態(tài)
1.None(空):不管怎么樣都只使用Image(Script)里設(shè)置的圖片的
2.Color Tint(著色):在Image(Script)里設(shè)置的圖片基礎(chǔ)上進(jìn)行著色
- Target Graphic(目標(biāo)圖形):可選擇任意Graphic對(duì)象進(jìn)行著色
- Normal Color(正常狀態(tài)顏色)
- Highlighted Color(突出狀態(tài)顏色):鼠標(biāo)懸妥鼻穑或者選擇狀態(tài)的顏色
- Pressed Color(按下狀態(tài)顏色)
- Disabled Color(不可用狀態(tài)顏色)
- Color Multiplier(增加顏色):這個(gè)不知道有什么用锄俄,emmmm 保持默認(rèn)就好了
- Fade Duration(消失時(shí)間):其實(shí)就是著色時(shí)間與褪色時(shí)間
3.Sprite Swap(圖片切換):選項(xiàng)跟Color Tint中的相似,區(qū)別在于設(shè)置的是圖片
4.Animation(執(zhí)行動(dòng)畫)
Navigation(導(dǎo)航):選中該按鈕后可以用方向鍵比如WASD以及上下左右按鍵選擇其他按鈕勺拣,前提是導(dǎo)航目標(biāo)按鈕也開啟了導(dǎo)航功能奶赠,可通過回車或者空格點(diǎn)擊按鈕響應(yīng)點(diǎn)擊事件
1.None(關(guān)閉)
2.Horizontal(水平導(dǎo)航):左右能導(dǎo)航到按鈕
3.Automatic(自動(dòng)導(dǎo)航):上下左右按鍵都能導(dǎo)航到按鈕
4.Vertical(垂直導(dǎo)航):上下能導(dǎo)航到按鈕
5.Explicit(指定導(dǎo)航):指定上下左右按鍵能導(dǎo)航到那個(gè)按鈕上
Visualize(可視化):把按鍵能夠?qū)Ш降降穆窂娇梢暬吡恋狞S色箭頭為當(dāng)前按鈕可導(dǎo)航到的目標(biāo)(目前只看到該可視化药有,可能還有其他大州?)
二、Button點(diǎn)擊事件
點(diǎn)擊事件很簡(jiǎn)單座咆,直接在Button里能找到一個(gè)On Click()的地方锨推,選擇Editor And Runtime。
然后選擇組件
然后選擇執(zhí)行該控件的腳本函數(shù)宦言,像顯示隱藏就直接GameObject>>SetActive(bool)
如果該函數(shù)需要傳參扇单,在下面會(huì)需要填寫參數(shù),比如我選擇的是GameObject>>SetActive(bool)奠旺,則需傳送bool值蜘澜,空為false,√為true响疚。之后點(diǎn)擊該按鈕就能隱藏BackImage這個(gè)控件了鄙信。控制其他得也同理忿晕。
三扮碧、Button按下、抬起杏糙、長(zhǎng)按事件
按下事件對(duì)于游戲開發(fā)來說很重要慎王,之前工作開發(fā)項(xiàng)目是MMORPG游戲,像攻擊類的按鍵宏侍,都是通過按下來觸發(fā)
與其說是Button長(zhǎng)按赖淤,不如說是所有能接受事件的所有控件的長(zhǎng)按都可以這么實(shí)現(xiàn)。
點(diǎn)擊Button谅河,然后看到該Button的Inspector然后點(diǎn)擊AddComponent >> Event >> Event Trigger咱旱。或者可以直接上面搜索框搜索绷耍。
之后能看到Event Trigger組件吐限,然后點(diǎn)擊里面的Add New Event Type >> PointerDown,再添加PointerUp褂始,現(xiàn)在估計(jì)有人知道我為什么把按下诸典,抬起,長(zhǎng)按放在一起了崎苗,長(zhǎng)按是通過PointerDow(按下)狐粱、PointerUp(抬起)實(shí)現(xiàn)的
創(chuàng)建一個(gè)腳本舀寓,代碼貼在下面
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("長(zhǎng)按觸發(fā)");
IsStart = false;
LastTime = 0;
}
}
public void LongPress(bool bStart)
{
IsStart = bStart;
if(IsStart)
{
LastTime = Time.time;
Debug.Log("長(zhǎng)按開始");
}
else if(LastTime != 0)
{
LastTime = 0;
Debug.Log("長(zhǎng)按取消");
}
}
}
然后把寫好的腳本文件拖到你想設(shè)置長(zhǎng)按功能的控件里,然后設(shè)置好肌蜻,Down傳True互墓,Up傳false,Ping傳3蒋搜,長(zhǎng)按3秒觸發(fā)長(zhǎng)按
Unity3D的C# API文檔中還有有很多其他得函數(shù)篡撵,目前我知道的覺得能使用到的函數(shù)就整理出來了下面幾個(gè),進(jìn)入按鈕離開按鈕在PC的某些游戲會(huì)用到豆挽,鼠標(biāo)懸停在按鈕上的話出現(xiàn)一些小提示育谬,離開這些小提示又會(huì)消失,通過這連個(gè)函數(shù)能夠?qū)崿F(xiàn)
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("進(jìn)入" + this.gameObject.name);
}
}
這段時(shí)間通過學(xué)習(xí)祷杈,更新一下用來實(shí)現(xiàn)Button相關(guān)、點(diǎn)擊渗饮、按下但汞、抬起、長(zhǎng)按事件互站,原理還是差不多私蕾,只是調(diào)用的方法變了
代碼如下
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("長(zhǎng)按");
}
}
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("進(jìn)入");
}
public void LongPress(bool bStart)
{
IsStart = bStart;
LastTime = Time.time;
}
}
如果對(duì)Event Trigger其他的函數(shù)還有興趣的話可以看官方的API
Event Trigger官方API