Unity学习日志_物理系统简介
1. Rigidbody(刚体组件):
RigidBody可以使游戏对象在物理系统的控制下进行运动。
1. 重点变量:
- useGravity:物体是否受到重力影响。
- isKinematic:物体是否动力学,简单来说就是物体是否受到碰撞物理效果影响(勾选此项后,不再检测与只挂载Collider组件的物体和同样勾选此项物体的碰撞,只检测同时拥有Rigidbody和Collider且没有勾选此项的物体碰撞)。也就是物体不再受物理引擎的控制。
2. 适用性:
- 需要物理效果的物体。
- 需要碰撞检测来调用方法的物体。
3. 变量:
-
Mass质量:该项用于设置物体的质量,同一个场景中的游戏物体之间质量之比就好在1/100到100之间。
-
Drag阻力:设定空气阻力,0表示没有空气阻力。
-
Angular Drag角阻力:设定旋转阻力,0表示没有阻力。
-
Interpolate:插值,用于减缓物体刚体运动中的抖动现象。
- None:无插值。
- Interpolate:内插值,基于上一帧Transform来平滑本次Transform。
- Extrapolate:外插值,基于下一帧Transform来平滑本次Transform。
-
Collision Detection:碰撞检测。
-
Constraints:约束,可以冻结位置或者旋转方位,此时本方向上的移动或者旋转将无效。
2. Collider碰撞器:
为游戏物体添加物理边界。单纯的两个Collider碰撞不会产生物理效果,需要Rigidbody来检测。
当两者同时存在的时候才可以存在碰撞的物理效果,碰撞检测的开关在Rigidbody上,且碰撞检测必须有碰撞器。对于有刚体组件和碰撞器组件的物体在出现碰撞检测时会模拟对应物理现象,对于只有碰撞器的组件在出现碰撞检测时不会模拟对应的物理现象(没有力的相互作用现象)类似于墙壁的效果。
1. 总结碰撞的条件(出现碰撞检测的条件):
- 必须有Collider物理边界
- 运动的物体必须有刚体组件(运动的物体如果没有则不能碰撞检测)。
2. 碰撞的三个阶段(物理更新阶段):
-
OnCollisionEnter(collision other):碰撞的第一帧触发
-
OnCollisionStay(collision other):碰撞接触持续出发
-
OnCollisionExit(collision other):不在碰撞的第一帧触发。
-
其中的collision类为事件参数类
-
other.collider.GetComponent<>();获取碰撞物体的其他组件。(other会带着一些常用组件的引用如collider,transform等)。
3. 常用碰撞器:
1. Box Collider盒子碰撞器:
-
-
后续介绍的碰撞器除Mesh和wheel之外可选参数都如上图。
-
Edit Collider:手动在Scene视图中调节碰撞器。
-
Is Trigger:是否为触发器。
-
Material:放置物理材质。
-
Center:碰撞器的中心点位置。
-
Size:碰撞器的大小。
2. Sphere Collider球碰撞器:
3. Capsule Collider胶囊体碰撞器:
4. Mesh Collider网格碰撞器:
- Convex:勾选此项后,网格碰撞器就可以和其他网格碰撞器进行碰撞检测。
- Is Trigger:是否为触发器。
- Material:放置物理材质
- Mesh:选用网格。
5. Terrain Collider地形碰撞器:
- Material:放置物理材质。
- Terrain Data:地形数据,不同的地形数据决定了不同的地形外观。
- Enable Tree Colliders:是否添加树碰撞体。
6. wheel Collider车轮碰撞器:
这里不做详细展开。
3. Trigger(触发器):
当需要碰撞检测但不需要物理效果时使用,但注意触发不能获得碰撞信息(碰撞坐标等)。
1. 触发的条件:
- 两者都有碰撞器。
- 其中之一有刚体。
- 其中之一勾选触发器》
2. 触发三阶段:
- OnTriggerEnter(collider other):碰撞的第一帧触发
- OnTriggerStay(collider other):碰撞接触持续出发
- OnTriggerExit(collider other):不在碰撞的第一帧触发。
- 与碰撞器不同的是触发器的参数类型就是collider类型的,获取其他组件直接other.GetComponent<>();
- 由于触发器的条件范围明显大于碰撞器,所以在双方各只有一个Collider组件的时候如果勾选了is trigger则必定是触发器先触发。
- 触发器的现象:没有碰撞效果。
- 注意:碰撞检测有时间间隔,并不适合用来检测像子弹这种高速移动的游戏对象。即使是高速动态检测模式也不能保证一定可以检测到。
- 解决方案:使用射线检测。
4. 物理材质:
Physics material(物理材质,模拟物体的摩擦力和弹力,比如可以设置弹力用来模拟篮球):右键创建菜单中可以创建,控制物体的动摩擦力,静摩擦力,弹力等物理变量。
1. 变量:
- Dynamic Friction:动摩擦力取值范围[0,+∞]。
- Static Friction:静摩擦力取值范围[0,+∞]。
- Bounciness:弹力比例取值范围[0,1],0表示没有弹力,1表示弹力十足。
- Friction Combine:两个碰撞对象力的合成方式,决定之后力的大小
- Bounciness Combine:两个碰撞对象弹力的合成范围,决定之后的弹力的大小。
5. 关节Joint简介:
关节必须依赖于刚体实现。
1. Hinge Joint(铰链关节):
本关节适合充当门的合叶或者模拟钟摆等。
-
-
Connected Body:选择要连接的游戏对象。
-
Anchor:自身旋转轴的位置,按百分比填,默认自身坐标轴在物体的正中心,则数值范围为[-0.5,0.5]。
-
Axis:自身旋转轴的朝向。
-
Auto Configure Connected Anchor:根据自身Anchor坐标自动计算连接物体的Anchor坐标。
-
Connected Anchor:连接物体的旋转轴。
-
Using Spring:使用弹力,勾选此项后Spring中的设置就会应用。
-
Spring:弹力大小。
-
Damper:阻尼大小,可以认为是弹力的阻力。
-
Target Position:目标角度,填写目标角度会使自身旋转到目标角度。
-
Using Motor:使用电机。电机可以使物体自动旋转。勾选此项后Motor中的设置就会应用。
-
Target Velocity:目标速度,设置最大转速。
-
Force:为达到目标速度而施加给物体的持续力。
-
Free Spin:自动转动,会越转越快。
-
Using Limit:使用约束。勾选此项后Limits中的设置就会应用。
-
Min:最小旋转度数。
-
Max:最大旋转度数。
-
Bouniness:当触及最大或最小度数后弹力,0表示没有弹力。
-
Bounce min Velocity:目前测试的结果是:此项设置的是回弹所需要的最小速度。
-
Contact Distance:接触距离,可以防止逼近极限时突然停止。
-
Break Force:破坏关节所需的力。
-
Break Torque:破坏关节所需的扭矩。
-
Enable Collision:激活碰撞,勾选此项则关节之间也会检测碰撞。
-
Enable Preprocessing:启动预处理,禁用预处理有助于稳定无法执行的配置。
-
Mass Scale:自身质量放缩值。
-
Connected Mass Scale:连接体质量放缩值。
-
anchor和connected anchor的关系:
2. Fixed Joint(固定关节):
本关节适合在不改变层级关系的基础上来固定两个物体。
-
-
属性在铰链关节都有介绍。
3. Spring Joint(弹性关节):
模拟弹簧用的关节。
4. Character Joint(角色关节):
暂不介绍。
5. Configurable Joint(可配置关节):
暂不介绍。
6. 布料Cloth:
有缘详细介绍。
7. 角色控制器(截取自unity用户手册2018.4):
1. 描述
CharacterController 可使您轻松进行受碰撞约束的移动,同时不必处理刚体。
CharacterController 不受力影响,仅在您调用 Move 函数时才会移动。 然后它执行移动,但受碰撞约束。
2. 变量
center | 该角色的胶囊体中心(相对于变换组件的位置)。 |
---|---|
collisionFlags | Move方法的返回值类型。在上次 CharacterController.Move 调用期间,该胶囊体的哪个部分与环境发生了碰撞。 |
detectCollisions | 确定其他刚体或角色控制器是否与该角色控制器碰撞(默认情况下始终启用它)。该属性对于临时禁用角色控制器非常有用。例如,您可能需要将某个角色装载到汽车中, 并且在其再次下车前禁用碰撞检测。 |
enableOverlapRecovery | 启用或禁用重叠恢复。 启用或禁用重叠恢复。用于在检测到重叠时取消角色控制器从静态对象的穿透。 |
height | 该角色胶囊体的高度。 |
isGrounded | 在上次移动期间 CharacterController 是否接触地面? |
minMoveDistance | 获取或设置此角色控制器的最小移动距离。 |
radius | 该角色胶囊体的半径。 |
skinWidth | 该角色的碰撞皮肤宽度。 |
slopeLimit | 这些角色控制器的坡度限制(单位为度)。 |
stepOffset | 这些角色控制器的台阶偏移量(单位为米)。 |
velocity | 该角色的当前相对速度(请参阅注释)。 |
3. 公共函数
Move | 采用绝对移动增量的更复杂移动函数。 |
---|---|
SimpleMove | 以 speed 移动该角色。 |
4. 消息
OnControllerColliderHit | 当该控制器在执行 Move 时撞到碰撞体时调用 OnControllerColliderHit。 |
---|---|
8. 射线:
1. Ray:
射线是从 origin 开始并按照某个 direction 行进的无限长的线。
变量
direction | 射线的方向。 |
---|---|
origin | 射线的原点。 |
构造函数
Ray | 沿着 direction 创建从 origin 开始的射线。 |
---|---|
2. Phycics.RayCast:
射线检测。该方法有非常多的重载。此方法属于Physics类。
参数
origin | 射线在世界坐标系中的起点。 |
---|---|
direction | 射线的方向。 |
maxDistance | 射线应检查碰撞的最大距离。 |
layerMask | 层遮罩,用于在投射射线时有选择地忽略碰撞体。 |
queryTriggerInteraction | 指定该查询是否应该命中触发器。 |
返回
bool 如果射线与任何碰撞体相交,返回 true,否则为 false。
描述
向场景中的所有碰撞体投射一条射线,该射线起点为 /origin/,朝向 /direction/,长度为 /maxDistance/。
您可以选择提供一个 LayerMask,以过滤掉不想生成与其碰撞的碰撞体。
关于获取层级:
LayerMask使用的是enum类型,且是[flags]形式(一位代表一个状态),因此在unity脚本中存在两种获取层级的方法。
-
LayerMask.GetMask();输入层级名称字符串,可输入多个。
-
按位或运算,要同时获得8层和9层则:
LayerMask _layerMask = new LayerMask(); _layerMask = (1<<8 || 1<<9);
3. RayCastHit:
作为RayCast的out参数。存储射线击中对象的信息。
变量
barycentricCoordinate | 命中的三角形的重心坐标。 |
---|---|
collider | 命中的 Collider。 |
distance | 从射线原点到撞击点的距离。 |
lightmapCoord | 撞击点处的 UV 光照贴图坐标。 |
normal | 射线命中的表面的法线。 |
point | 世界空间中射线命中碰撞体的撞击点。 |
rigidbody | 命中的碰撞体的 Rigidbody。如果该碰撞体未附加到刚体,则值为 /null/。 |
textureCoord | 碰撞位置处的 UV 纹理坐标。 |
textureCoord2 | 撞击点处的辅助 UV 纹理坐标。 |
transform | 命中的刚体或碰撞体的 Transform。 |
triangleIndex | 命中的三角形的索引。 |
4. Camera.ScreenPointToRay:
public Ray ScreenPointToRay (Vector3 pos);
屏幕射线方法。返回值为Ray
可以通过此方法和RayCast一起使用实现从相机视角发出的射线检测。
pos参数可以选择获取鼠标当前位置的形式来从鼠标位置发出射线。
9. Physics静态方法的总结:
Physics类中的静态方法总体上可以分为:
- XXXCastXXX类,例如投放射线检测,投放cube检测,投放sphere检测等等
- CheckXXX类,比如CheckSphere就是给组件所挂载的游戏对象生成一个Sphere区,区内有碰撞体则返回true。
- OverlapXXX类,与CheckXXX类相似,不同是的此方法返回的为一个collider[],可以就区域内的所有碰撞体做具体操作。
10. 可视化物理调试
此窗口允许用户快速检查场景中的几何碰撞体,并分析常见的物理学场景。
打开物理调试窗口:
开启之后的效果:
没有开启的效果: