【Unity 23】 Unity 射线,物理材质,投射的应用及坐标系的补充

这篇笔记详细介绍了Unity中射线的使用,包括如何进行射线检测,获取物体碰撞信息;物理材质在碰撞反弹中的作用;投射技术如BoxCastAll的运用;并补充了坐标系的知识,包括世界坐标系、物体坐标系、屏幕坐标系和视图坐标系。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

PS:本系列笔记将会记录我此次在北京学习Unity开发的总体过程,方便后期写总结,笔记为日更。
笔记内容均为 自己理解,不保证每个都对

Part 1 射线 :

在Unity中,有时我们需要获得物体碰撞的位置坐标,角度之类等之类的信息,这时我们就可以采用射线Ray来进行。
以相机到物体为例

首先鼠标的操作有:

private void OnMouseOver();		//鼠标覆盖物体
private void OnMouseEnter();		//鼠标进入物体
private void OnMouseDown();		//鼠标按下
private void OnMouseDrag();		//鼠标点中物体拖拽
private void OnMouseUp();			//鼠标按键松开
private void OnMouseExit();			//鼠标离开物体

进入物体的执行顺序为: Enter —> Over

射线的定义:

Ray tmpRay = Camera.main.ScreenPointToRay(Input.mousePosition);     //鼠标所在的地方引出一条射线

在Scene界面显示射线: 方向向量为 射线.direction.normalized

        Debug.DrawLine(tmpRay.origin, tmpRay.direction.normalized * 100, Color.red);        //tmpRay.direction.normalized方向向量
        //DrawLine(射线起点,射线终点,射线颜色)

判断是否击中:

### Unity 中实现射线检测的方法 在 Unity 中,射线检测是一种常用的技术,用于判断场景中的对象是否被点击或选中。对于 2D 和 3D 场景,射线检测的具体实现有所不同。 #### 创建射线并执行检测 为了创建一条射线并执行检测,在 C# 脚本中通常会使用 `Ray` 类和 `Physics.Raycast` 或者 `Physics2D.Raycast` 方法。下面是一个简单的例子,展示了如何从摄像机位置向鼠标指针的方向发射一条射线,并检测是否有物体被击中[^1]: ```csharp using UnityEngine; public class RaycastExample : MonoBehaviour { void Update() { if (Input.GetMouseButtonDown(0)) { // 获取屏幕坐标下的鼠标位置 Vector3 mousePos = Input.mousePosition; // 将屏幕坐标转换为世界坐标系中的射线 Ray ray = Camera.main.ScreenPointToRay(mousePos); RaycastHit hitInfo; // 执行射线检测 bool didHit = Physics.Raycast(ray, out hitInfo); if (didHit) { Debug.Log($"命中了 {hitInfo.collider.name}"); // 可以在这里处理命中的逻辑 } } } } ``` 这段代码会在每次左键单击时尝试进行一次射线投射操作。如果成功找到碰撞,则打印出所碰到的对象名称[^2]。 #### 设置层掩码(Layer Mask) 有时可能只希望某些特定类型的物体能够响应射线检测。这时可以通过设置 `layerMask` 参数来限定哪些层次上的物体会参与检测过程。例如,假设有一个名为 "InteractiveObjects" 的自定义层,那么可以在编辑器里配置好之后如下所示修改上述脚本[^3]: ```csharp // 定义一个公共变量以便于在Inspector面板设定对应的图层遮罩 [SerializeField] private LayerMask interactiveLayers; ... bool didHit = Physics.Raycast(ray, out hitInfo, Mathf.Infinity, interactiveLayers); ``` 这样做的好处是可以更精确地控制哪些游戏物件应该参与到射线测试当中去。 #### 处理不同维度的空间 需要注意的是,当工作在一个二维空间环境 (`Unity2D`) 下时,应当改用 `Physics2D.Raycast` 函数代替 `Physics.Raycast` 来适应平面几何结构的特点[^4]。 ```csharp if (Physics2D.Raycast(ray.origin, ray.direction, Mathf.Infinity, interactiveLayers)) { // 对应的2D版本处理逻辑... } ``` 此外,针对虚拟现实(VR)或其他特殊输入设备的应用程序开发,还可以考虑调整射线起点的位置,比如基于控制器的手柄位置等[^5]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值