unity UGUI如何获取鼠标指针所在位置的UI对象

unity UGUI如何获取鼠标指针所在位置的UI对象,第1张

public class GetMousePos : MonoBehaviour

{

public Canvas canvas;//画布

private RectTransform rectTransform;//坐标

void Start()

{

canvas = GameObjectFind("Canvas")GetComponent<Canvas>();

rectTransform = canvastransform as RectTransform; //也可以写成thisGetComponent<RectTransform>(),但是不建议;

}

void Update()

{

if (InputGetMouseButtonDown(0))

{

Vector2 pos;

if (RectTransformUtilityScreenPointToLocalPointInRectangle(rectTransform, InputmousePosition, canvasworldCamera, out pos))

{

rectTransformanchoredPosition = pos;

DebugLog(pos);

}

}

}

}

新建场景,在场景中拖一个画布(Canvas),然后随便找个地方挂上这个脚本就好了。

1

RectTransformUtility:矩阵变换工具

RectTransformUtilityScreenPointToLocalPointInRectangle 从屏幕点到矩形内的本地点

Parameters 参数

rect The RectTransform to find a point inside

cam The camera associated with the screen space position

screenPoint Screen space position

localPoint Point in local space of the rect transform

Returns

bool Returns true if the plane of the RectTransform is hit, regardless of whether the point is inside the rectangle

Description 描述

Transform a screen space point to a position in the local space of a RectTransform that is on the plane of its rectangle

屏幕空间点转换为矩形变换内部的本地位置,该点在它的矩形平面上。

The cam parameter should be the camera associated with the screen point For a RectTransform in a Canvas set to Screen Space - Overlay mode, the cam parameter should be null

该cam 参数应该是该相机关联的屏幕点。对于在画布上的矩形变换设置该屏幕空间为-Overlay模式,cam 参数应该为空。

When ScreenPointToLocalPointInRectangle is used from within an event handler that provides a PointerEventData object, the correct camera can be obtained by using PointerEventDataenterEventData (for hover functionality) or PointerEventDatapressEventCamera (for click functionality) This will automatically use the correct camera (or null) for the given event

当ScreenPointToLocalPointInRectangle从事件处理器内部提供一个PointerEventData对象被使用时,相机可以通过使用PointerEventDataenterEventData(为悬停功能)或者 PointerEventDatapressEventCamera(为单击功能)被获取。该函数将会自动对指定事件使用正确的相机(或者空)。

RectTransform矩形变换

RectTransformanchoredPosition 锚点位置

The position of the pivot of this RectTransform relative to the anchor reference point

该矩形变换相对于锚点参考点的中心点位置。

The anchor reference point is where the anchors are If the anchors are not together, the four anchor positions are interpolated according to the pivot placement

锚点参考点是锚点的位置。如果锚点不在一起,四个锚点的位置是根据布置的中心点的位置插值替换的。

如下:

public texture2d mousetexture;//更换鼠标的样式。

cursorsetcursor (thismousetexture, vector2zero, cursormodeauto);//恢复回鼠标的样式。

cursorsetcursor (null, vector2zero, cursormodeauto)。

Unity3D是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

Unity类似于Director,Blender game engine, Virtools 或 Torque Game Builder等利用交互的图型化开发环境为首要方式的软件。

其编辑器运行在Windows 和Mac OS X下,可发布游戏至Windows、Mac、Wii、iPhone、WebGL(需要HTML5)、Windows phone 8和Android平台。也可以利用Unity web player插件发布网页游戏,支持Mac和Windows的网页浏览。它的网页播放器也被Mac 所支持。

void Update () {

if(InputGetMouseButtonDown(0))

{

RayControl();

}

if(flagMove)

{

if(Vector3Distance(transformposition,mousePos)>1)

{

transformTranslate(transformworldToLocalMatrix transformforward TimedeltaTime5);//transformforward是世界坐标,通过transformworldToLocalMatrix转换矩阵转到本地坐标然后在本地坐标运动,没有必要必须在本地坐标系运动 但是必须注意要统一起来。

}

else

{

flagMove=false;

}

}

}

void RayControl()

