物理系统(一)
物理系统主要由以下几部分组成:Rigidbody(刚体)、Character Controller(角色控制器)、Collider(碰撞器)、Cloth(布料)、Joint(关节)
如图:
一、Rigibdody
● Mass: 质量
● Drag: 阻力(空气阻力)
● Angular Drag: 旋转阻力
● Use Gravity: 使用重力
● Is Kinematic: 是否运动学(若激活则物体不受物理引擎的作用)
● Interpolate: 插值(当刚体运动抖动时可使用)
▶ None: 没有
▶ Interpolate: 内插值(基于上一帧的变换来平滑本帧的变换)
▶ Extrapolate: 外插值(基于下一帧的预估)
● Collision Detection: 碰撞检测
▶ Discrete: 不连续
▶ Continuous: 连续
▶ Continuous Dynamic: 动态连续
● Constraints: 约束
二、Collider
● Is Trigger: 启用触发器
● Material: 物理材质
● Center: 中心(碰撞器与游戏对象中心的相对位置)
● Size : 大小
● Dynamaic Friction: 动态摩擦力。物体滑动时的摩擦力,通常为0到1之间。
● Static Friction: 静态摩擦力。
● Bounciness: 弹力。0时不反弹,1时的反弹不损耗能量
● Friction Combine: 摩擦力的组合方式。定义两个碰撞体的摩擦力如何相互作用
● Bounce Combine: 反弹组合
▶Average: 平均。使用两个摩擦力的均值
▶Minimum: 取最小值
▶Multiply: 相乘。两个摩擦力的乘积
▶Maximum: 取最大值
● Radius: 半径
● Height: 高度
● Direction: 方向
网格碰撞器和其他有一些区别。首先网格碰撞器可以和其他碰撞器碰撞,但是两个网格碰撞器之间不会发生碰撞,要想产生碰撞需要勾选 Convex 。(网格碰撞器会占用更多的系统资源)
● Inflate Mesh: 网格膨胀
Wheel Collider:车轮碰撞器,专门针对陆上交通工具而设计。
● Wheel Damping Rate: 车轮减震率
● Suspension Distance: 最大车轮悬挂伸缩距离,以自身坐标计算。悬挂总是通过自身Y轴伸展向下。
● Force App Point Distance:
● Suspension Spring: 悬挂弹簧
▶Spring: 弹力。该值越大可使悬挂越快达到目标位置
▶Damper: 阻尼
▶ Target Position: 目标位置
● Forward Friction: 车轮指向的摩擦力(向前)
▶Extremum Slip: 滑动极值
▶Extremum Value: 极限值
▶Asymptote Slip: 滑动渐进值
▶Asymptote Value: 渐进值
▶Stiffness: 刚性因子
● Sideways Friction: 车轮侧面摩擦力
▶Extremum Slip: 滑动极值
▶Extremum Value: 极限值
▶Asymptote Slip: 滑动渐进值
▶Asymptote Value: 渐进值
▶Stiffness: 刚性因子
● Material: 物理材质
● Terrain Data: 地形
● Enable Tree Colliders:
三、Character Controller
角色控制器和刚体不能同时使用。如果你的角色需要受到重力,你就需要在脚本中模拟重力;如果你希望你的角色受到物理效果的影响,你最好使用刚体而不是角色控制器。
在Unity物理引擎中有两种检测碰撞的方法,一种是刚体+碰撞器跟其他的碰撞器碰撞;另一种是 Character Controller与其他的碰撞器碰撞。
两种方法的主要区别是 Character Controller 的方法与其他的物体碰撞后并不会对他们产生任何力的作用(这种方法一般用于摄像机浏览场景时,需要控制摄像机不穿透场景中的物体时使用),而刚体+碰撞器的方法则会对游戏场景中的物体产生力的作用
● Slope Limit: 爬坡限制
● Step Offset: 台阶高度
● Skin Width: 皮肤厚度,即两个碰撞器可以相互渗入的厚度(较大的值会导致颤抖,较小的值会导致角色卡住,一般设为 Radius 的10%)
● Min Move Distance:最小移动距离(如果小于该值则角色不会移动)
★ 角色控制器有专门的碰撞检测方法 OnControllerColliderHit。
★角色控制器不能将钢体推开,如果要做这件事可以使用 OnControllerColliderHit。
★在使用 Move 方法移动时,collisionFlags 属性能指明是哪个部分发生了碰撞
/// <summary> /// 这个方法调用角色控制器,控制角色移动并模拟重力 /// </summary> float speed = 6f; float jumpSpeed = 8f; float gravity = 20f; private Vector3 moveDirection = Vector3.zero; void Update() { CharacterController controller = GetComponent<CharacterController>(); //如果角色控制器接触地面 //通过轴重新计算 moveDirection if (controller.isGrounded) { moveDirection = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical")); moveDirection = transform.TransformDirection(moveDirection); moveDirection *= speed; //跳跃 if (Input.GetButton("Jump")) { moveDirection.y = jumpSpeed; } } //模拟重力 moveDirection.y -= gravity * Time.deltaTime; //移动控制,调用Move方法
//Move:方法通过一个增量参数控制角色移动 SimpleMove:方法通过一个速度参数控制角色移动。 controller.Move(moveDirection * Time.deltaTime); } /// <summary> /// 这个方法用来推开角色控制器碰到的所有刚体 /// </summary> public float pushPower = 2.0F; void OnControllerColliderHit(ControllerColliderHit hit) { Rigidbody body = hit.collider.attachedRigidbody; //没有刚体,返回0 if (body == null || body.isKinematic) return; //我们不想推动在我们下边的物体。moveDirection(当碰撞发生时,角色控制器的方向) if (hit.moveDirection.y < -0.3F) return; //根据移动方向计算推的方向 //我们只把物体推向一旁,而不是往上或往下 Vector3 pushDir = new Vector3(hit.moveDirection.x, 0, hit.moveDirection.z); //速度=推动方向*推动速度 body.velocity = pushDir * pushPower; }
四、Cloth
Cloth组件专门为人物服装设计,同时配合 Skinned Mesh Renderer 使用
● Cast Shadows: 投射阴影
● Receive Shadows: 接受阴影
● Motion Vectors: 运动矢量
● Materials: 材质列表
▶Size: “Material”的数量
▶Element 0:
● Light Probes: 光探头
▶Blend Probes: 混合探头
▶Use Proxy Volume:
● Reflection Probes: 反射探头
▶Blend Probes: 混合探头
▶Blend Probes And Skybox:
▶Simple:
● Anchor Override: 锚定覆盖
● Lightmap Parameters:
● Quality: 质量。影响单个点的最大骨骼数量
● Update When Offscreen: 画面外更新
● Skinned Motion Vectors: 蒙皮运动矢量
● Mesh: 用于蒙皮的网格
● Root Bone: 根节点
● Bounds: 渲染器的边界框
▶Center:
▶Extents:
● Stretching Stiffnes: 拉伸刚度。用于设置布料的抗拉伸程度,0-1之间,数值越大越不容易拉伸。
● Bending Stiffness: 弯曲刚度。用于设置布料的抗弯曲程度,0-1之间,数值越大越不容易拉伸。
● Use Tethers: 应用约束。
● Use Gravity: 使用重力
● Damping: 阻尼
● External Acceleration: 外部加速度
● Random Acceleration: 随机加速度
● World Velocity Scale: 定义角色在世界空间移动对布料顶点的影响(基于空气阻力)
● World Acceleration Scale: 角色加速度对布料顶点的影响
● Friction: 布料摩擦
● Collision Mass Scale: 碰撞质量
● Use Continuous Collision: 使用连续碰撞
● Use Virtual Paticles: 使用虚拟粒子。每个三角形添加一个虚拟粒子提供碰撞稳定性
● Solver Frequency: 每秒解算器迭代次数
● Sleep Threshold : 睡眠阙值
● Capsule Colliders:
● Sphere Colliders:
五、Joint(关节)
● Connected Body: 连接体,为刚体指定的关节连接物,如不设定,则与世界相连
● Anchor: 锚点,用于定义关节中心,也就是物件将被拖去的点。
● Axis: 坐标轴,摇摆方向的坐标,基于本地坐标系
● Auto Configure Connected Anchor:
● Connected Anchor:
● Use Spting: 是否使用弹簧
● Spring: 弹簧
▶Spring: 弹簧力
▶Damper: 阻尼
▶Target Position: 弹簧的目标角度。弹簧拉向这个角度
● Use Motor: 是否使用马达
● Motor: 马达
▶Target Velocity: 目标速率
▶Force: 力
▶Free Spin: 自由转动
● Use Limits: 是否有限制
● Limis: 限制
▶Min: 最小。能达到的最小角度
▶Max: 最大
▶Bounciness: 最小弹跳
▶Bounce Min Velocity: 最大弹跳
▶Contact Distance: 接触距离
● Break Force: 破坏力。破坏关节的力的大小。(Infinity:默认无穷大)
● Break Torque: 破坏扭矩。破坏关节的扭力的大小
● Enable Collision:
● Enable Preprocessing:
● Fixed Joint: 固定关节。当你想要两个没有父子关系的物体一起运动,可是又希望他能受力而分开时使用
● Break Force: 破坏力。破坏关节的力的大小
● Break Torque: 破坏扭矩。破坏关节的扭力的大小
● Spring Joint: 弹簧
● Min Distance/Max Distance:弹簧在这两个之间是正常状态,不激活弹簧或者说不受力。(一般为0)