Unity学习日志_车轮碰撞器简介
1. 简介:
车轮碰撞器是一种针对地面车辆的特殊碰撞体。他有内置的碰撞检测、车轮物理系统和有滑胎摩擦的参考体。除了车轮,该碰撞体也可以用于其他游戏对象。
属性:
- Mass:车轮质量。
- Radius:车轮半径。
- Wheel Damping Rate:车轮阻尼率。
- Suspension Distance:悬挂距离,可以理解为悬挂弹簧的长度。
- Force App point Distance:
- Center:用于设置车轮碰撞体在对象局部坐标中的位置。
- Suspension Spring:悬挂弹簧设置
- Spring:弹簧力度,值越大,悬挂到达目标位置的速度越快。
- Damper:阻尼器,控制着悬挂的速度,值越大,悬挂弹簧移动速度越慢。
- Target Position:车轮碰撞器位置,以悬挂距离为百分比设置,0为完全伸展,1为完全压缩。
- Forward Friction:向前摩擦力。当车轮向前滚动时的摩擦力属性。
- Extremum Slip:滑动极值。
- Extremum Value:极限值。
- Asymptote Slip:滑动渐进值。
- Asymptote Value:渐进值。
- Stiffness:刚性因子,它是极限值和渐进值的乘数(默认为1,表示刚度变化的摩擦程度。设置为0时将禁用所有的车轮摩擦。通常在运行时通过脚本修改该值来模拟不同的地面材料。)
- Sideways Friction:侧向摩擦力。当轮胎侧向滚动时的摩擦力属性。
- Extremum Slip:滑动极值。
- Extremum Value:极限值。
- Asymptote Slip:滑动渐进值。
- Asymptote Value:渐进值。
- Stiffness:刚性因子,它是极限值和渐进值的乘数(默认为1,表示刚度变化的摩擦程度。设置为0时将禁用所有的车轮摩擦。通常在运行时通过脚本修改该值来模拟不同的地面材料。)
2. WheelCollider:
其中brakeTorque,motorTorque,steerAngle为车辆设置的基础变量。
变量:
*brakeTorque | 制动扭矩以牛顿米表示。设置车轮阻尼率和此项可以实现较好的刹车效果。 |
---|---|
center | 在该对象本地空间中测量的车轮中心。 |
forceAppPointDistance | 从静止车轮的底部测量的悬架和轮胎力的作用点。 |
forwardFriction | 车轮前进方向上的轮胎摩擦属性。 |
isGrounded | 指示车轮当前是否与某物发生碰撞。(只读) |
mass | 车轮的质量(以千克为单位)。必须大于零。典型值的取值范围为 (20,80)。 |
*motorTorque | 轮轴上的电机扭矩(以牛顿米表示)。根据方向,可以为正值或负值。 |
radius | 车轮的半径(在本地空间测量)。 |
rpm | 当前轮轴转速(以每分钟转数为单位)。(只读) |
sidewaysFriction | 车轮侧向的轮胎摩擦属性。 |
sprungMass | 该 WheelCollider 支撑的质量。 |
*steerAngle | 转向角度(以度为单位),始终围绕本地 Y 轴。 |
suspensionDistance | 车轮悬架的最大延伸距离(在本地空间中测量)。 |
suspensionSpring | 车轮悬架的参数。悬架尝试通过施加线性力和阻尼力来到达目标位置。 |
wheelDampingRate | 车轮的阻尼率。必须大于零。 |
公共函数:
ConfigureVehicleSubsteps | 配置车辆子步进参数。 |
---|---|
GetGroundHit | 获取车轮的地面碰撞数据。 |
GetWorldPose | 获取车轮的世界空间姿态 - 考虑地面接触、悬架限制、转向角度和旋转角度(以度为单位)。 |
3. 构建车辆层级:
创建一个基本的汽车骨架:
-
首先创建一个空物体用于存放车辆模型,此空物体上应当有刚体组件和车辆控制组件。
-
创建车模型的身体部分。
-
创建空物体作为WheelCollider组,内部添加4个车轮碰撞器作为车辆的4个车轮。
-
如果想要车轮模组,建议与wheelCollider分开且需要关闭其碰撞器组件。
车辆控制代码:
using UnityEngine;
public class CarControllerDemo : MonoBehaviour
{
/// <summary>
/// 其中back轮为驱动轮,front轮为转向轮
/// </summary>
#region wheelGroup
public WheelCollider leftBackWheel;
public WheelCollider rightBackWheel;
public WheelCollider leftFrontWheel;
public WheelCollider rightFrontWheel;
#endregion
#region axisValue
public float _horizontal;
public float _vertical;
#endregion
#region speedValue
/// <summary>
/// 移动速度
/// </summary>
public float moveSpeed;
/// <summary>
/// 制动指数
/// </summary>
public float stopspeed;
/// <summary>
/// 转向速度
/// </summary>
public float rotateSpeed;
#endregion
// Start is called before the first frame update
void Start()
{
moveSpeed = 1000f;
rotateSpeed = 200f;
}
// Update is called once per frame
void Update()
{
CarController();
}
private void CarController()
{
_horizontal = Input.GetAxisRaw("Horizontal");
//vertical采取累加策略,可以在后期设置不同的Clamp值来模拟不同的档位
_vertical = Mathf.Clamp(_vertical + Input.GetAxis("Vertical"),-10,10);
//刹车键
StopCar();
CarMotor();
}
/// <summary>
/// 车辆制动方法
/// </summary>
private void StopCar()
{
//当按下空格之后制动
if (Input.GetKey(KeyCode.Space))
{
//制动采取累加制动,制动效果更加明显
_vertical = 0;
leftBackWheel.brakeTorque += stopspeed;
rightBackWheel.brakeTorque += stopspeed;
Debug.Log("stop!");
}
//当不按空格键时制动扭矩归0
else
{
leftBackWheel.brakeTorque = 0;
rightBackWheel.brakeTorque = 0;
}
}
/// <summary>
/// 车辆移动方法
/// </summary>
private void CarMotor()
{
leftBackWheel.motorTorque = _vertical * moveSpeed;
rightBackWheel.motorTorque = _vertical * moveSpeed;
leftFrontWheel.steerAngle = _horizontal * rotateSpeed;
rightFrontWheel.steerAngle = _horizontal * rotateSpeed;
}
}