1 前言

碰撞体组件Collider 中介绍了 2 个碰撞体之间的碰撞检测,本文将介绍物理射线与碰撞体之间的碰撞检测。物理射线由 Ray 定义,通过 Physics.Raycast / Physics.RaycastAll 发射射线,返回 RaycastHit 碰撞检测信息。

​ 射线仅用于检测碰撞,游戏界面不能看见,但用户可以通过 Debug.DrawRay 绘制射线,通过 Debug.DrawLine 绘制线段,它们绘制的射线和线段只能在 Scene 窗口看见,在 Game 窗口看不见。

1)定义射线

// origin: 起点, direction: 方向
public Ray(Vector3 origin, Vector3 direction)
// 屏幕射线: 以相机位置为起点, 向近平面上鼠标位置方向投射的射线
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);

2)发射射线

// ray: 待发射的射线, hitInfo: 碰撞检测信息, maxDistance: 射线发射的最远距离, 返回是否发生碰撞, 只检测第一个碰撞对象
public static bool Raycast(Ray ray)
public static bool Raycast(Ray ray, out RaycastHit hitInfo)
public static bool Raycast(Ray ray, float maxDistance)
public static bool Raycast(Ray ray, out RaycastHit hitInfo, float maxDistance)
// 检查射线射程范围内所有碰撞
public static RaycastHit[] RaycastAll(Ray ray)
public static RaycastHit[] RaycastAll(Ray ray, float maxDistance)

​ 说明:以上方法是 Physics 类的静态方法,hitInfo 封装了碰撞信息,包含碰撞位置 point、碰撞体 collider 等。

3)调试射线

// start: 射线起点, dir: 射线方向, color: 射线颜色
public static void DrawRay(Vector3 start, Vector3 dir)
public static void DrawRay(Vector3 start, Vector3 dir, Color color)
// start: 线段起点, end: 线段终点, color: 线段颜色
public static void DrawLine(Vector3 start, Vector3 end)
public static void DrawLine(Vector3 start, Vector3 end, Color color)

​ 说明:以上方法是 Debug 类的静态方法。

4)区域碰撞检测

// 检验立方体范围内是否有碰撞体
public static bool CheckBox(Vector3 center, Vector3 halfExtents)
public static bool CheckBox(Vector3 center, Vector3 halfExtents, Quaternion orientation, int layermask)
// 检验球体范围内是否有碰撞体
public static bool CheckSphere(Vector3 position, float radius)
public static bool CheckSphere(Vector3 position, float radius, int layerMask)
// 检验胶囊体范围内是否有碰撞体
public static bool CheckCapsule(Vector3 start, Vector3 end, float radius)
public static bool CheckCapsule(Vector3 start, Vector3 end, float radius, int layermask)

​ 说明:以上方法是 Physics 类的静态方法。

5)投射物体

// 投射立方体
public static bool BoxCast(Vector3 center, Vector3 halfExtents, Vector3 direction)
public static bool BoxCast(Vector3 center, Vector3 halfExtents, Vector3 direction, out RaycastHit hitInfo, Quaternion orientation, float maxDistance, int layerMask)
public static RaycastHit[] BoxCastAll(Vector3 center, Vector3 halfExtents, Vector3 direction)
public static RaycastHit[] BoxCastAll(Vector3 center, Vector3 halfExtents, Vector3 direction, Quaternion orientation, float maxDistance, int layermask)
// 投射球体
public static bool SphereCast(Ray ray, float radius)
public static bool SphereCast(Ray ray, float radius, out RaycastHit hitInfo, float maxDistance, int layerMask)
public static bool SphereCast(Vector3 origin, float radius, Vector3 direction, out RaycastHit hitInfo)
public static bool SphereCast(Vector3 origin, float radius, Vector3 direction, out RaycastHit hitInfo, float maxDistance, int layerMask)
public static RaycastHit[] SphereCastAll(Ray ray, float radius)
public static RaycastHit[] SphereCastAll(Ray ray, float radius, float maxDistance, int layerMask)
public static RaycastHit[] SphereCastAll(Vector3 origin, float radius, Vector3 direction)
public static RaycastHit[] SphereCastAll(Vector3 origin, float radius, Vector3 direction, float maxDistance, int layerMask)
// 投射胶囊体
public static bool CapsuleCast(Vector3 point1, Vector3 point2, float radius, Vector3 direction)
public static bool CapsuleCast(Vector3 point1, Vector3 point2, float radius, Vector3 direction, out RaycastHit hitInfo, float maxDistance, int layerMask)
public static RaycastHit[] CapsuleCastAll(Vector3 point1, Vector3 point2, float radius, Vector3 direction)
public static RaycastHit[] CapsuleCastAll(Vector3 point1, Vector3 point2, float radius, Vector3 direction, float maxDistance, int layermask)

