在 Unity 中创立轿车控制器不同于常规[人物控制器]。在移动人物时,咱们测验移动整个身体并为人物增加动画,使其看起来像在移动。可是在轿车的情况下,咱们运用车轮磕碰体物理来移动轿车并在此基础上更新车轮旋转。这听起来或许很杂乱,但现实并非如此。创立榜首个 Unity 轿车控制器后,您就会了解它。

我在本教程中运用 Unity 2021.3.11。可是,在 Unity 中的车轮磕碰体物理方面并没有太大改变。因此,无论您运用的是哪个版别的 Unity,本教程都应该很好。

准备好场景

创立轿车控制器的榜首件事是轿车。因此,假如您没有,能够从 Unity 资源商店下载轿车。

出于本教程的意图,我正在运用资源商店中的[卡通低聚城市包精简]版免费资源。我将从资源中加载演示场景。

这取决于您运用的资源,但请保证轿车的车轮能够与车身分隔旋转。

【Unity】如何使用滚轮碰撞器创建一个汽车控制器

准备好轿车

这是创立轿车控制器时非常重要的步骤。您不能只是为一切车轮增加车轮磕碰器并开始旋转它们。Unity 要求您遵循特定标准来定义车轮和车轮磕碰体在网格内的摆放方式。

主母车应附有[刚体组件]。将质量设置为 1500,这将充当轿车的重量。

Unity 要求您在父游戏目标内摆放一切车轮,将一切滚轮磕碰体摆放在单独的父游戏目标中。看看下面的图片,看看轿车预制件是如何重新摆放的。

【Unity】如何使用滚轮碰撞器创建一个汽车控制器

车轮和车轮磕碰器的方位应相同。也就是说,假如Wheel_01在 0,0,0,那么Wheel_Collider_01也应该在 0,0,0。车轮磕碰体游戏目标应仅附加一个变换和一个车轮磕碰体组件。此外,车轮上不该有其他磕碰器。

此步骤不是必需的,但假如您没有正确定位它们,您的轿车看起来不会像在车轮上移动。

车轮磕碰体不行见

在最后一步之后,您应该看到车轮周围的车轮磕碰器。假如没有,请查看以下内容。

  1. 您是否将刚体增加到父车游戏目标。(保证您没有将刚体增加到身体部位)
  2. 在场景视图中启用车轮磕碰辅助图标。

增加车轮磕碰体后轿车主动摇晃或跳动

假如你的轿车是主动跳来跳去的,那是由于车轮磕碰体和车身网格对撞机之间的相互作用。将网格磕碰体更换为箱形磕碰体,并保证箱形磕碰体不与车轮磕碰体相交。

还要查看您的任何车轮或其他轿车零件是否连接了其他磕碰器。

【Unity】如何使用滚轮碰撞器创建一个汽车控制器

轿车控制器脚本

现在咱们都准备好开车了。是时候准备好驾驭脚本了。在咱们深入研究编码部分之前,您需求了解运用车轮磕碰体驾驭的一些基础知识。

电机转矩

电机扭矩能够应用于单个车轮磕碰器,以向前或向后移动车轮。它以 Nm 为单位,您需求依据作用在轿车上的质量和摩擦力施加扭矩。

转向角

这是车轮需求旋转以滚动轿车的视点。您能够将转向视点设置为您希望轿车转向的视点。请记住将此值固定为最大值,否则或许会发生一些不需求的结果。

制动扭矩

能够施加反向电机扭矩来中止轿车,但花费的时间更长,轿车中止的速度比预期的要慢。为了实现瞬间制动,咱们能够施加较大的制动力

咱们将在玩家操作左右箭头键时设置转向视点,当玩家操作向上和向下箭头键时,咱们将设置电机马达。咱们将转向角和电机扭矩设置为仅前轮。

咱们将运用固定更新,由于它都是物理更新。

using UnityEngine;
public class car_controller : MonoBehaviour
{
    public WheelCollider[] wheel_col;
    public Transform[] wheels;
    float torque=100;
    float angle=45;
    void Update()
    {
        for(int i=0;i<wheel_col.Length;i++)
        {
            wheel_col[i].motorTorque=Input.GetAxis("Vertical")*torque;
            if(i==0||i==2)
            {
                wheel_col[i].steerAngle=Input.GetAxis("Horizontal")*angle;
            }
            var pos=transform.position;
            var rot=transform.rotation;
            wheel_col[i].GetWorldPose(out pos,out rot);
            wheels[i].position=pos;
            wheels[i].rotation=rot;
        }
        if(Input.anyKeyDown) 
        {
            if(Input.GetKeyDown(KeyCode.Space))
            {
                foreach(var i in wheel_col)
                {
                    i.brakeTorque=2000;
                }
            }
            else{   //reset the brake torque when another key is pressed
                foreach(var i in wheel_col)
                {
                    i.brakeTorque=0;
                }
            }
        }
    }
}

最终输出

【Unity】如何使用滚轮碰撞器创建一个汽车控制器