Unity:Ray 射线

1.创建一条射线,从自己出发,发射向目标

Ray ray = new Ray(transform.position, target.position - transform.position);

//第一个参数是射线的起点ray.origin,第二个参数是射线的方向 ray.direction

2.绘制出射线,方便调试(在Scene视角能看见,Game视角看不见)

Debug.DrawRay(ray.origin, ray.direction * 100Color.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         }        
View Code

 案例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 }
Move
原文地址:https://www.cnblogs.com/tomatokely/p/15334095.html