UnityStandardAsset工程、源码分析_2_赛车游戏[玩家控制]_车辆核心控制

上一章地址:UnityStandardAsset工程、源码分析_1_赛车游戏[玩家控制]_输入系统

在上一章里,我们了解了整个车辆控制的大体流程,并且分析了一下输入系统,也就是从玩家的手柄\手机倾斜输入作用到车辆核心控制逻辑的过程中,调用了那些类,这些类又是怎样协同工作的。那么这章我们来分析车辆最主要的核心控制逻辑,车辆如何使用调整好的输入数据,根据当前车辆状态,计算出下一帧的车辆状态。

核心控制逻辑

上一章里,我们了解到,车辆核心状态的控制一共使用了三个类,分别为CarControllerCarUserControlCarAudio。其中,CarController是核心控制逻辑,CarUserControl是用户输入接口,负责调用CarController中的Move方法进行状态更新。CarController调用CarAudio和车辆轮胎效果控件来实现各种效果。

private void FixedUpdate()
{
   
   
    float h = CrossPlatformInputManager.GetAxis("Horizontal");	// 上章分析的内容
    float v = CrossPlatformInputManager.GetAxis("Vertical");

#if !MOBILE_INPUT
    float handbrake = CrossPlatformInputManager.GetAxis("Jump");
    m_Car.Move(h, v, v, handbrake);	// 这章重点分析的内容
#else
    m_Car.Move(h, v, v, 0f);
#endif
}

分析完了CarUserControl的内容,可以发现它每一帧都从输入类中读取数据,再使用这些数据调用CarControllerMove方法,我们这章就来分析CarController的最主要的方法Move,看看为了更新车辆状态,CarController都做了哪些工作。

先看Move的定义

public void Move(float steering, float accel, float footbrake, float handbrake);

steering是舵值,accel是加速值,footbrake脚刹,handbrake脚刹

函数首先调用了如下过程,用于同步Mesh与碰撞盒的转向状态:

// WheelCollider和轮胎的Mesh是两个东西
// 所以碰撞盒的Steer变化,也就是轮胎转向时,Mesh是不会发生转向的
// 所以需要再这里根据碰撞盒的转向数据重新设置Mesh的转向
// 使得外观上看起来轮胎旋转了一样
for (var i = 0; i < 4; i++)
{
   
   
    Quaternion quat;
    Vector3 position;
    m_WheelColliders[i].GetWorldPose(out position, out quat);   // 获取碰撞盒的世界坐标和世界转向
    m_WheelMeshes[i].transform.position = position; // 设置Mesh的转向和位置
    m_WheelMeshes[i].transform.rotation = quat;
}

再调用如下过程处理输入数据,使其符合规范:

// Steer直译为舵,也就是方向盘
// steering为[-1,1]上的值,而在WheelCollider上读取时需要将这个值映射到[-m_MaximumSteerAngle,m_MaximumSteerAngle]上
// 也就是以角度的形式来描述轮胎的转向程度,并且旋转的角度最大值为m_MaximumSteerAngle

// 在这里的一系列Clamp是在将输入数据调整到可接受的范围内
// clamp input values
steering = Mathf.Clamp(steering, -1, 1);    // 舵输入
AccelInput = accel = Mathf.Clamp(accel, 0, 1);  // 加速输入
BrakeInput = footbrake = -1*Mathf.Clamp(footbrake, -1, 0);  // 倒车输入
handbrake = Mathf.Clamp(handbrake, 0, 1);   // 手刹,暂时不知道输入来自哪里

根据输入的舵值让碰撞盒的舵值改变:

// 这里就是上面所说的将值[-1,1]映射到角度上
// Set the steer on the front wheels.
// Assuming that wheels 0 and 1 are the front wheels.
m_SteerAngle = steering*m_MaximumSteerAngle;
m_WheelColliders[0
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值