需求
有时候我要判断鼠标是否指向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));
}