#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的层。
复制代码