Unity学习日志_车轮碰撞器简介

Unity学习日志_车轮碰撞器简介

1. 简介:

车轮碰撞器是一种针对地面车辆的特殊碰撞体。他有内置的碰撞检测、车轮物理系统和有滑胎摩擦的参考体。除了车轮,该碰撞体也可以用于其他游戏对象。

在这里插入图片描述

属性:

  1. Mass:车轮质量。
  2. Radius:车轮半径。
  3. Wheel Damping Rate:车轮阻尼率。
  4. Suspension Distance:悬挂距离,可以理解为悬挂弹簧的长度。
  5. Force App point Distance:
  6. Center:用于设置车轮碰撞体在对象局部坐标中的位置。
  7. Suspension Spring:悬挂弹簧设置
    1. Spring:弹簧力度,值越大,悬挂到达目标位置的速度越快。
    2. Damper:阻尼器,控制着悬挂的速度,值越大,悬挂弹簧移动速度越慢。
    3. Target Position:车轮碰撞器位置,以悬挂距离为百分比设置,0为完全伸展,1为完全压缩。
  8. Forward Friction:向前摩擦力。当车轮向前滚动时的摩擦力属性。
    1. Extremum Slip:滑动极值。
    2. Extremum Value:极限值。
    3. Asymptote Slip:滑动渐进值。
    4. Asymptote Value:渐进值。
    5. Stiffness:刚性因子,它是极限值和渐进值的乘数(默认为1,表示刚度变化的摩擦程度。设置为0时将禁用所有的车轮摩擦。通常在运行时通过脚本修改该值来模拟不同的地面材料。)
  9. Sideways Friction:侧向摩擦力。当轮胎侧向滚动时的摩擦力属性。
    1. Extremum Slip:滑动极值。
    2. Extremum Value:极限值。
    3. Asymptote Slip:滑动渐进值。
    4. Asymptote Value:渐进值。
    5. 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. 构建车辆层级:

创建一个基本的汽车骨架:

在这里插入图片描述

  1. 首先创建一个空物体用于存放车辆模型,此空物体上应当有刚体组件和车辆控制组件。

    1. 在这里插入图片描述
  2. 创建车模型的身体部分。

  3. 创建空物体作为WheelCollider组,内部添加4个车轮碰撞器作为车辆的4个车轮。

    1. 在这里插入图片描述
  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;
    }
}

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值