[Unity3D]鼠标检测Sprite物体

需求

有时候我要判断鼠标是否指向Sprite,以达到触发某些事件的目的

给物体添加Colider

如果直接用射线检测的话是检测不到的,需要给Sprite加上BoxColider才行,注意不是加2D的Colider,不然还是检测不到
这里写图片描述

编写代码

获得当前鼠标位置

判断鼠标碰撞到哪些游戏物体,需要先拥有当前鼠标的坐标,可以用

Input.mousePosition

这个方法来传递鼠标当前的坐标

世界坐标转换成射线

现在我们有了坐标了,接着需要用到Unity的射线检测,这里Unity给了我们一个方法 ScreenPointToRay
基本语法是:

public Ray ScreenPointToRay(Vector3 position);

简单来说 它会从从摄像机发射一条射线到屏幕,并返回这条射线,参数是Vector3 向量,也就是坐标,比如说鼠标在屏幕中的位置,且由主摄像机发射射线,返回的是一个射线类型 Ray ,我们可以用一个Ray类型的变量来接收这条射线。
具体用法:

Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);

处理射线碰撞到的物体

由于在屏幕中,Sprite可能会堆叠在一起,而且鼠标可能会同时碰到多个Sprite,这时我们就需要用一个RaycastHit类型的数组来存放射线碰撞到的所有物体
具体用法:

     Ray ray = Camera.main.ScreenPointToRay(worldPos);
     //Raycastall存放碰撞到的所有物体
     RaycastHit[] hits = Physics.RaycastAll(ray);

Physics.RaycastAll方法的作用是投射一条光线并返回所有碰撞,也就是投射光线并返回一个RaycastHit[]结构体。

编写事件

我们现在有了鼠标碰撞到的所有物体,接下来就可以进行操作了,这里我用for循环来输出所有碰撞体的名字

 for (int i = 0; i < hits.Length; i++)
 {
            Debug.Log((hits[i].collider.name));
 }

完整代码

传入的worldPos是上述中的Input.mousePosition,可以根据实际情况在不同的位置调用这个函数,我的做法是在鼠标抬起的时候判断,有关鼠标抬起的文章:https://blog.csdn.net/hhmy77/article/details/81430052

 private void onRayCast(Vector3 worldPos)
    {
        //Debug.Log("worldPos:"+worldPos);
        Ray ray = Camera.main.ScreenPointToRay(worldPos);
        //Raycastall存放碰撞到的所有物体
        RaycastHit[] hits = Physics.RaycastAll(ray);

        //Debug.Log("hits.Length:"+hits.Length);
        for (int i = 0; i < hits.Length; i++)
        {

            Debug.Log((hits[i].collider.name));
        }

猜你喜欢

转载自blog.csdn.net/hhmy77/article/details/81451182
今日推荐