首先,一定要推荐大家查阅Unity官方API文档:
Physics-Raycast - Unity 脚本 APIhttps://docs.unity.cn/cn/2020.2/ScriptReference/Physics.Raycast.html此文章会随着作者的Unity经验不断更新中,欢迎收藏,希望对你有帮助。
用法1
public static bool Raycast (Ray ray, out RaycastHit hitInfo, float maxDistance= Mathf.Infinity, int layerMask= DefaultRaycastLayers, QueryTriggerInteraction queryTriggerInteraction= QueryTriggerInteraction.UseGlobal);
- 首先,发送一条射线ray;比如用Camera.main.ScreenPointToRay创建射线
//按下鼠标左键,从创建一条从摄像机到鼠标当前位置的射线
if (Input.GetMouseButton(0))
{
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
- 如果射线与任何有Collider的物体发生碰撞(Box Collider,Mesh Collider…),则返回true并且将碰撞信息存储在hitInfo中。如果没有碰撞,返回false
- 并且可以设定一些条件
- 射线检查碰撞的最大距离,默认是无限远Mathf.Infinity
- 层遮罩,默认是DefaultRaycastLayers
- queryTriggerInteraction 指定该查询是否应该命中触发器(目前没用到过,之后接触到了再更新此文)
实例1:用鼠标左键点击地面,然后让Player移动到鼠标点击的地方。
备注:
- 地面设置标签为Ground
- 使用到了Navigation系统,Player是agent
using UnityEngine;
using UnityEngine.AI;
public class WorldMapPlayer : MonoBehaviour
{
private RaycastHit hitInfo;
private NavMeshAgent agent;
private void Awake()
{
agent = GetComponent<NavMeshAgent>();
}
void Update()
{
//鼠标点击地面移动
MouseMove();
}
private void MouseMove()
{
//若按下鼠标左键
if (Input.GetMouseButton(0))
{
//创建一条从摄像机到鼠标当前位置的射线
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
//Physics.Raycast将射线发送出去,如果与任何【有Collider组件的物体】发生碰撞,返回true并且将碰撞信息存储在hitInfo中,射线碰到第一个物体就会“停止”。(如果要检测射线碰撞的所有物体,用Physics.RaycastAll 方法)
if (Physics.Raycast(ray, out hitInfo))
{
GameObject clickedObject = hitInfo.collider.gameObject;
//如果clickedObject的Tag为Ground,移动到鼠标点击的位置
if (clickedObject.CompareTag("Ground"))
{
//将射线碰撞点设置为Player导航的目的地(应用NavMeshAgent组件);hit.point是射线和3D碰撞体发生碰撞的位置
agent.SetDestination(hitInfo.point);
}
}
}
}