Unity中UGUI鼠标穿透UI问题的解决方法

 不过在使用时需要先获取两个红色显示的变量,graphicRaycastereventSystem

这两个变量分别对应的是Canvas中的GraphicRaycaster组件和创建UI时自动生成的“EventSystem”中的EventSystem组件。

引用

using UnityEngine;
using System.Collections.Generic;
using UnityEngine.EventSystems;
using UnityEngine.UI;

 

  private GraphicRaycaster graphicRaycaster;
    private EventSystem eventSystem;
    void Start()
    {
        graphicRaycaster = GameObject.Find("Canvas").GetComponent<GraphicRaycaster>();
        eventSystem = GameObject.Find("EventSystem").GetComponent<EventSystem>();
    }

    // Update is called once per frame
    void Update()
    {
        if (CheckGuiRaycastObjects()) return;//防止射线穿透UI界面
        Debug.Log(EventSystem.current.gameObject.name);
        if (Input.GetMouseButtonDown(0))
        {
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            RaycastHit hit;

            if (Physics.Raycast(ray, out hit))
            {
                //获取碰撞点的位置
                if (hit.collider.name == "Terrain")
                {
                    Debug.LogError(hit.collider.name);
                }
            }
        }
    }

    bool CheckGuiRaycastObjects()
    {
        PointerEventData eventData = new PointerEventData(eventSystem);
        eventData.pressPosition = Input.mousePosition;
        eventData.position = Input.mousePosition;

        List<RaycastResult> list = new List<RaycastResult>();
        graphicRaycaster.GetComponent<GraphicRaycaster>().Raycast(eventData, list);
        Debug.Log(list.Count);
        return list.Count > 0;
    }

 

 

第二种方式直接添加判断条件

  EventSystem.current.IsPointerOverGameObject() //返回一个布尔值,进入了UI上就返回true。

posted @ 2017-11-27 10:48  U3DEngineer  阅读(2506)  评论(0编辑  收藏  举报