国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

Unity 點擊屏幕與UGUI的區分

2019-11-09 18:15:24
字體:
來源:轉載
供稿:網友

UGUI - 判斷是否點擊在UI 上 Bug,IsPointerOverGameObject()在移動端檢測失敗

原文鏈接:這里寫鏈接內容

UGUI 提供了一個檢測是否點擊在UI上的方法 EventSystem.current.IsPointerOverGameObject(); 但是該方法在PC上檢測正常,結果拿到Android真機測試上,永遠檢測不到。

在網上找了一些大神的解決方案

using UnityEngine;using System.Collections;using System.Collections.Generic;using UnityEngine.UI;using UnityEngine.EventSystems;public class ClickIsOverUI { public static ClickIsOverUI Instance = new ClickIsOverUI(); public ClickIsOverUI() { } //方法一, 使用該方法的另一個重載方法,使用時給該方法傳遞一個整形參數 // 該參數即使觸摸手勢的 id // int id = Input.GetTouch(0).fingerId; public bool IsPointerOverUIObject(int fingerID) { return EventSystem.current.IsPointerOverGameObject(fingerID); } //方法二 通過UI事件發射射線 //是 2D UI 的位置,非 3D 位置 public bool IsPointerOverUIObject(Vector2 screenPosition) { //實例化點擊事件 PointerEventData eventDataCurrentPosition = new PointerEventData(EventSystem.current); //將點擊位置的屏幕坐標賦值給點擊事件 eventDataCurrentPosition.position = new Vector2(screenPosition.x, screenPosition.y); List<RaycastResult> results = new List<RaycastResult>(); //向點擊處發射射線 EventSystem.current.RaycastAll(eventDataCurrentPosition, results); return results.Count > 0; } //方法三 通過畫布上的 GraphicRaycaster 組件發射射線 public bool IsPointerOverUIObject(Canvas canvas, Vector2 screenPosition) { //實例化點擊事件 PointerEventData eventDataCurrentPosition = new PointerEventData(EventSystem.current); //將點擊位置的屏幕坐標賦值給點擊事件 eventDataCurrentPosition.position = screenPosition; //獲取畫布上的 GraphicRaycaster 組件 GraphicRaycaster uiRaycaster = canvas.gameObject.GetComponent<GraphicRaycaster>(); List<RaycastResult> results = new List<RaycastResult>(); // GraphicRaycaster 發射射線 uiRaycaster.Raycast(eventDataCurrentPosition, results); return results.Count > 0; }}

使用如下

using UnityEngine;using System.Collections;public class RayCastUI : MonoBehaviour { public Transform target; // Update is called once per frame void Update () {#if true //UNITY_ANDROID || UNITY_ipHONE if (Input.touchCount > 0) { //使用方法一:傳遞觸摸手勢 ID if (ClickIsOverUI.Instance.IsPointerOverUIObject(Input.GetTouch(0).fingerId)) { Debug.Log("方法一: 點擊在UI上"); if (target != null) { target.transform.rotation = Quaternion.Euler(new Vector3(Input.GetTouch(0).position.x, Input.GetTouch(0).position.y, 0)); } } //使用方法二:傳遞觸摸手勢坐標 if (ClickIsOverUI.Instance.IsPointerOverUIObject(Input.GetTouch(0).position)) { Debug.Log("方法二: 點擊在UI 上"); } //使用方法三:傳遞畫布組件,傳遞觸摸手勢坐標 if (ClickIsOverUI.Instance.IsPointerOverUIObject(GetComponent<Canvas>(), Input.GetTouch(0).position)) { Debug.Log("方法三: 點擊在UI 上"); } }#endif }}

經過測試上面三種方法均能成功


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 藁城市| 广州市| 绥滨县| 呼伦贝尔市| 扶风县| 安丘市| 龙游县| 来凤县| 辽阳县| 仪陇县| 安塞县| 固镇县| 凤冈县| 汾西县| 班玛县| 黑山县| 仙桃市| 兴海县| 台南县| 湟中县| 上思县| 云梦县| 太仓市| 永靖县| 西丰县| 酒泉市| 双辽市| 东安县| 班玛县| 基隆市| 博野县| 凤台县| 秦皇岛市| 宣恩县| 庆安县| 苏尼特右旗| 固始县| 呼伦贝尔市| 山阴县| 新建县| 云南省|