关于raycast与screenpointoray的一些个人见解

Unity中的Ray射线有很强大的功能,可以实现例如点击拾取物体,或者用于判断镜头与主角直接是否存在建筑遮挡(使其半透明化)

一般这种情况可以使用ScreenPointToRay函数,该类为Camera类方法

1、function ScreenPointToRay (position : Vector3) : Ray

  参数只有一个vector3值,返回值为Ray结构体,意味从相机出发,到你鼠标的位置的那个方向做一条射线

  2、RaycastHit 一个结构体,成员变量有诸如collider,transform,rigidbody等等的信息,需搭配ray与raycast配合使用

  3、Physics.Raycast 返回值为bool,参数有(ray,out raycasthit)等。返回值为真,意思就是ray这条射线,碰撞到了一个东西,那个东西的信息在raycasthit里面

  注意:该函数返回碰撞到的第一个游戏物体

 4、Ray 结构体,成员变量有vector3 orgin射线初始点vector3 direction向量,表示射线的方向

例如:实现简单的鼠标拾取:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Test_ray_scripts : MonoBehaviour 

	public Camera cam;
	void Update ()
	{
		if(Input.GetMouseButtonDown(0))
		{
			RaycastHit hit;//变量RaycastHit储存被射线射中的第一个GameObject信息
			//从摄像机开始到鼠标方向的点射出一条射线,碰撞到的东西信息在hit里,这条射线长度为10 
			bool isHit = Physics.Raycast (cam.ScreenPointToRay(Input.mousePosition),out hit,10f);
			//变量ray暂时保存上面那条射线 
			Ray ray = cam.ScreenPointToRay (Input.mousePosition);
   			//debug在场景视图中显示刚刚那条射线,每点击一次鼠标显示一条,颜色黑色,保存时间为5秒 
			Debug.DrawRay (ray.origin,ray.direction,Color.black,5f);
			if (isHit == true) 
			{
				//设置一个cube并将其的tag设置为1 
				if (hit.transform.tag == "1") 
				{
					Debug.Log ("Success!");
				}
			}
		}
	}
}

注意:if(isHit)==true

我们需要事先判断他是不是碰到了物体,如果没有碰到物体,后面调用hit.transform.tag会显示空引用异常,因为射线并没有碰撞到任何物体,但是你却访问了raycasthit

如果我们没有加ishit==true判断,而直接使用hit.transform.tag=="1”,鼠标在没有点到cube的时候会报空引用异常关于raycast与screenpointoray的一些个人见解_第1张图片


测试一下debug.drawray

在游戏中依次点击,暂停游戏,返回场景视图可以看到

关于raycast与screenpointoray的一些个人见解_第2张图片

对着cube点击鼠标(距离够近)

关于raycast与screenpointoray的一些个人见解_第3张图片

你可能感兴趣的:(关于raycast与screenpointoray的一些个人见解)