在 Unity 中创建汽车控制器不同于常规[角色控制器]。在移动角色时,我们尝试移动整个身体并为角色添加动画,使其看起来像在移动。但是在汽车的情况下,我们使用车轮碰撞体物理来移动汽车并在此基础上更新车轮旋转。这听起来可能很复杂,但事实并非如此。创建第一个 Unity 汽车控制器后,您就会理解它。
我在本教程中使用 Unity 2021.3.11。但是,在 Unity 中的车轮碰撞体物理方面并没有太大变化。因此,无论您使用的是哪个版本的 Unity,本教程都应该很好。
准备好场景
创建汽车控制器的第一件事是汽车。因此,如果您没有,可以从 Unity 资源商店下载汽车。
出于本教程的目的,我正在使用资源商店中的[卡通低聚城市包精简]版免费资源。我将从资源中加载演示场景。
这取决于您使用的资源,但请确保汽车的车轮可以与车身分开旋转。
准备好汽车
这是创建汽车控制器时非常重要的步骤。您不能只是为所有车轮添加车轮碰撞器并开始旋转它们。Unity 要求您遵循特定标准来定义车轮和车轮碰撞体在网格内的排列方式。
主母车应附有[刚体组件]。将质量设置为 1500,这将充当汽车的重量。
Unity 要求您在父游戏对象内排列所有车轮,将所有滚轮碰撞体排列在单独的父游戏对象中。看看下面的图片,看看汽车预制件是如何重新排列的。
车轮和车轮碰撞器的位置应相同。也就是说,如果Wheel_01在 0,0,0,那么Wheel_Collider_01也应该在 0,0,0。车轮碰撞体游戏对象应仅附加一个变换和一个车轮碰撞体组件。此外,车轮上不应有其他碰撞器。
此步骤不是必需的,但如果您没有正确定位它们,您的汽车看起来不会像在车轮上移动。
车轮碰撞体不可见
在最后一步之后,您应该看到车轮周围的车轮碰撞器。如果没有,请检查以下内容。
- 您是否将刚体添加到父车游戏对象。(确保您没有将刚体添加到身体部位)
- 在场景视图中启用车轮碰撞辅助图标。
添加车轮碰撞体后汽车自动摇晃或跳跃
如果你的汽车是自动跳来跳去的,那是因为车轮碰撞体和车身网格对撞机之间的相互作用。将网格碰撞体更换为箱形碰撞体,并确保箱形碰撞体不与车轮碰撞体相交。
还要检查您的任何车轮或其他汽车零件是否连接了其他碰撞器。
汽车控制器脚本
现在我们都准备好开车了。是时候准备好驾驶脚本了。在我们深入研究编码部分之前,您需要了解使用车轮碰撞体驾驶的一些基础知识。
电机转矩
电机扭矩可以应用于单个车轮碰撞器,以向前或向后移动车轮。它以 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;
}
}
}
}
}