Untitled

 avatar
unknown
plain_text
2 years ago
4.4 kB
9
Indexable
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Cinemachine;
using Unity.Netcode;
using Unity.Netcode.Transports.UTP;

public class CarController : NetworkBehaviour
{



    private float currentSteerAngle;
    private float currentbreakForce;

    [SerializeField] private float motorForce;
    [SerializeField] private float breakForce;
    [SerializeField] private float maxSteerAngle;

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

    [SerializeField] private Transform frontLeftWheelTransform;
    [SerializeField] private Transform frontRightWheeTransform;
    [SerializeField] private Transform rearLeftWheelTransform;
    [SerializeField] private Transform rearRightWheelTransform;
    private Rigidbody rb;

    public override void OnNetworkSpawn()
    {
        base.OnNetworkSpawn();

        virtualCamera.enabled = IsOwner;

        GetComponent<Rigidbody>().centerOfMass = new Vector3(0f, -0.9f, 0f);
        rb = GetComponent<Rigidbody>();


    }
    PlayerControls playerControls;

    private void Start()
    {
        Application.targetFrameRate = 90;


        playerControls = new PlayerControls();

        playerControls.Enable();

        if (IsOwner)
        {
            GetComponent<Rigidbody>().isKinematic = false;
        }
    }
    GameplayMode mode;

    private void Update()
    {
        if (!IsOwner) return;

        float steeringInput = 0;

        if (Input.GetKeyDown(KeyCode.K))
        {
            transform.position = new Vector3(-148.526733f, 7.41411114f, 310.927612f);
            transform.rotation = Quaternion.identity;
            rb.velocity = Vector3.zero;
        }

        /*if (data.Accelerometer.x != 0)
        {
            steeringInput = data.Accelerometer.x;
        }
        else
        {
            steeringInput = data.MoveDirection.x;
        }*/

        steeringInput = playerControls.Athelete.Move.ReadValue<Vector2>().x;


        isBreaking = playerControls.Athelete.G.IsPressed();

        HandleMotor(playerControls.Athelete.Move.ReadValue<Vector2>().y);
        HandleSteering(steeringInput);
        UpdateWheels();

        if (rb.velocity.magnitude > 30)
        {
            rb.velocity = Vector3.ClampMagnitude(rb.velocity, 30);
        }

    }

    public bool isBreaking;

    private void HandleMotor(float verticalInput)
    {
        if(mode == null)
        {
            mode = FindObjectOfType<GameplayMode>();
        }

        if(mode != null)
        {
            verticalInput = mode.autoDrive.Value == true ? 1 : verticalInput;
        }

        frontLeftWheelCollider.motorTorque = verticalInput * motorForce;
        frontRightWheelCollider.motorTorque = verticalInput * motorForce;
        currentbreakForce = isBreaking ? breakForce : 0f;
        ApplyBreaking();
    }

    private void ApplyBreaking()
    {
        frontRightWheelCollider.brakeTorque = currentbreakForce;
        frontLeftWheelCollider.brakeTorque = currentbreakForce;
        rearLeftWheelCollider.brakeTorque = currentbreakForce;
        rearRightWheelCollider.brakeTorque = currentbreakForce;
    }

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

    private void UpdateWheels()
    {
        UpdateSingleWheel(frontLeftWheelCollider, frontLeftWheelTransform);
        UpdateSingleWheel(frontRightWheelCollider, frontRightWheeTransform);
        UpdateSingleWheel(rearRightWheelCollider, rearRightWheelTransform);
        UpdateSingleWheel(rearLeftWheelCollider, rearLeftWheelTransform);
    }

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

Editor is loading...