2021-02-02 15:24:03 -08:00
|
|
|
using UnityEngine;
|
|
|
|
using UnityEngine.InputSystem;
|
|
|
|
|
|
|
|
[RequireComponent(typeof(Rigidbody2D))]
|
|
|
|
public class CarLogic : MonoBehaviour
|
|
|
|
{
|
2021-02-15 18:30:42 -08:00
|
|
|
public InputAction steeringAction;
|
|
|
|
public InputAction accelerationAction;
|
|
|
|
public InputAction brakeAction;
|
2021-02-02 15:24:03 -08:00
|
|
|
|
2021-02-15 18:30:42 -08:00
|
|
|
public float accelerationAmount = 10;
|
|
|
|
[Tooltip("In degrees")]
|
|
|
|
public float steeringAnglePerSecond = 10;
|
2021-02-02 15:24:03 -08:00
|
|
|
|
2021-02-15 18:30:42 -08:00
|
|
|
public float maxAcceleration = 100;
|
2021-02-19 11:29:23 -08:00
|
|
|
public float brakingAmount;
|
2023-04-23 18:55:55 -07:00
|
|
|
public float wheelAccelerationFactor = 6.0f;
|
2021-02-02 15:24:03 -08:00
|
|
|
|
2021-02-15 18:30:42 -08:00
|
|
|
private Rigidbody2D _rigidbody;
|
|
|
|
private Transform _transform;
|
|
|
|
private float _currentAcceleration;
|
2023-04-23 18:55:55 -07:00
|
|
|
private int _wheelOnRoadCount = 0;
|
|
|
|
private float _maxAcceleration;
|
|
|
|
private float _wheelAccelerationOffset;
|
2021-02-02 15:24:03 -08:00
|
|
|
|
2021-02-19 11:29:23 -08:00
|
|
|
public float CurrentAccelerationRatio()
|
|
|
|
{
|
|
|
|
return _currentAcceleration / maxAcceleration;
|
|
|
|
}
|
|
|
|
|
2021-02-15 18:30:42 -08:00
|
|
|
private void Awake()
|
|
|
|
{
|
|
|
|
_rigidbody = GetComponent<Rigidbody2D>();
|
|
|
|
_transform = transform;
|
2023-04-23 18:55:55 -07:00
|
|
|
_maxAcceleration = maxAcceleration;
|
|
|
|
_wheelAccelerationOffset = wheelAccelerationFactor - 4;
|
2021-02-15 18:30:42 -08:00
|
|
|
}
|
2021-02-02 15:24:03 -08:00
|
|
|
|
2023-04-23 18:55:55 -07:00
|
|
|
private void OnEnable()
|
2021-02-15 18:30:42 -08:00
|
|
|
{
|
|
|
|
steeringAction.Enable();
|
|
|
|
accelerationAction.Enable();
|
|
|
|
brakeAction.Enable();
|
2021-02-19 11:29:23 -08:00
|
|
|
|
|
|
|
var wheels = GetComponentsInChildren<Wheel>();
|
|
|
|
foreach (var wheel in wheels)
|
|
|
|
{
|
|
|
|
wheel.wheelOffRoad = WheelOffRoad;
|
|
|
|
wheel.wheelOnRoad = WheelOnRoad;
|
|
|
|
}
|
|
|
|
|
2023-04-23 18:55:55 -07:00
|
|
|
_wheelOnRoadCount = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
private void OnDisable()
|
|
|
|
{
|
|
|
|
steeringAction.Disable();
|
|
|
|
accelerationAction.Disable();
|
|
|
|
brakeAction.Disable();
|
2021-02-19 11:29:23 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
private void WheelOffRoad()
|
|
|
|
{
|
2023-04-23 18:55:55 -07:00
|
|
|
_wheelOnRoadCount--;
|
|
|
|
_maxAcceleration = ((_wheelOnRoadCount + _wheelAccelerationOffset) / wheelAccelerationFactor) * maxAcceleration;
|
2021-02-19 11:29:23 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
private void WheelOnRoad()
|
|
|
|
{
|
2023-04-23 18:55:55 -07:00
|
|
|
_wheelOnRoadCount++;
|
|
|
|
_maxAcceleration = ((_wheelOnRoadCount + _wheelAccelerationOffset) / wheelAccelerationFactor) * maxAcceleration;
|
2021-02-15 18:30:42 -08:00
|
|
|
}
|
2021-02-02 15:24:03 -08:00
|
|
|
|
2021-02-15 18:30:42 -08:00
|
|
|
private void Update()
|
|
|
|
{
|
|
|
|
var steeringValue = steeringAction.ReadValue<float>();
|
|
|
|
var accelerationValue = accelerationAction.ReadValue<float>();
|
|
|
|
var brakeValue = brakeAction.ReadValue<float>();
|
2023-04-01 22:33:01 -07:00
|
|
|
|
2021-02-15 18:30:42 -08:00
|
|
|
if (accelerationValue <= 0)
|
|
|
|
{
|
|
|
|
_currentAcceleration -= _rigidbody.drag * Time.deltaTime;
|
|
|
|
}
|
2021-02-02 15:24:03 -08:00
|
|
|
|
2021-02-15 18:30:42 -08:00
|
|
|
_currentAcceleration += accelerationValue * accelerationAmount * Time.deltaTime;
|
2021-02-19 11:29:23 -08:00
|
|
|
|
|
|
|
_currentAcceleration -= brakeValue * brakingAmount * Time.deltaTime;
|
2021-02-02 15:24:03 -08:00
|
|
|
|
2021-02-15 18:30:42 -08:00
|
|
|
// TODO: reverse logic.
|
2023-04-23 18:55:55 -07:00
|
|
|
_currentAcceleration = Mathf.Clamp(_currentAcceleration, 0, _maxAcceleration);
|
2021-02-19 11:29:23 -08:00
|
|
|
|
|
|
|
if (_currentAcceleration > 0.01)
|
2021-02-15 18:30:42 -08:00
|
|
|
{
|
2021-02-19 11:29:23 -08:00
|
|
|
var newAngle = steeringValue * steeringAnglePerSecond * Time.deltaTime;
|
|
|
|
_transform.Rotate(Vector3.forward, newAngle, Space.World);
|
2021-02-15 18:30:42 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
_rigidbody.velocity = _transform.up * _currentAcceleration;
|
|
|
|
}
|
2021-02-19 11:29:23 -08:00
|
|
|
}
|