Unity 如何获取鼠标停留位置下的物体

根据UGUI的射线检测机制获取当前鼠标下的UI:

/// <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;
    }

其中,results为鼠标下UI的列表。

不仅适用于UGUI,可以在摄像机上添加PhysicsRaycaster组件,传参为摄像机,这样就可以获取3D物体。

/// <summary>
    /// 获取鼠标停留处物体
    /// </summary>
    /// <param name="raycaster"></param>
    /// <returns></returns>
    public GameObject GetOverGameObject(GameObject raycaster)
    {
        PointerEventData pointerEventData = new PointerEventData(EventSystem.current);
        pointerEventData.position = Input.mousePosition;
        PhysicsRaycaster pr = raycaster.GetComponent<PhysicsRaycaster>();
        List<RaycastResult> results = new List<RaycastResult>();
        pr.Raycast(pointerEventData, results);
        if (results.Count != 0)
        {
            return results[0].gameObject;
        }
        return null;
    }

刚遇到一个问题,我的UI点击包括3D物体点击都是用的EventSystem,也就是上面的方法,这时用

UnityEngine.EventSystems.EventSystem.current.IsPointerOverGameObject()这个方法去判断鼠标是否在UI上,就会出现鼠标在3D物体上也会拿到返回值,(没有去研究传参index的用法),直接选择了上面获取UI的获取方法。

脚本:

/************************************************************
* 版本声明:v1.0.0
* 类 名 称:MouseOverController.cs
* 创建日期:2019/8/10 16:10:44
* 作者名称:末零
* 功能描述:获取鼠标停留处的物体
************************************************************/
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
namespace LastZero.Utility
{
    public class MouseOverController
    {
        /// <summary>
        /// 获取鼠标停留处UI
        /// </summary>
        /// <param name="canvas"></param>
        /// <returns></returns>
        public static 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;
        }
        /// <summary>
        /// 获取鼠标停留处UI
        /// </summary>
        /// <param name="canvas"></param>
        /// <returns></returns>
        public static GameObject GetOverGameObject(GameObject camera)
        {
            if (camera.GetComponent<PhysicsRaycaster>() == null)
                camera.AddComponent<PhysicsRaycaster>();
            PointerEventData pointerEventData = new PointerEventData(EventSystem.current);
            pointerEventData.position = Input.mousePosition;
            PhysicsRaycaster gr = camera.GetComponent<PhysicsRaycaster>();
            List<RaycastResult> results = new List<RaycastResult>();
            gr.Raycast(pointerEventData, results);
            if (results.Count != 0)
            {
                return results[0].gameObject;
            }
            return null;
        }
    }
}

补充:unity中鼠标经过一个物体时出现提示

首先被检测的物体要有collider

using UnityEngine;
using System.Collections;
public class Cube : MonoBehaviour {
//    public Transform cube;
    bool isShowTip;
//    // Use this for initialization
    void Start () {
        isShowTip=false;
    }
    void OnMouseEnter () {
        isShowTip=true;
        //Debug.Log (cube.name);//可以得到物体的名字
    }
    void OnMouseExit () {
        isShowTip=false;
    }
    void OnGUI () {
        if (isShowTip){
            GUI.Label(new Rect(Input.mousePosition.x,Screen.height-Input.mousePosition.y,100,40),"afdasdfasdf");
         }
    }
}

补充:Unity中UGUI中获取鼠标点击位置以及UI物体的屏幕坐标

鼠标点击位置:

直接访问Input.mousePosition属性,返回一个三维屏幕坐标,即鼠标的坐标。

UI物体的屏幕坐标:

RectTransformUtility.WordToScreenPoint(Camera.main, rectTransform.position),返回的是二维屏幕坐标。

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

(0)