​ 说明:以上方法是 Physics 类的静态方法。

2 应用

1)游戏对象

​ 游戏对象的 Transform 组件参数如下:

Name Type Position Rotation Scale Color
Plane Plane (0, 0, 0) (0, 0, 0) (2, 2, 2) #B8B2B2FF
Cube1 Cube (-3, 0.5, 3) (0, 0, 0) (1, 1, 1) #F91D1DFF
Cube2 Cube (0, 0.5, 3) (0, 0, 0) (1, 1, 1) #F91D1DFF
Cube3 Cube (3, 0.5, 3) (0, 0, 0) (1, 1, 1) #F91D1DFF
Cube4 Cube (-3, 0.5, 0) (0, 0, 0) (1, 1, 1) #F91D1DFF
Cube5 Cube (0, 0.5, 0) (0, 0, 0) (1, 1, 1) #F91D1DFF
Cube6 Cube (3, 0.5, 0) (0, 0, 0) (1, 1, 1) #F91D1DFF
Cube7 Cube (-3, 0.5, -3) (0, 0, 0) (1, 1, 1) #F91D1DFF
Cube8 Cube (0, 0.5, -3) (0, 0, 0) (1, 1, 1) #F91D1DFF
Cube9 Cube (3, 0.5, -3) (0, 0, 0) (1, 1, 1) #F91D1DFF
Bullet Sphere (0, 0.5, -5) (0, 0, 0) (0.3, 0.3, 0.3) #FDF723FF
BulletCreater Empty (0, 0, 0) (0, 0, 0) (1, 1, 1) ——

​ 补充:Cube1~Cube9 和 Bullet 都添加了 Rigidbody 刚体组件,将 Bullet 拖拽至 Assets 窗口的 Resources/Prefabs 目录下,生成预设体(prefab),再删除 Hierarchy 窗口下 Bullet 对象。

2)脚本组件

​ 给 BulletCreater 游戏对象添加 RayController 脚本组件。

​ RayController.cs

using UnityEngine;

public class RayController : MonoBehaviour {
private GameObject bulletPrefab; // 炮弹预设体
private RaycastHit hit; // 碰撞信息 void Start () {
bulletPrefab = (GameObject) Resources.Load("Prefabs/Bullet");
hit = new RaycastHit();
} void Update () {
if (Input.GetMouseButtonDown(0)) {
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
if (Physics.Raycast(ray, out hit, 100)) {
// ray.origin = Camera.main.transform.position
GameObject bullet = Instantiate(bulletPrefab, ray.origin, Quaternion.identity); // 通过预设体创建炮弹
bullet.GetComponent<Rigidbody>().velocity = ray.direction * 100;
Destroy(bullet, 3);
}
}
}
}

3)运行效果

​ 声明:本文转自【Unity3D】发射(Raycast)物理射线(Ray)

