C# 统一-方向盘与对撞机

C# 统一-方向盘与对撞机,c#,unity3d,wheelcollider,C#,Unity3d,Wheelcollider,我正在做一个公路赛车类游戏,我正在使用车轮对撞机进行汽车运动。然而,我想以这样一种方式驾驶汽车,即只要松开“a”或“D”键,汽车就会根据路径变直,而不是像典型的公路赛车游戏一样,基本上转向同一方向 当“A”和“D”键被释放时,我尝试通过将所有旋转轴值都旋转为0来实现相同的功能。然而,这似乎并不自然,因为我想逐渐将汽车从当前方向转向路径方向。此外,我的代码也会弄乱汽车的总体转向,使其无法按预期移动 这是我的代码:- using System.Collections; using System.Co

我正在做一个公路赛车类游戏,我正在使用车轮对撞机进行汽车运动。然而,我想以这样一种方式驾驶汽车,即只要松开“a”或“D”键,汽车就会根据路径变直,而不是像典型的公路赛车游戏一样,基本上转向同一方向

当“A”和“D”键被释放时,我尝试通过将所有旋转轴值都旋转为0来实现相同的功能。然而,这似乎并不自然,因为我想逐渐将汽车从当前方向转向路径方向。此外,我的代码也会弄乱汽车的总体转向,使其无法按预期移动

这是我的代码:-

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CarController : MonoBehaviour
{
    private float horizontalInput;
    private float currentSteerAngle;
    private float vel = 3f;

    [SerializeField] private float maxSteerAngle;

    [SerializeField] private WheelCollider frontLeftWheelCollider;
    [SerializeField] private WheelCollider frontRightWheelCollider;
    [SerializeField] private WheelCollider rearLeftWheelCollider;
    [SerializeField] private WheelCollider rearRightWheelCollider;

    [SerializeField] private Transform frontLeftWheelTransform;
    [SerializeField] private Transform frontRightWheelTransform;
    [SerializeField] private Transform rearLeftWheelTransform;
    [SerializeField] private Transform rearRightWheelTransform;

    private Rigidbody rb;
    private Transform tf;
    private ConstantForce cf;

    // Start is called before the first frame update
    void Start()
    {
        tf = GetComponent<Transform>();
        rb = GetComponent<Rigidbody>();
        cf = GetComponent<ConstantForce>();
    }

    // Update is called once per frame
    void Update()
    {
        GetInput();
        HandleSteering();
        CheckRotation();
        UpdateWheels();
    }

    private void GetInput()
    {
        horizontalInput = Input.GetAxis("Horizontal");
        if (!(Input.GetKey(KeyCode.A) || Input.GetKey(KeyCode.D)))
            StraightenCar();
    }

    private void HandleSteering()
    {
        currentSteerAngle = maxSteerAngle * horizontalInput * vel;
        frontLeftWheelCollider.steerAngle = currentSteerAngle;
        frontRightWheelCollider.steerAngle = currentSteerAngle;
    }

    private void UpdateWheels()
    {
        UpdateSingleWheel(frontLeftWheelCollider, frontLeftWheelTransform);
        UpdateSingleWheel(frontRightWheelCollider, frontLeftWheelTransform);
    }

    private void UpdateSingleWheel(WheelCollider wheelCollider, Transform wheelTransform)
    {
        Vector3 pos;
        Quaternion rot;
        wheelCollider.GetWorldPose(out pos, out rot);
        wheelTransform.rotation = rot;
        wheelTransform.position = pos;
    }

    private void CheckRotation()
    {
        var rotation = tf.eulerAngles;
        rotation.y = ClampAngle(rotation.y, -30, 30);
        tf.eulerAngles = rotation;
    }

    private float ClampAngle(float angle, float min, float max)
    {
        if (angle < 90 || angle > 270)
        {
            if (angle > 180) angle -= 360;
            if (max > 180) max -= 360;
            if (min > 180) min -= 360;
        }
        angle = Mathf.Clamp(angle, min, max);
        if (angle < 0) angle += 360;
        return angle;
    }

    private void StraightenCar()
    {
        Vector3 rotation = tf.eulerAngles;
        rotation.x = 0;
        rotation.y = 0;
        rotation.z = 0;
        tf.eulerAngles = rotation;
    }
}

使用系统集合;
使用System.Collections.Generic;
使用UnityEngine;
公共类CarController:单行为
{
私人浮动水平输入;
私人浮动角度;
私人浮动水平=3f;
[SerializeField]专用浮点maxSteerAngle;
[SerializeField]私人车轮对撞机前左轮对撞机;
[Field]私人车轮对撞机frontRightWheelCollider;
[Field]私人车轮对撞机后左轮对撞机;
[字段]私人车轮对撞机后右车轮对撞机;
[SerializeField]私有转换frontLeftWheelTransform;
[SerializeField]私有转换frontRightWheelTransform;
[SerializeField]私有转换和左轮转换;
[SerializeField]私有转换和右轮转换;
私人刚体;
私有转换tf;
私人恒力基金;
//在第一帧更新之前调用Start
void Start()
{
tf=GetComponent();
rb=GetComponent();
cf=GetComponent();
}
//每帧调用一次更新
无效更新()
{
GetInput();
手工操作();
检查旋转();
UpdateWheels();
}
私有void GetInput()
{
horizontalInput=Input.GetAxis(“水平”);
if(!(Input.GetKey(KeyCode.A)| Input.GetKey(KeyCode.D)))
拉直汽车();
}
私人空间手部设计()
{
currentSteerAngle=maxSteerAngle*水平输入*vel;
frontLeftWheelCollider.steerAngle=当前steerAngle;
frontRightWheelCollider.steerAngle=当前steerAngle;
}
私有void UpdateWheels()
{
更新SingleWheel(frontLeftWheelCollider,frontLeftWheelTransform);
更新SingleWheel(frontRightWheelCollider,frontLeftWheelTransform);
}
私有void更新单轮(WheelCollider WheelCollider,Transform wheelTransform)
{
向量3位;
四元数腐烂;
车轮对撞机。GetWorldPose(向外位置,向外旋转);
旋转=旋转;
wheelTransform.position=pos;
}
私有void CheckRotation()
{
变量旋转=tf.eulerAngles;
旋转y=夹紧(旋转y,-30,30);
tf.eulerAngles=旋转;
}
专用浮子抓斗(浮子角度、浮子最小值、浮子最大值)
{
如果(角度<90 | |角度>270)
{
如果(角度>180)角度-=360;
如果(最大值>180)最大值-=360;
如果(最小值>180)最小值-=360;
}
角度=主夹具(角度、最小值、最大值);
如果(角度<0)角度+=360;
返回角;
}
私家车
{
矢量3旋转=tf.eulerAngles;
旋转x=0;
旋转y=0;
旋转z=0;
tf.eulerAngles=旋转;
}
}
注:总而言之,我需要以下方面的帮助:-

(1) 向左或向右移动后,将汽车调直

(2) 使矫直过渡平稳

事先非常感谢。我真的很感激哪怕是最简短的回复