unity官方资源包CarController理解

在汽车控制的实现中,相比人物控制遇到更多挑战。本文作者在尝试自行编写汽车控制脚本遭遇困难后,转向学习Unity的官方资源包CarController。通过研究和参考网络教程,作者对CarController有了深入理解,并在此分享学习心得,方便自己和他人查阅。

    最近要写汽车的控制,发现比人物控制难很多,涉及到汽车的很多知识,自己写了一点不忍直视,各种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; } //加速输入

        // Use this for initialization
        //初始化
      
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值