#1、描述
此课程说明射线的使用,并且举例一个鼠标点击游戏对象移动的示例,注意,如果想要被射线响应到,必须给物体加上碰撞器,不然没有效果
#2、示例
public int speen; private Vector3 targer; private bool isOver = true; // Use this for initialization void Start () { } // Update is called once per frame void Update () { //当按下鼠标左键的时候 if (Input.GetMouseButtonDown(0)) { //根据屏幕坐标转换世界坐标,生成一条射线返回 Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); //创建射线于游戏对象交叉时生成的信息接受类 RaycastHit hit = new RaycastHit (); //如果射线于一个游戏对象碰撞交叉时,返回true为真,会把碰撞的信息out到hit对象中 if (Physics.Raycast (ray, out hit)) { //从信息类中判断游戏对象名字是否是地板 if (hit.collider.name.Equals ("Plane")) { targer = hit.point; //把坐标赋值给目标对象 targer.y = 0.5f; // 重新设置他的y坐标 isOver = false; // 设置是否结束为false,这样就会执行moveto方法了 } } } //始终执行移动方法,只有当isOver == true的时候执行 MoveTo (targer); } public void MoveTo(Vector3 vector3){ //如果没有结束 if (!isOver) { //画出一条Debug线,从自身延伸到目标的地方,连出一条线,这里说明一下,drawline只会绘画一次,速度很快,如果要一直显示,后面还有个duraline字段 Debug.DrawLine(transform.position,vector3,Color.blue); //用目标向量 - 当前向量 , 获取出两个位置的差异向量 Vector3 distance = vector3 - transform.position; //移动游戏对象到目标位置 //distance.normalized :确定方向 //speen : 速度 //Time.deltaTime : 确保一秒执行speen速度的距离 transform.Translate (distance.normalized * speen * Time.deltaTime); //计算两个点相差的距离,如果差别不大,就结束移动 if (Vector3.Distance (vector3, transform.position) <= 0.1f) { isOver = true; transform.position = vector3; } } }复制代码
#3 射线的技巧 在执行 Physics.Raycast方法的时候,有个参数是int layerMask,这个参数是用于过滤掉不处理的层级的,但是也有一些讲究,比如player层级,他要怎么表示这个层级呢,就比较用
1 << LayerMask.NameToLayer("player")复制代码
Raycast (ray : Ray, out hitInfo : RaycastHit, distance : float = Mathf.Infinity, layerMask : int = kDefaultRaycastLayers)其实很简单:1 << 10 打开第10的层。~(1 << 10) 打开除了第10之外的层。~(1 << 0) 打开所有的层。(1 << 10) | (1 << 8) 打开第10和第8的层。复制代码