zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    Beta阶段DAY1
    Beta阶段DAY2
    Beta阶段冲刺前准备
    Beta阶段Scrum 冲刺博客合集
    alpha阶段项目复审
    网络15软工个人作业5——软件工程总结
    软工网络15个人作业4——alpha阶段个人总结
    软件工程网络15个人作业3 (201521123051 谢庆圆)
    软件工程网络15专业结对编程
    软工网络15个人阅读作业2 (201521123051 谢庆圆)
  • 原文地址:https://www.cnblogs.com/tomatokely/p/15334095.html
Copyright © 2011-2022 走看看