{

Ray ray=CameramainScreenPointToRay(InputmousePosition);//向屏幕发射一条射线

if(PhysicsRaycast(ray,out hit,200))射线长度为200 和地面的碰撞盒做检测

{

GameObject targetPos=GameObjectCreatePrimitive(PrimitiveTypeSphere);//实例化一个Sphere

targetPostransformlocalScale=new Vector3(05f,05f,05f);

mousePos=hitpoint;//获取碰撞点坐标

mousePosy=transformpositiony;

targetPostransformposition=mousePos;//Sphere放到鼠标点击的地方

targetDir=mousePos-transformposition;//计算出朝向

Vector3 tempDir=Vector3Cross(transformforward,targetDirnormalized);//用叉乘判断两个向量是否同方向

float dotValue=Vector3Dot(transformforward,targetDirnormalized);//点乘计算两个向量的夹角,及角色和目标点的夹角

float angle=MathfAcos(dotValue)MathfRad2Deg;if(tempDiry<0)//这块 说明两个向量方向相反,这个判断用来确定假如两个之间夹角30度 到底是顺时 还是逆时针旋转。

{

angle=angle(-1);

}

print(tempDiry);

print("2:"+angle);

transformRotateAround(transformposition,Vector3up,angle);

flagMove=true;

}

}

void OnMouseDown(){

Destroy (objgameObject );

}

可以尝试看看这个鼠标点击事件,放在脚本与update同级就可以了。

新手,如果见解不当,请指正,多谢了。

目前实现模型点击事件有四种方式

首先在要发生点击事件的模型上绑定collider

1、使用unity提供接口OnMouseUp或者OnMouseDown

如果使用此方法,建议添加一个开关,判断鼠标按下和抬起是否都在同一个对象上

bool isModelClick = false;

private void OnMouseDown()

{

isModelClick = true;

DebugLog("鼠标按下,场景内如果有其他需要点击的事件,容易误触发");

}

private void OnMouseUp()

{

DebugLog("鼠标抬起,但鼠标的按下动作不一定发生在本对象上");

if(isModelClick)

{

DebugLog("鼠标抬起");

}

isModelClick = false;

}

登录后复制

这里的检测是判断鼠标按下或者鼠标抬起时是否在本模型对象上,如果是则触发

存在问题:容易误触发,如果场景存在像漫游这种需要在场景中点击的功能,那鼠标的按下和抬起只要发生在了模型对象上,就会触发,这不是想要的点击效果

缺点:脚本必须挂载在模型身上

2、使用unity提供接口OnMouseUpAsButton

本方法要优于第一种方法,不需要自己判断按下和抬起是否都在同一个对象上

private void OnMouseUpAsButton()

{

DebugLog("鼠标按下和抬起发生在同一个模型对象上");

}

登录后复制

存在问题:如果鼠标按下后,鼠标移动,在不同的位置鼠标抬起,也会触发点击事件,同样如果场景中存在需要点击的功能(几率要小于第一种),那也会有误触发的后果。

缺点:脚本必须挂载在模型身上

3、使用射线检测

private GameObject IsClick(Vector2 clickPos)

{

Ray ray = CameramainScreenPointToRay(clickPos);

RaycastHit rayHit;

if (PhysicsRaycast(ray, out rayHit, rayMaxDis))

{

return rayHitcollidergameObject;

}

return null;

}

登录后复制

一方法和二方法底层实现就是射线检测,自己写射线检测的优点是,可写在一个脚本中,其他需要获取点击判断的方法可直接订阅获取检测到的对象,判断获取的对象是否为要点击的对象即可

当然存在的问题跟一二方法是一样的

4、使用Event Trigger组件

此方法舍弃了unity自带的模型检测机制,使用了ui检测机制,较麻烦,不推荐使用,原理也是通过射线检测,发射射线从camera改为了Physics Raycaster,接收射线从collider变为了Event Trigger

通过以上描述可发现,现在所有的模型点击事件都是存在一定的问题,这里博主推荐一个组件,ZTools中的ModelClickTool

免费下载地址:请到

以上就是关于unity UGUI如何获取鼠标指针所在位置的UI对象全部的内容,包括:unity UGUI如何获取鼠标指针所在位置的UI对象、Unity3d如何做到用鼠标点击一个物品可以在屏幕上出来设定好的文字、在unity3d中如何制作鼠标点击一个物体,然后传送到我想要的坐标上,也就是点击按钮,传送到目的地。等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9753970.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-01
下一篇 2023-05-01

发表评论

登录后才能评论

评论列表(0条)

保存