本來我是用?EventSystem.current.IsPointerOverGameObject()來檢測是否點擊在UI上的,但是發現,他對我的碰撞體也是返回ture,研究半天。。。。找不出問題,然后發現我的相機上掛載了PhysicsRaycaster,去掉之后就好了,至于為什么相機上掛載PhysicsRaycaster,好像是我的別的同事做的一個物體拖拽,用了?IDragHandler, IBeginDragHandler, IEndDragHandler,來做對3D物體的拖拽。。。我真的是無語。。。他的代碼是這樣的。。。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
using QFramework;public class ObjDrag : MonoBehaviour, IDragHandler, IBeginDragHandler, IEndDragHandler
{private Vector3 ObjVector3 = Vector3.zero;public string deskTag = "desk";private Collider collider;/// <summary>/// isDrag等于false無法交互/// </summary>public bool isDrag = false;void Start(){collider = GetComponent<Collider>();}public void OnBeginDrag(PointerEventData eventData){ObjVector3 = this.transform.position;if (isDrag&&Input.GetMouseButton(0)){StringEventSystem.Global.Send<string>("Begin", eventData.pointerDrag.name);Debug.Log(eventData.pointerDrag.name);}}public void OnEndDrag(PointerEventData eventData){if (isDrag){this.transform.position = ObjVector3;StringEventSystem.Global.Send<string>("EndDrag", eventData.pointerDrag.name);Debug.Log(eventData.pointerDrag.name);}}/// <summary>/// 物體可拖拽/// </summary>/// <param name="eventData"></param>public void OnDrag(PointerEventData eventData){if (isDrag && Input.GetMouseButton(0)){Vector3 screenpos = Camera.main.WorldToScreenPoint(transform.position);Vector3 mouseScreenPos = new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenpos.z);this.transform.position = Camera.main.ScreenToWorldPoint(mouseScreenPos);Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);var hits = Physics.RaycastAll(ray);foreach (var item in hits){if (item.collider != null && item.collider.tag == deskTag){var dis0 = Vector3.Distance(Camera.main.transform.position, item.point);var offset = collider.bounds.size.magnitude / 2;var dis1 = Vector3.Distance(Camera.main.transform.position, transform.position) + offset;if (dis1 > dis0){var precent = 1 - (offset / dis0);transform.position = Camera.main.transform.position + (item.point - Camera.main.transform.position) * precent;//transform.position = item.point;}//transform.position = item.point;break;}}}}}
然后必須在攝像機上掛載Unity UGUI的PhysicsRaycaster (物理射線檢測)
下面介紹一下:
PhysicsRaycaster
【Unity】 UGUI的PhysicsRaycaster (物理射線檢測)組件的介紹及使用-CSDN博客
IDragHandler, IBeginDragHandler, IEndDragHandler
【Unity】IBeginDragHandler、IDragHandler 和 IEndDragHandler 介紹-CSDN博客
問題就是他們都是用于UI 元素的,然后他用在了3D物體上,導致對我的3D物體起作用,如果一定要在相機上掛載PhysicsRaycaster,又要EventSystem.current.IsPointerOverGameObject只對你的UI 元素起作用,那么可以在這個組件上,用EventMask:指定哪些層的UI元素可以接收事件。比如你的模型是層級是
那么你就可以在EventMask上不勾選Model
?
這樣?EventSystem.current.IsPointerOverGameObject()就不會對你指定的模型碰撞體起作用了。。。