用一个变量存放每次点击的事件。就是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米
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)