【Unity3D】发射(Raycast)物理射线(Ray)的更多相关文章

  1. Unity3D之物理射线

    射线:从一个点往一个方向,发射一根无限长的射线,这根射线会与场景中带有 Collider 组件的物体发生碰撞. 射线的使用: public class Test { private void Star ...

  2. 【转】Unity3D 射线Ray实现点击拾取

    游戏中经常会有鼠标移动到某个对象上来拾取它的功能,我们可以用Unity3D中的射线Ray实现这一效果.原理是在我们鼠标的位置,从屏幕射出一条射向世界空间的射线,当这条射线碰撞到我们需要拾取的对象时,我 ...

  3. 【Unity3D】枪战游戏—发射子弹、射线检测

    一.子弹的碰撞检测: 因为子弹的移动速度非常的快,那么如果为子弹添加一个collider,就有可能检测不到了. 因为collider是每一帧在执行,第一帧子弹可能在100米处,那么下一帧就在900米处 ...

  4. [Unity3D]利用Raycast实现物体的选择与操作

    本文系作者原创 转载请注明出处 如果是一个2D的平面项目或者说需要在三维空间选择一个物体时(经常表现为抓取物件),我们需要用到Raycast事件 那么首先先说说什么是Raycast 按照字面上来理解的 ...

  5. Unity3D总结:关于射线碰撞

    方法一:Physics.Raycast 光线投射 1.static function Raycast (origin : Vector3, direction : Vector3, distance  ...

  6. threejs通过射线Ray获取指定的点

    例:获取cube方向上的面的中点坐标(该cube默认方向为(0,1,0)) (中心点向cube quaternion 方向上发射射线,与正前方的面相交的点即为目标点; 由于ray只支持box和face ...

  7. Unity3D深入浅出 -创造 物理材质(Physics Materials)

    在Unity3d中已经配置好了5种常用的物理材质,Bouncy.Ice.Metal.Rubber.Wood,在菜单中依次选择Assets - Import Package - Physics Mate ...

  8. Unity3D笔记三 物理引擎

    一.物理引擎 1.物理引擎就是模拟真实世界中物体碰撞.跌落等反应,通过Ballance.愤怒的小鸟来理解什么是物理引擎.Unity的物理引擎使用的是NviDIA的PhysX.2.选中一个游戏对象,主菜 ...

  9. Thinking in Unity3D:基于物理着色(PBS)的材质系统

    关于<Thinking in Unity3D> 笔者在研究和使用Unity3D的过程中,获得了一些Unity3D方面的信息,同时也感叹Unity3D设计之精妙.不得不说,笔者最近几年的引擎 ...

  10. unity3d教程运行物理机制

    首先,我们将把Hooke定律写Euler方法结合在一起找到新坐标.加速和速度. Hooke定律是F=kx,这里的F是指由水流产生的力(记住,我们将把水体表面模拟为水流),k是指水流的常量.x则是位移. ...

随机推荐

  1. Linux系统下安装JDK8和Maven3.8.5

    一.下载JDK8Linux版本 官网下载太慢了,小编这里为大家下载好了: 链接:百度网盘地址 提取码:ov24 二.下载Maven maven3.8.5下载链接 三.使用xftp上传到linux上 四 ...

  2. java - 正确关闭流

    package stream; import java.io.*; public class FileReaderTest { public static void main(String[] arg ...

  3. [转帖]7.5 TiKV 磁盘空间占用与回收常见问题

    https://book.tidb.io/session4/chapter7/compact.html TiKV 作为 TiDB 的存储节点,用户通过 SQL 导入或更改的所有数据都存储在 TiKV. ...

  4. [转帖]Jmeter学习笔记(八)——监听器元件之聚合报告

    https://www.cnblogs.com/pachongshangdexuebi/p/11507298.html 1.聚合报告添加 聚合报告是常用的监听器之一,添加路径: 点击线程组->添 ...

  5. 如何查看服务器的Raid缓存等配置的情况

    摘要 最近总遇到同一批机器的IO不一样的情况. 感觉可能跟硬件设备和Raid卡的设置不一样有关系. 所以今天学习研究了下storcli的命令. 希望能够进行一些数据的收集. Storcli简介 sto ...

  6. BMC修改密码

    公司里的服务器都托管出去了, 为了好维护, 都给自己的机器设置了BMC远程管理的端口, 安全起见自己修改了密码. 方法很简单.默认用户密码是 用户:root 密码: root 用户:admin 密码: ...

  7. Codeforces round 919 (div2)

    Problem - A - Codeforces 暴力枚举 就可以: #include <bits/stdc++.h> #define int long long using namesp ...

  8. 图片三像素问题如何解决css

    一.提出问题 在浏览器中,图片有一个下间隙问题,有人也称之为图片3像素BUG 1.这并不是什么浏览器bug,而只是英文字母书写时有个基线的问题,基线决定了图片的对其方式.这才是造成浏览器中图片下间隙的 ...

  9. 【笔记】grafana v8.4.2 中如何设置曲线图的双坐标轴

    作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢! cnblogs博客 zhihu 公众号:一本正经的瞎扯 这个话题当然很久就有人研究过了,只不过版本已经很老了,不适合新版本. 1 ...

  10. 【0基础学爬虫】爬虫基础之自动化工具 Pyppeteer 的使用

    大数据时代,各行各业对数据采集的需求日益增多,网络爬虫的运用也更为广泛,越来越多的人开始学习网络爬虫这项技术,K哥爬虫此前已经推出不少爬虫进阶.逆向相关文章,为实现从易到难全方位覆盖,特设[0基础学爬 ...