【Unity3D / Physical】快速处理碰撞事件的方法

本文介绍了一个Unity中用于简化碰撞事件处理的封装类ColliderListener。通过继承该类并注册回调方法,可以轻松实现碰撞进入、停留及退出等功能。

    Unity的物理系统,处理碰撞事件,需要自行实现MonoBehaviour中的void OnTriggerEnter(Collider)等方法,MonoBehaviour的生命周期方法,有些不太常用,可能会经常不记得、或者打错名字,调试还不容易找到原因,很不方便。

    我们可以把常用接口封装起来,让需要实现碰撞事件的类,继承已经封装好的类即可。


using System;
using UnityEngine;

[RequireComponent(typeof(Collider))]
public class ColliderListener : MonoBehaviour {

	public Action<Collider> onTriggerEnter = delegate { };
	public Action<Collider> onTriggerStay = delegate { };
	public Action<Collider> onTriggerExit = delegate { };
	public Action<Collision> onCollisionEnter = delegate { };
	public Action<Collision> onCollisionStay = delegate { };
	public Action<Collision> onCollisionExit = delegate { };

	private void OnTriggerEnter(Collider other) {
		onTriggerEnter(other);
	}

	private void OnTriggerStay(Collider other) {
		onTriggerStay(other);
	}

	private void OnTriggerExit(Collider other) {
		onTriggerExit(other);
	}

	private void OnCollisionEnter(Collision other) {
		onCollisionEnter(other);
	}

	private void OnCollisionStay(Collision other) {
		onCollisionStay(other);
	}

	private void OnCollisionExit(Collision other) {
		onCollisionExit(other);
	}

	public virtual void Clear() {
		onTriggerEnter = delegate { };
		onTriggerStay = delegate { };
		onTriggerExit = delegate { };
		onCollisionEnter = delegate { };
		onCollisionStay = delegate { };
		onCollisionExit = delegate { };
	}
}

    如此一来,只需要让类继承  ColliderListener  类,然后注册 onTriggerEnter 等已经封装好的事件即可,比每次都重复实现接口的效率要高不少。 本例封装了6个方法,还可以参照本例直接做出 Collider2DListener ,如果有需要可以把其他MonoBehaviour生命周期方法封装起来,做成其他的常用快速实现类。

    不过需要注意一个问题,由于这些接口都是空实现,但是只要写了这个方法,哪怕没有实现,Unity的UI消息机制,也会每次将消息发送到这个方法上,会有一定性能开销。




### Unity3D 物理相机内参配置及其意义 在 Unity3D 中,物理相机的内参(Intrinsic Parameters)主要用于定义虚拟摄像机如何捕捉场景中的三维对象并将其投影到二维平面上。这些参数直接影响渲染图像的质量以及与现实世界的比例关系。 #### 1. **焦距 (Focal Length)** 焦距决定了视场角(Field of View, FOV),从而影响透视效果。较小的焦距会产生更宽广的视野,而较大的焦距则会放大远处的对象。Unity 提供了设置 `fieldOfView` 属性的功能来调整这一参数[^2]。默认情况下,该属性以度数表示,默认值通常为 60 度。 ```csharp Camera.main.fieldOfView = 45f; ``` #### 2. **传感器尺寸 (Sensor Size)** 虽然 Unity 的标准 API 并未直接提供类似于传统摄影设备那样的传感器大小选项,但在某些高级插件或者自定义脚本中可以模拟这种行为。通过修改像素比例因子 (`pixelRect`) 和分辨率等变量间接实现对传感器尺寸的影响控制[^3]。 #### 3. **主点偏移量 (Principal Point Offset)** 主点是指成像平面中心的位置,在理想状况下位于屏幕中央;然而实际应用可能需要偏离此位置用于特殊视觉效果处理。可以通过变换矩阵操作完成相应位移设定: ```csharp Matrix4x4 projectionMatrix = Camera.main.projectionMatrix; projectionMatrix[2, 0] += xOffset; // X方向上的偏移 projectionMatrix[2, 1] += yOffset; // Y方向上的偏移 Camera.main.projectionMatrix = projectionMatrix; ``` 上述代码片段展示了如何利用投影矩阵改变主点的具体方式[^4]。 #### 4. **径向畸变校正 (Radial Distortion Correction)** 尽管 Unity 默认不支持内置镜头失真模型,但开发者能够借助后期处理栈(Post Processing Stack) 或者编写自定义着色器达成目的。例如 OpenCV 风格的鱼眼矫正算法可被移植至 Shader Graph 内部执行[^5]。 --- ### 总结说明 以上列举了几种常见的内在参数调节手段及其背后原理解释。值得注意的是,部分功能需依赖额外扩展包才能正常使用,请确保项目环境满足对应需求条件后再尝试实施。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ls9512

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值