unity 一个物体同时添加单击和双击事件,怎么区分

unity 一个物体同时添加单击和双击事件,怎么区分,第1张

不需要做双击事件。全部都走单击事件。也不需要计数器。应该说不只是计数器。

用一个变量存放每次点击的事件。就是time.time那个。然后每次点击的时候判断当前事件跟存放的事件差值。比如小于0.2秒。就走双击事件,否则走单击事件。然后把当前时间存到变量。

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

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

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

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

bool isModelClick = false

private void OnMouseDown()

{

isModelClick = true

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

}

private void OnMouseUp()

{

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

if(isModelClick)

{

Debug.Log("鼠标抬起")

}

isModelClick = false

}

登录后复制

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

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

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

2、使用unity提供接口OnMouseUpAsButton

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

private void OnMouseUpAsButton()

{

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

}

登录后复制

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

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

3、使用射线检测

private GameObject IsClick(Vector2 clickPos)

{

Ray ray = Camera.main.ScreenPointToRay(clickPos)

RaycastHit rayHit

if (Physics.Raycast(ray, out rayHit, rayMaxDis))

{

return rayHit.collider.gameObject

}

return null

}

登录后复制

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

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

4、使用Event Trigger组件

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

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

免费下载地址:请到【https://gitee.com/jacobkay/unity-model-click】中下载

这款模型点击工具,采用的也是射线检测方式,但内部做了一些判断

1、鼠标抬起时判断是否有点击到模型对象

2、鼠标抬起时会判断当前模型对象是否和落下时为同一个对象

3、鼠标按下和抬起之间的时间间隔少于220毫秒

4、鼠标落下和抬起的距离不大于10像素

使用方式

使用方法也非常简单

1、下载工具,拖入到工程当中

2、引入命名空间 ZTools

3、ModelClickTool为单例类,直接订阅到其中的广播事件(ModelClick),即可获得当前鼠标点击到的模型对象,判断如果跟当前模型为同一个模型,则实现一次模型点击

4、ModelClick(广播事件):可监听到射线监测到的第一个model对象,并返回GameObject

5、RayMaxDistance(属性):设置当前射线监测的最长有效距离,默认距离是3000米


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

原文地址: http://outofmemory.cn/bake/11802856.html

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

发表评论

登录后才能评论

评论列表(0条)

保存