using UnityEngine; using System; using System.Collections.Generic; using Code.Example.Race.Racer.AI; namespace Code.Example.Race.Racer.Player { public class PlayerCarControllerRB : MonoBehaviour { public enum ControlMode { Keyboard, Buttons }; public enum Axel { Front, Rear } [Serializable] public struct Wheel { public GameObject wheelModel; public WheelCollider wheelCollider; public GameObject wheelEffectObj; public ParticleSystem smokeParticle; public Axel axel; } public ControlMode control; // public float maxAcceleration = 30.0f; // public float brakeAcceleration = 50.0f; // // public float turnSensitivity = 1.0f; // public float maxSteerAngle = 30.0f; public Vector3 _centerOfMass; public List wheels; // float moveInput; // float steerInput; private Rigidbody carRb; [SerializeField] private PlayerCarInput _playerCarInput; [SerializeField] private PlayerRacer _playerRacer; // private CarLights carLights; void Start() { carRb = GetComponent(); carRb.centerOfMass = _centerOfMass; // carLights = GetComponent(); } void Update() { // GetInputs(); AnimateWheels(); // WheelEffects(); } void FixedUpdate() { Move(); Steer(); Brake(); } // public void MoveInput(float input) // { // moveInput = input; // } // // public void SteerInput(float input) // { // steerInput = input; // } void GetInputs() { // if (control == ControlMode.Keyboard) // { // moveInput = Input.GetAxis("Vertical"); // steerInput = Input.GetAxis("Horizontal"); // } } void Move() { foreach (var wheel in wheels) { wheel.wheelCollider.motorTorque = _playerCarInput.MovementInput.y * 600 * _playerRacer.Data.maxAcceleration * Time.fixedDeltaTime; } } void Steer() { foreach (var wheel in wheels) { if (wheel.axel != Axel.Front) continue; var _steerAngle = _playerCarInput.MovementInput.x * _playerRacer.Data.turnSensitivity * _playerRacer.Data.maxSteerAngle; wheel.wheelCollider.steerAngle = _steerAngle; // wheel.wheelCollider.steerAngle = Mathf.Lerp(wheel.wheelCollider.steerAngle, _steerAngle, 0.6f); } } void Brake() { if (_playerCarInput.Brake || _playerCarInput.MovementInput.y == 0) { foreach (var wheel in wheels) { wheel.wheelCollider.brakeTorque = 300 * _playerRacer.Data.brakeAcceleration * Time.fixedDeltaTime; } // carLights.isBackLightOn = true; // carLights.OperateBackLights(); } else { foreach (var wheel in wheels) { wheel.wheelCollider.brakeTorque = 0; } // carLights.isBackLightOn = false; // carLights.OperateBackLights(); } } void AnimateWheels() { foreach (var wheel in wheels) { Quaternion rot; Vector3 pos; wheel.wheelCollider.GetWorldPose(out pos, out rot); wheel.wheelModel.transform.position = pos; wheel.wheelModel.transform.rotation = rot; } } void WheelEffects() { foreach (var wheel in wheels) { //var dirtParticleMainSettings = wheel.smokeParticle.main; if (wheel.axel == Axel.Rear && wheel.wheelCollider.isGrounded && carRb.linearVelocity.magnitude >= 10.0f) { // wheel.wheelEffectObj.GetComponentInChildren().emitting = true; // wheel.smokeParticle.Emit(1); } else { // wheel.wheelEffectObj.GetComponentInChildren().emitting = false; } } } } }