Unity实现模型点击

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

首先在要发生点击事件的模型上绑定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米

如果有对组件的优化建议或者使用上有任何问题,也烦请大佬们下载工具,打开其中的help文件,感恩的♥♥♥

猜你喜欢

转载自blog.csdn.net/qq_33161296/article/details/127094724