最近要写汽车的控制,发现比人物控制难很多,涉及到汽车的很多知识,自己写了一点不忍直视,各种bug,然后被告知untiy官方资源包里有控制脚本,就去学习了一下,然后借鉴了网上的一些教程,在这里表示衷心感谢,为了方面自己和他人,免得自己弄丢,然后贴在这里:
using System;
using UnityEngine;
namespace UnityStandardAssets.Vehicles.Car//此处可改成自己的car名字
{
internal enum CarDriveType
{
FrontWheelDrive,//前驱
RearWheelDrive,//后驱
FourWheelDrive//四驱
}
internal enum SpeedType
{
MPH,//英里
KPH//千米/h
}
public class CarController : MonoBehaviour
{
//[SerializeField]是为了成员变量可以在检视面板上显示
[SerializeField] private CarDriveType m_CarDriveType = CarDriveType.FourWheelDrive; //四驱
[SerializeField] private WheelCollider[] m_WheelColliders = new WheelCollider[4]; //存放轮子的数组
[SerializeField] private GameObject[] m_WheelMeshes = new GameObject[4]; //车轮模型
[SerializeField] private WheelEffects[] m_WheelEffects = new WheelEffects[4];//存放特效数组,粒子,音效等
[SerializeField] private Vector3 m_CentreOfMassOffset;//车的重心
[SerializeField] private float m_MaximumSteerAngle;//最大可转角度
[Range(0, 1)] [SerializeField] private float m_SteerHelper; // 0 is raw physics , 1 the car will grip in the direction it is facing//初始化为0,1是车被控制面对的方向
[Range(0, 1)] [SerializeField] private float m_TractionControl; // 0 is no traction control, 1 is full interference///0没有牵引力控制系统,1是完整的干扰
//所有车轮的扭矩 扭矩越大,加速性能越好;扭矩越小,加速性能越差
//如某车的1挡齿比(齿轮的齿数比,本质就是齿轮的半径比)是3,尾牙为4,轮胎半径为0.3米,原扭矩是200Nm的话,最后在轮轴的扭矩就变成200×3×4=2400Nm,
//再除以轮胎半径0.3米后,轮胎与地面摩擦的部分就有2400Nm/0.3m=8000N,即800公斤力的驱动力,这就足以驱动汽车了
//驱动力公式:驱动力=扭矩×变速箱齿比×主减速器速比×机械效率÷轮胎半径
[SerializeField] private float m_FullTorqueOverAllWheels;//所有轮胎的扭矩
[SerializeField] private float m_ReverseTorque;//反向扭矩
[SerializeField] private float m_MaxHandbrakeTorque;//最大刹车扭矩
[SerializeField] private float m_Downforce = 100f;//下压力
[SerializeField] private SpeedType m_SpeedType;//速度类型
[SerializeField] private float m_Topspeed = 200;//最大速度
[SerializeField] private static int NoOfGears = 5;//档位数
[SerializeField] private float m_RevRangeBoundary = 1f;//最大滑动距离
[SerializeField] private float m_SlipLimit;//轮胎下滑给定的阈值
[SerializeField] private float m_BrakeTorque;//刹车扭矩
private Quaternion[] m_WheelMeshLocalRotations;//四元数组存储车轮本地转动数据
private Vector3 m_Prevpos, m_Pos;
private float m_SteerAngle; //转向角
private int m_GearNum;//档位数
private float m_GearFactor;//挡位因子
private float m_OldRotation;//用于转动计算
private float m_CurrentTorque;//当前扭矩
private Rigidbody m_Rigidbody;//刚体
private const float k_ReversingThreshold = 0.01f; //反转阈值
//角色信息访问控制,对外接口
public bool Skidding { get; private set; }
public float BrakeInput { get; private set; }
public float CurrentSteerAngle{ get { return m_SteerAngle; }}//当前车轮角度
public float CurrentSpeed{ get { return m_Rigidbody.velocity.magnitude*2.23693629f; }}//当前速度
public float MaxSpeed{get { return m_Topspeed; }}//最大速度
public float Revs { get; private set; }//转速属性
public float AccelInput { get; private set; } //加速输入