1、視化創(chuàng)建及事件綁定
UI添加Button組件凿傅,在Hierarchy 面板中拖拽腳本缠犀,選擇響應(yīng)方法。
2聪舒、通過(guò)綁定腳本綁定事件
UI添加Button組件辨液。代碼添加如下:
Button btn = this.GetComponent<Button> ().onClick.AddListener (OnClick);
private void OnClick()
{
}
或者委托方式:
Button btn = this.GetComponent<Button> ().onClick.AddListener (()=>{todo;});
3、通過(guò) EventTrigger 實(shí)現(xiàn)按鈕點(diǎn)擊事件
UGUI 系統(tǒng)中 Button 默認(rèn)只提供了 OnClick 的調(diào)用方法, 有時(shí)候我們還需要監(jiān)聽鼠標(biāo)進(jìn)入事件 (MouseIn) 和鼠標(biāo)滑出事件 (MouseOut). 就需要借助 UI 系統(tǒng)中的 EventTrigger 腳本來(lái)實(shí)現(xiàn).
Step 1 : 通過(guò) Hierarchy 面板創(chuàng)建 UI > Button.
Step 2 : 創(chuàng)建一個(gè) EventTriggerHandler.cs 腳本, 利用 UnityEngine.EventSystems.EventTrigger 添加監(jiān)聽事件.
Step 3 : 綁定 EventTriggerHandler.cs 腳本到 Button 上.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
// 需要 EventTrigger 腳本的支援
[RequireComponent(typeof(UnityEngine.EventSystems.EventTrigger))]
public class EventTriggerHandler : MonoBehaviour {
// Use this for initialization
void Start () {
Button btn = this.GetComponent<Button> ();
EventTrigger trigger = btn.gameObject.GetComponent<EventTrigger> ();
EventTrigger.Entry entry = new EventTrigger.Entry ();
// 鼠標(biāo)點(diǎn)擊事件
entry.eventID = EventTriggerType.PointerClick;
// 鼠標(biāo)進(jìn)入事件 entry.eventID = EventTriggerType.PointerEnter;
// 鼠標(biāo)滑出事件 entry.eventID = EventTriggerType.PointerExit;
entry.callback = new EventTrigger.TriggerEvent ();
entry.callback.AddListener (OnClick);
// entry.callback.AddListener (OnMouseEnter);
trigger.triggers.Add (entry);
}
private void OnClick(BaseEventData pointData){
Debug.Log ("Button Clicked. EventTrigger..");
}
private void OnMouseEnter(BaseEventData pointData){
Debug.Log ("Button Enter. EventTrigger..");
}
}
4箱残、通過(guò) MonoBehaviour 實(shí)現(xiàn)事件類接口來(lái)實(shí)現(xiàn)事件的監(jiān)聽
Step 1 : 通過(guò) Hierarchy 面板創(chuàng)建 UI > Button.
Step 2 : 創(chuàng)建一個(gè) EventHandler.cs 腳本.
Step 3 : 將腳本綁定在 Button 對(duì)象上.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
public class EventHandler : MonoBehaviour, IPointerClickHandler, IPointerEnterHandler, IPointerExitHandler, IPointerDownHandler, IDragHandler {
public void OnPointerClick(PointerEventData eventData){
if(eventData.pointerId == -1){
Debug.Log ("Left Mouse Clicked.");
} else if(eventData.pointerId == -2){
Debug.Log ("Right Mouse Clicked.");
}
}
public void OnPointerEnter(PointerEventData eventData){
Debug.Log ("Pointer Enter..");
}
public void OnPointerExit(PointerEventData eventData){
Debug.Log ("Pointer Exit..");
}
public void OnPointerDown(PointerEventData eventData){
Debug.Log ("Pointer Down..");
}
public void OnDrag(PointerEventData eventData){
Debug.Log ("Dragged..");
}
}
注意:適用UI元素滔迈,非UI,camera添加PhysicsRaycaster;
5亡鼠、利用射線的辦法
詳看另外一篇博文
射線
6赏殃、判斷鼠標(biāo)是否點(diǎn)擊到ui上或者點(diǎn)擊到模型上
判斷鼠標(biāo)是否在ui上用的最多的就是EventSystem.current.IsPointerOverGameObject(),但是當(dāng)鼠標(biāo)點(diǎn)擊到有碰撞體的對(duì)象的時(shí)候间涵,這個(gè)方法返回的也是true仁热,就分不清到底是點(diǎn)擊了UI還是點(diǎn)擊到了碰撞物體。
if (EventSystem.current.IsPointerOverGameObject())
{
//進(jìn)入條件:要么鼠標(biāo)在有碰撞體的模型上勾哩,要么在ui上
ray = mCamera.ScreenPointToRay(Input.mousePosition);
if (Physics.Raycast(ray, out hit))
{
//進(jìn)入條件:鼠標(biāo)在有碰撞體的模型上
if (hit.collider.gameObject.layer != LayerMask.NameToLayer("UI"))
mBIsControl = true;
}
else
{
//否則:鼠標(biāo)在ui上
}
}