Unity(射线)

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

射线碰撞检测+LayerMask的使用

转载于:https://juejin.im/post/5b3ac96d6fb9a025051946d0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值