1.创建一条射线,从自己出发,发射向目标
Ray ray = new Ray(transform.position, target.position - transform.position);
//第一个参数是射线的起点ray.origin,第二个参数是射线的方向 ray.direction
2.绘制出射线,方便调试(在Scene视角能看见,Game视角看不见)
Debug.DrawRay(ray.origin, ray.direction * 100, Color.red);
//第一个参数是射线起点,第二个参数是射线方向*长度,第三个参数是射线颜色,[第四个参数是float型,表示显示时长]
3.射线的碰撞检测
1 RaycastHit hit; 2 if(Physics.Raycast(ray,out hit,10000,1<<LayerMask.NameToLayer("Ground"))) //写出LayerMask参数表示只检测这一层的碰撞,其他层忽略 3 //10000是射线的长度(如果不够长可能方向对了,但是长度不够碰撞不到,也可用Mathf.Infinity表示无限长) 4 //RaycastHit hit保存了碰撞信息 5 { 6 if (hit.transform.CompareTag("Ground")) //判断碰撞物是不是地面 7 { 8 Debug.log(hit.point); //输出碰撞点的坐标 9 } 10 }
4.案例1 用射线写一个人物移动脚本,鼠标点击哪,人物就往哪移动
1 if (Input.GetMouseButtonDown(0)) 2 { //判断点击的是否是地面,如果是得到点的位置 3 ray = Camera.main.ScreenPointToRay(Input.mousePosition); 4 RaycastHit hit; 5 if(Physics.Raycast(ray,out hit,10000,LayerMask.NameToLayer("Ground"))) 6 { 7 if (hit.transform.CompareTag("Ground")) 8 { 9 isGround = true; 10 targetPos = hit.point; 11 } 12 } 13 //如果点击的是地面,就移动。如果已经到点了(距离小于一个很小的数),就不动. 14 if (isGround && Vector3.Distance(transform.position,targetPos)>0.5f ) 15 { 16 transform.LookAt(new Vector3(targetPos.x, transform.position.y, targetPos.z)); 17 transform.Translate(Vector3.forward * Time.deltaTime * speed); 18 } 19 }
案例2 在案例1的基础上,让人物可以上坡下坡
1 public class Move : MonoBehaviour 2 { 3 public float speed; 4 Vector3 targetPos; 5 Ray ray; 6 bool isGround; 7 8 void Update() 9 { 10 if (Input.GetMouseButtonDown(0)) 11 { //判断点击的是否是地面,如果是得到点的位置 12 ray = Camera.main.ScreenPointToRay(Input.mousePosition); 13 RaycastHit hit; 14 if (Physics.Raycast(ray, out hit, 10000, 1<<LayerMask.NameToLayer("Ground"))) //1<<是因为在Inspector->Layer里给地面添加了Ground层 15 { 16 isGround = true; 17 targetPos = hit.point; 18 } 19 //如果点击的是地面,就移动。如果已经到点了(距离小于一个很小的数判断),就不动. 20 if (isGround && Vector3.Distance(transform.position, targetPos) > 0.5f) 21 { 22 //朝向 23 transform.LookAt(new Vector3(targetPos.x,transform.position.y,targetPos.z)); 24 //移动 25 transform.Translate(Vector3.forward * Time.deltaTime * speed); 26 //再添加一条自玩家向下的射线来获得玩家脚下坐标,修正y值 27 //在Inspector里将玩家transform.position设在了脚下,这里加个偏移量Vector3.up,因为从脚下射出检测不到碰撞点 28 Ray rayFromPlayer = new Ray(transform.position + Vector3.up, Vector3.down); 29 RaycastHit hitPlayer; 30 if (Physics.Raycast(rayFromPlayer, out hitPlayer, 10000,1<< LayerMask.NameToLayer("Ground"))) 31 transform.position = new Vector3(transform.position.x, hitPlayer.point.y, transform.position.z); 32 } 33 if (Vector3.Distance(transform.position, targetPos) < 0.5f) 34 isGround = false; 35 } 36 } 37 }