unity 如何判斷鼠標是否在哪個UI上(兩種方法)
第一種
可以得到UI,再根據名字判斷是不是自己自己要點擊的UI
其中參數canvas拖入此UI的canvas
/// <summary> /// 獲取鼠標停留處UI /// </summary> /// <param name="canvas"></param> /// <returns></returns> public GameObject GetOverUI(GameObject canvas) { PointerEventData pointerEventData = new PointerEventData(EventSystem.current); pointerEventData.position = Input.mousePosition; GraphicRaycaster gr = canvas.GetComponent<GraphicRaycaster>(); List<RaycastResult> results = new List<RaycastResult>(); gr.Raycast(pointerEventData, results); if (results.Count != 0) { return results[0].gameObject; } return null; }
第二種就簡單瞭
rect 為要判斷的那個UI的RectTransform
bool isUI = RectTransformUtility.RectangleContainsScreenPoint(rect, Input.mousePosition)
補充:Unity中判斷鼠標或者手指是否點擊在UI上(UGUI)
在Unity場景中,有時UI和遊戲角色都需要響應觸摸事件,如果同時響應可能就會出現點擊UI的時候影響到瞭遊戲角色。所以我們需要對所點擊到的東西做判斷,這裡使用UGUI系統自帶的方法和射線檢測的方式,判斷是否點擊到UI上:
第一種方法,直接在Update中判斷:
void Update() { //判斷是否點擊UI if (Input.GetMouseButtonDown(0) || (Input.touchCount > 0 && Input.GetTouch(0).phase == TouchPhase.Began)) { //移動端 if (Application.platform == RuntimePlatform.Android || Application.platform == RuntimePlatform.IPhonePlayer) { int fingerId = Input.GetTouch(0).fingerId; if (EventSystem.current.IsPointerOverGameObject(fingerId)) { Debug.Log("點擊到UI"); } } //其它平臺 else { if (EventSystem.current.IsPointerOverGameObject()) { Debug.Log("點擊到UI"); } } }
第二種方式:射線檢測
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.EventSystems; public class NewBehaviourScript : MonoBehaviour { // Update is called once per frame void Update() { //移動端 if (Application.platform == RuntimePlatform.Android || Application.platform == RuntimePlatform.IPhonePlayer) { if (Input.touchCount > 0 && Input.GetTouch(0).phase == TouchPhase.Began) { if (IsPointerOverGameObject(Input.GetTouch(0).position)) { Debug.Log("點擊到UI"); } } } //其它平臺 else { if(Input.GetMouseButtonDown(0)) { if (IsPointerOverGameObject(Input.mousePosition)) { Debug.Log("點擊到UI"); } } } } /// <summary> /// 檢測是否點擊UI /// </summary> /// <param name="mousePosition"></param> /// <returns></returns> private bool IsPointerOverGameObject(Vector2 mousePosition) { //創建一個點擊事件 PointerEventData eventData = new PointerEventData(EventSystem.current); eventData.position = mousePosition; List<RaycastResult> raycastResults = new List<RaycastResult>(); //向點擊位置發射一條射線,檢測是否點擊UI EventSystem.current.RaycastAll(eventData, raycastResults); if (raycastResults.Count > 0) { return true; } else { return false; } } }
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。如有錯誤或未考慮完全的地方,望不吝賜教。
推薦閱讀:
- None Found