Unity3D_WheelCollider车轮碰撞器

面板属性

Unity3D_WheelCollider车轮碰撞器

  • Mass(质量):车轮的质量
  • Radius(半径):车轮的半径大小
  • Suspension Distance(悬挂距离):最大车轮悬挂伸缩距离,以自身坐标计算。悬挂总是通过自身Y轴伸展向下。
  • Center(中心):车轮在对象自身坐标的中心位置
  • Suspension Spring(悬挂弹簧):通过添加弹簧和阻尼力,悬挂试图达到目标位置(Target Position)。
  • Spring(弹簧):弹簧力尝试达到目标位置(Target Position),大的值可使悬挂快速达到目标位置(Target Position)。
  • Damper(阻尼器):阻尼器控制悬挂速度,大的值可使悬挂弹簧移动变慢。
  • Target Position(目标位置):悬挂的静止状态距离沿着悬挂距离,0值充分伸展悬挂,1值充分压缩悬挂,默认值为0,这是一个标准的汽车悬挂行为
  • Forward/Sideways Friction(向前摩擦力):当车轮向前/侧向滚动时的摩擦力属性。

代码方法

  • morotTorque(驱动力):为正时车向前走,为负时车向后走
  • steerAngle(转向驱动力):数值为车轮的旋转角度,若数值为30,则车轮顺时针旋转30度
  • brakeTorque(刹车力):数值越大,当驱动力为零时,车的速度降到零的时间越短
  • rpm(车轮转速):车轮没分钟转多少圈,通过计算之后 可以让车轮模型的旋转速度该速度相当

注意

   1. 不添加 Rigidbody 组件时,不会显示该碰撞器

   2. 车壳的 Collider 不能包裹住 WheelCollider,否则车不会移动

   3. 车轮碰撞器旋转时,车轮碰撞器所在游戏物体不会旋转,即 只有碰撞器旋转,车轮模型不会转,若想要车轮模型一起旋转需要根据 rpm 在代码中描述。

   4. 得到车轮每帧旋转的角度:float speed = rpm * 6 * Time.deltaTime

实例代码参考

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Driving : MonoBehaviour
{
    // 四个车轮碰撞器(作为车壳的子物体)
    public WheelCollider wheel_Forword_Left;
    public WheelCollider wheel_Forword_Right;
    public WheelCollider wheel_Back_Left;
    public WheelCollider wheel_Back_Right;
    // 四个车轮模型(每个模型作为每个车轮碰撞器的子物体)
    private Transform wheelModel_Forword_Left;
    private Transform wheelModel_Forword_Right;
    private Transform wheelModel_Back_Left;
    private Transform wheelModel_Back_Right;
    // 重心(作为车壳的子物体)
    public Transform centerOfMass;

    void Start()
    {
        // 设置重心(注意是 localPosition ,Position会使车不规则跳动)
        GetComponent<Rigidbody>().centerOfMass = centerOfMass.localPosition;
        // 给车轮模型赋值
        wheelModel_Forword_Left = wheel_Forword_Left.transform.GetChild(0);
        wheelModel_Forword_Right = wheel_Forword_Right.transform.GetChild(0);
        wheelModel_Back_Left = wheel_Back_Left.transform.GetChild(0);
        wheelModel_Back_Right = wheel_Back_Right.transform.GetChild(0);
    }

    void FixedUpdate()
    {
        // 给前面两个*添加转弯驱动力
        // Input.GetAxisRaw("Horizontal") * 30f 表示*的最大旋转角度为30度
        wheel_Forword_Left.steerAngle = Input.GetAxisRaw("Horizontal") * 30f;
        wheel_Forword_Right.steerAngle = Input.GetAxisRaw("Horizontal") * 30f;
        // 给前面两个*添加前进驱动力
        wheel_Forword_Left.motorTorque = Input.GetAxisRaw("Vertical") * 10f;
        wheel_Forword_Right.motorTorque = Input.GetAxisRaw("Vertical") * 10f;

        // 车轮转动(不能写成wheelModel_Forword_Left.right,车轮的旋转方向会不确定)
        wheelModel_Forword_Left.Rotate(wheel_Forword_Left.rpm * 6 * Time.deltaTime * wheel_Forword_Left.transform.right, Space.World);
        wheelModel_Forword_Right.Rotate(wheel_Forword_Right.rpm * 6 * Time.deltaTime * wheel_Forword_Right.transform.right, Space.World);
        wheelModel_Back_Left.Rotate(wheel_Back_Left.rpm * 6 * Time.deltaTime * wheel_Back_Left.transform.right, Space.World);
        wheelModel_Back_Right.Rotate(wheel_Back_Right.rpm * 6 * Time.deltaTime * wheel_Back_Right.transform.right, Space.World);
        // 车轮转弯
        wheel_Forword_Left.transform.localEulerAngles = new Vector3(0, Input.GetAxisRaw("Horizontal") * 30f, 0);
        wheel_Forword_Right.transform.localEulerAngles = new Vector3(0, Input.GetAxisRaw("Horizontal") * 30f, 0);

        // 刹车
        if (Input.GetKeyDown(KeyCode.Space))
        {
            wheel_Forword_Left.brakeTorque = 100;
            wheel_Forword_Right.brakeTorque = 100;
            wheel_Back_Left.brakeTorque = 100;
            wheel_Back_Right.brakeTorque = 100;
        }else if (Input.GetKeyUp(KeyCode.Space))
        {
            wheel_Forword_Left.brakeTorque = 0;
            wheel_Forword_Right.brakeTorque = 0;
            wheel_Back_Left.brakeTorque = 0;
            wheel_Back_Right.brakeTorque = 0;
        }
    }
}

实例工程参考

基于Unity 2018.4.11f1(点击下载

 

上一篇:Unity3D 制作游戏主玩家Player 1 (上)


下一篇:label标签的用法