Unity 碰撞检测

本文介绍了Unity中两种碰撞检测方法:Trigger检测和Collision检测。Trigger检测适用于带有Collider和Rigidbody(至少一方为Trigger)的情况,触发OnTriggerEnter等事件。Collision检测则需要双方有非kinematic Rigidbody,事件如OnCollisionEnter,可以通过ContactPoint获取详细碰撞信息。

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

unity碰撞检测
(1)
检测Trigger:双方都有Collider。双方至少有一个Rigidbody(任意一方都可以),有一个Trigger(任意一方都可以).

若只有一个Rigidbody,则碰撞时,该Rigidbody一定要是运动的。

碰撞后发出的OnTriggerEnter,OnTriggerStay,OnTriggerExit都可以在双方所附加的脚本上接收。其中的参数Collider other是碰撞的另一方的Collider

(2)
检测Collision:双方都没有Trigger。双方至少有一个非kinematic的Rigidbody。

若只有一个Rigidbody,则碰撞时,该Rigidbody一定要是运动的。

碰撞后发出的OnCollisionEnter,OnCollisionStay,OnCollisionExit都可以在双方所附加的脚本上接收。其中的参数Collision collision的各个属性collider,gameObject,rigidbody(若无则为null),transform,均为碰撞另一方的属性。
### Unity 中的碰撞检测实现方法 在 Unity 的开发过程中,碰撞检测是一个非常重要的功能模块。以下是几种常见的碰撞检测方式及其具体实现: #### 射线检测 射线检测是一种常用的碰撞检测技术,在许多场景下用于判断物体之间的交互关系。通过 `Physics.Raycast` 函数可以轻松实现这一目标[^1]。 ```csharp using UnityEngine; public class RaycastExample : MonoBehaviour { void Update() { Vector3 origin = transform.position; Vector3 direction = transform.forward; if (Physics.Raycast(origin, direction, out RaycastHit hit)) { Debug.Log($"Hit object: {hit.collider.name}"); } } } ``` 上述代码展示了如何使用射线投射来检测前方是否有对象被命中,并打印出该对象的名字。 --- #### 静态方法调用 Input 类 Unity 提供了许多内置工具帮助开发者快速完成输入处理工作。例如,`Input.GetAxis` 是一种获取用户输入的方式之一。需要注意的是,这些函数均为静态方法,因此可以直接通过类名访问而无需创建实例[^2]。 如果尝试在一个非静态上下文中操作,则可能会遇到错误提示:“无法从静态字段或属性中引用非静态成员”。这表明当前环境不允许此类行为发生。 --- #### 扇形范围内的点判定 对于某些特殊需求来说,可能需要知道某一点是否位于特定角度范围内(比如技能释放区域)。此时可以通过计算两个向量间夹角的方法来进行验证[^3]。 假设我们已经得到了玩家位置至目标位置的方向矢量以及技能发射方向矢量,则可通过如下逻辑得出结论: ```csharp float angleThreshold = Mathf.Deg2Rad * maxAngle / 2f; // Convert degree to radian and half it. Vector3 normalizedA = a.normalized; Vector3 normalizedB = b.normalized; if(Vector3.Dot(normalizedA, normalizedB) >= Math.Cos(angleThreshold)){ // Inside the cone area. } else { // Outside the cone area. } ``` 这里的关键在于理解三角学中的余弦定理应用——当两单位长度向量做内积运算结果大于等于给定阈值时即满足条件。 --- ### 总结 以上介绍了三种不同类型的碰撞或者空间关系查询手段:基于物理引擎的传统射线测试;针对键盘鼠标事件捕捉机制下的简单指令执行模式切换;还有就是几何图形算法方面的基础运用案例分析。每种都有其适用场合,合理选用才能达到最佳效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值