Unity之射线检测

不知道大家有没有玩过红色警戒 —— 一款即时战略游戏,和罪恶都市一样小编小学的时候就开始玩了,这款游戏控制单位角色移动是通过鼠标的点击来实现。

同样的操作方法还有英雄联盟等很多游戏,那本篇文章小编就通过简单小实例来讲解这种操作在Unity中是如何实现的。

Unity之射线检测_第1张图片

小编先展示一下实例的演示动图:红色球体表示我们控制的角色,鼠标左键点击小球就会到相应的坐标位置并打印坐标。

一、原理

先来讲一下这种操作方式的原理:它其实是从摄像机发射出的一条射线。当鼠标点击的时候,射线就从摄像机发射打到你点击的位置,通过检测射线获取到位置坐标,角色就向这个坐标移动。

Unity之射线检测_第2张图片

 注:射线发射后碰到的游戏物体必须要有碰撞组件才会被检测到,演示动图中点击平面区域以外的地方是没有任何反应的。

二、实现实例 

创建射线的两种方法:该实例是通过摄像机创建射线

//创建射线的两种方法:
//方式一 通过向量创建
Ray ray1 = new Ray(Vector3.zero , Vector3.up);
//方式二 通过摄像机创建
Ray ray2 = Camera.main.ScreenPointToRay(Input.mousePosition);

新建一个平面一个球体,球体挂载上红色的材质方便我们观察,新建RayTest脚本用来检测射线并挂载到球体上。

public class RayTest : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {

    }

    // Update is called once per frame
    void Update()
    {
        //当点击鼠标左键时执行
        if(Input.GetMouseButtonDown(0))
        {
            //按下鼠标左键发射射线  射线发射后碰到的游戏物体必须要有碰撞组件才会被检测到
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            //声明一个碰撞信息类
            RaycastHit hit;
            //碰撞检测用布尔类型表示
            bool res = Physics.Raycast(ray,out hit);
            //如果碰撞到的情况下,hit就有内容了
            if (res == true)
            {
                //打印出碰撞信息的坐标
                Debug.Log(hit.point);
                //把坐标赋值给球体,球体位置就会直接闪现到射线检测点
                transform.position = hit.point;
            }
            
            //多检测
            //RaycastHit[] hits = Physics.RaycastAll(ray, 100, 1 << 10);
        }
    }
}

点击运行就是动图的演示效果了,很简单的一个实例,拜拜┏(^0^)┛

你可能感兴趣的:(unity,游戏引擎)