在 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;
}
}
}
}
}
最终输出