欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

unity 如何判断鼠标是否在哪个UI上(两种方法)

程序员文章站 2022-03-27 11:32:32
第一种可以得到ui,再根据名字判断是不是自己自己要点击的ui其中参数canvas拖入此ui的canvas /// /// 获取鼠标停留处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;
        }
    }
}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持。如有错误或未考虑完全的地方,望不吝赐教。

相关标签: unity 鼠标 UI