赞
踩
Unity中,我们要进行物理模拟和碰撞检测时,有三个重要的概念Ray、RaycastHit、Raycast。
其中,Ray可以理解为射线,它是一条从起点沿着特定方向延伸的无限长线段。
它的语法是:
Ray(Vector3 origin, Vector3 direction)
它定义了两个参数,一个起点位置和一个方向,通过Ray射线,可以用来模拟子弹、光线、玩家视线等。
RaycastHit可以理解为射线命中信息,他是一个数据结构,用于存储射线投射过程中的结果。当进行射线投射后,如果射线与场景中的物体相交,RaycastHit会存储与射线相交的物体的信息,如下图:
其中常用信息有:
一般我们通过使用Physics类的Raycast方法进行射线投射,然后把射线命中信息存储与RaycastHit。
Raycast则可以理解为射线投射,它是Physics类中的一种用于检测场景中物体碰撞的方法。我们使用该方法可以进行射线投射获取碰撞相关信息。
它的语法多大16个,但是我们常用的是:
bool Physics.Raycast(Ray ray, out RaycastHit hitInfo, float maxDistance, int layerMask);
其中,
Raycast方法会返回一个bool值,表示射线是否与物体相交。如果相交,射线命中信息将存储在hitInfo参数中。
综上所述,我们通过结合Ray、RaycastHit、Raycast这三个要素,就能实现非常好用的功能,比如在物理模拟、碰撞检测以及鼠标点击等场景,就有很大用处。
比如:
1、检测射线与物体的碰撞并获取相关信息:
- Ray ray = new Ray(origin, direction);
- RaycastHit hit;
- if (Physics.Raycast(ray, out hit, maxDistance))
- {
- // 射线与物体相交,可以获取碰撞点、碰撞法线、碰撞物体信息等
- Vector3 hitPoint = hit.point;
- Vector3 hitNormal = hit.normal;
- if(hit.collider.name=="xx" || hit.collider.tag =="xx")
- {
- //dosomething
- }
- }
2、拾取物体:
- Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
- RaycastHit hit;
- if (Physics.Raycast(ray, out hit))
- {
- // 射线与物体相交,拾取物体
- GameObject pickedObject = hit.collider.gameObject;
- // 然后进行相关控制
- }
3、还有特别常用的鼠标点击发射射线检测碰撞:
- if (Input.GetMouseButtonDown(0))
- {
- Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
- RaycastHit hit;
- if (Physics.Raycast(ray, out hit))
- {
- // 射线与物体相交,处理鼠标点击事件
- GameObject clickedObject = hit.collider.gameObject;
- //。。。
- }
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。