相关推荐

  • Unity3D启动外部程序并传递参数的实现

    之前开发项目,一直都使用的是外壳程序加子程序的模式,通过外壳程序去启动子程序,外壳程序和子程序之间的通信,是使用配置文件完成的. 我总觉得这样通信很麻烦,因为外壳程序需要对配置文件进行更改和写入,然后子程序又要读取信息.而且整合的时候,会导致有很多配置文件,而且需要对路径做很多处理和限制. 我发现Process.Start()函数中,是可以传递参数的. 也就是说,我们是可以在使用Process.Start()函数启动外部程序时,传递参数的进行通信的. 具体操作如下: public void St

  • Unity解析gif动态图操作

    工作需求,要播放一张gif图片,又不想转成视频播放,就开始研究怎样解析gif,在网上也看了不少教程,最后根据自己需求写了个脚本. 首先,Unity是不支持gif的(至少我没找到方法),而又要在NGUI中显示gif图片.所以就想到了将gif解析成序列帧再去循环播放. 有人说可以找软件解析,然后导入Unity做动画,最终我没有采用,自己再Unity中以代码解析,然后播放的. 代码如下 (在Awake中解析的,因为要在其他脚本调用,实时解析的话,到时候会花费一会时间): using System.Co

  • Unity之绕轴进行旋转的操作

    先上一张效果图 using UnityEngine; using System.Collections; public class TestRotateRound : MonoBehaviour { public GameObject Sphere; private float curtTime = 0.0f; void Update() { //使用C#封装好的代码RotateAround gameObject.transform.RotateAround(Sphere.transform.p

  • unity avprovideo插件的使用详解

    1.新建一个MediaPlayer组件 2.在canvas下新建一个AVProVideo组件 并将上一步新建的MediaPlayer组件赋值到avprovideo组件上的mediaplayer上 3.将需要播放的视频放在StreamingAssets文件夹下 接下来就是用代码调用了 1._mediaPlayer.OpenVideoFromFile(MediaPlayer.FileLocation.RelativeToStreamingAssetsFolder, 视频路径, 是否自动播放);//加

  • unity 如何获取Text组件里text内容的长度

    我就废话不多说了,大家还是直接看代码吧~ /// <summary> /// 计算字符串在指定text控件中的长度 /// </summary> /// <param name="message"></param> /// <returns></returns> int CalculateLengthOfText(string message,Text tex) { int totalLength = 0; Fon

  • unity 如何获取button文本的内容

    如下就可以获取button中的文本内容 using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using System; public class ButtonContent : MonoBehaviour{ public Button btn; void Start(){ btn = GameObject.Find("填写button名").getComponent<Button&g

  • unity 如何使用文件流读取streamingassets下的资源

    目的:读取streamingassets下的文件中指定的一段字节 已知:文件中的起始位置,和需要读取的长度 1.android下读取 1.1 不能直接使用C#的FileStream,读取失败 var buffer = new byte[size]; FileStream stream = File.OpenRead(path); stream.Read(buffer , pos, size); 报错: IsolatedStorageException: Could not find a part

  • unity里获取text中文字宽度并截断省略的操作

    前言 在unity的ugui中Text控件,有时我们会有各种各样的需求,比如类似html中css的text-overflow属性,希望一段文字如果不够长就全显示,如果特别长就截断并且后面加上例如-这种后缀. 好吧这样的需求在ugui里貌似没有现成的方法,如果有的话麻烦指点一下~ 实现 大概的思路就是 - 首先要能判断什么时候overflow - 并且支持加上后缀 那么text控件本来是支持overflow然后直接截断的,但是比较暴力,直接砍断,不能加后缀,并不满足我们的需求. 然后如果简单的通过

  • unity 文件流读取图片与www读取图片的区别介绍

    IO流代码: void LoadByIO() { float time = Time.time; FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read); fs.Seek(0, SeekOrigin.Begin); byte[] bytes = new byte[fs.Length]; fs.Read(bytes, 0, (int)fs.Length); fs.Close(); fs.Dispose(); fs =

  • Unity 如何获取鼠标停留位置下的物体

    根据UGUI的射线检测机制获取当前鼠标下的UI: /// <summary> /// 获取鼠标停留处UI /// </summary> /// <param name="canvas"></param> /// <returns></returns> public GameObject GetOverUI(GameObject canvas) { PointerEventData pointerEventData

  • python 调用pyautogui 实时获取鼠标的位置、移动鼠标的方法

    PyAutoGUI是一个纯Python的GUI自动化工具,其目的是可以用程序自动控制鼠标和键盘操作,利用它可以实现自动化任务 本章介绍了许多不同函数,下面是快速的汇总参考: moveTo(x,y)将鼠标移动到指定的 x.y 坐标. moveRel (xOffset,yOffset)相对于当前位置移动鼠标. dragTo(x,y)按下左键移动鼠标. dragRel (xOffset,yOffset)按下左键,相对于当前位置移动鼠标. click(x,y,button)模拟点击(默认是左键). ri

  • JS获取鼠标坐标位置实例分析

    本文实例分析了JS获取鼠标坐标位置的方法.分享给大家供大家参考,具体如下: 取鼠标坐标位置有这些:鼠标在视口的坐标位置(clientX,clientY),鼠标在页面的坐标位置(pageX,pageY),鼠标在屏幕的坐标位置(screenX,screenY),其中鼠标在视口的坐标位置(clientX,clientY),以及鼠标在屏幕的坐标位置(screenX,screenY)在所有的浏览器中都支持,但是鼠标在页面的坐标位置(pageX,pageY)在IE8及更早版本不支持,但是没有关系,可以通过s

  • JS获取鼠标相对位置的方法

    本文实例讲述了JS获取鼠标相对位置的方法.分享给大家供大家参考,具体如下: <!DOCTYPE HTML> <html lang="en-US"> <head> <meta charset="UTF-8"/> <title>位置</title> <script language="javascript" type="text/javascript"&

  • 用Python写飞机大战游戏之pygame入门(4):获取鼠标的位置及运动

    目标是拷贝微信的飞机大战,当然拷贝完以后大家就具备自己添加不同内容的能力了. 首先是要拿到一些图片素材,熟悉使用图像处理软件和绘画的人可以自己制作,并没有这项技能的同学只能和我一样从网上下载相应的素材了. 网上可以找到相应的这样的图片,注意,所有的元件图片要是png类型的图片,那样可以有透明的背景,否则会有白色的边框露出来. 找到素材以后我们就要开始搭建我们的飞机大战了. 微信上的飞机大战是由手指控制的,在电脑上,我们就先用鼠标代替了. 按照之前我们在天空上移动云的那个程序,我们可以知道该怎么做

  • 如何利用Python获取鼠标的实时位置

    目录 安装 pyautogui鼠标操作样例 Python获取鼠标实时位置具体实现 结果展示 总结 使用Python的第三方库pyautogui,PyAutoGUI是一个纯Python的GUI自动化工具,其目的是可以用程序自动控制鼠标和键盘操作,多平台支持(Windows,OS X,Linux). 安装 pip install pyautogui pyautogui鼠标操作样例 import pyautogui # 获取当前屏幕分辨率 screenWidth, screenHeight = pya

  • 多浏览器兼容的获取元素和鼠标的位置的js代码

    复制代码 代码如下: //获取元素的位置 function getLeft(obj) { if (obj == null) return null; var mendingObj = obj; var mendingLeft = mendingObj.offsetLeft; while (mendingObj != null && mendingObj.offsetParent != null && mendingObj.offsetParent.tagName != &q

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

    第一种 可以得到UI,再根据名字判断是不是自己自己要点击的UI 其中参数canvas拖入此UI的canvas /// <summary> /// 获取鼠标停留处UI /// </summary> /// <param name="canvas"></param> /// <returns></returns> public GameObject GetOverUI(GameObject canvas) { Poin

  • 根据鼠标的位置动态的控制层的位置

    复制代码 代码如下: <script> var index=0; //鼠标第一次点击时候显示,鼠标再次点击将层不在显示 /** * 鼠标点击事件 *bizData:传递的参数 */ function search(bizData) { if(index==0) { if(bizData==null) //当参数为空的时候该层内容清空,不让其显示null { $("bizDiv").innerText = ""; $("bizDiv")

  • Javascript在IE或Firefox下获取鼠标位置的代码

    第一段代码是利用全局变量来获取实时鼠标的位置. 复制代码 代码如下: var xPos; var yPos; window.document.onmousemove(function(evt){ evt=evt || window.event; if(evt.pageX){ xPos=evt.pageX; yPos=evt.pageY; } else { xPos=evt.clientX+document.body.scrollLeft-document.body.clientLeft; yPo

随机推荐