Advertisement
MaoChessy

WalkController

Jun 20th, 2023
797
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 5.94 KB | Gaming | 0 0
  1. using Sirenix.OdinInspector;
  2. using UnityEngine;
  3.  
  4. namespace Code.Csharp.Systems.CharacterSystems.MovebleSystems
  5. {
  6.     public class WalkController : BaseMoveblePart
  7.     {
  8.         [SerializeField] private float _speed;
  9.         [SerializeField] private float _runSpeed;
  10.         [SerializeField] private float _minMagnitudeForActivatedBreke;
  11.         [SerializeField] private CurveData _curveForce;
  12.         [SerializeField] private CurveData _curveForceForRun;
  13.         [SerializeField] private CurveData _curveBrake;
  14.        
  15.         [ShowInInspector] private StateWalkController _currentStateController;
  16.         [ShowInInspector, Sirenix.OdinInspector.ReadOnly] private bool _isRun;
  17.         [ShowInInspector, Sirenix.OdinInspector.ReadOnly] private Vector2Int _lastInput;
  18.         [ShowInInspector, Sirenix.OdinInspector.ReadOnly] private Vector2Int _currentInput;
  19.         [ShowInInspector, Sirenix.OdinInspector.ReadOnly] private Vector3 _lastVelocity;
  20.        
  21.         private Rigidbody _rb;
  22.  
  23.         private void Start() => _rb = MovebleFacade.Get<RootRigidbodyContainer>().Rigidbody;
  24.  
  25.         private void Update() => _currentStateController?.Update();
  26.  
  27.         private void FixedUpdate()
  28.         {
  29.             if (_currentStateController == null) return;
  30.             if(!_currentStateController.IsActive()) return;
  31.             var input = _currentStateController.GetInput();
  32.             _lastVelocity = (_rb.transform.forward * input.y + _rb.transform.right * input.x) * _currentStateController.GetSpeed();
  33.             _rb.velocity = _lastVelocity;
  34.         }
  35.  
  36.         [Button]
  37.         public void SetInput(Vector2Int input)
  38.         {
  39.             input.x = Mathf.Clamp(input.x, -1, 1);
  40.             input.y = Mathf.Clamp(input.y, -1, 1);
  41.             if(_currentInput.x==input.x && _currentInput.y == input.y) return;
  42.             _lastInput = _currentInput;
  43.             _currentInput = input;
  44.             ChangeState();
  45.         }
  46.  
  47.         [Button]
  48.         public void SetRun(bool newState)
  49.         {
  50.             if (_isRun == newState) return;
  51.             _isRun = newState;
  52.             ChangeState();
  53.         }
  54.  
  55.         private void ChangeState()
  56.         {
  57.             float duration = _currentStateController != null ? _currentStateController.GetLastDuration() : 0;
  58.             if (_currentInput.magnitude > 0)
  59.             {
  60.                 if (_isRun) _currentStateController = new AccelerationState(_curveForceForRun, _currentInput, _runSpeed, duration);
  61.                 else _currentStateController = new AccelerationState(_curveForce, _currentInput, _speed, duration);
  62.             }
  63.             else
  64.             {
  65.                 float lastSpeed = _currentStateController != null ? _currentStateController.GetSpeed() : 0;
  66.                 if(_lastVelocity.magnitude>= _minMagnitudeForActivatedBreke)
  67.                     _currentStateController = new BrakeState(_curveBrake, _lastInput, duration, lastSpeed);
  68.                 else
  69.                     _currentStateController = new BrakeState(_curveBrake, _lastInput, 0, 0);
  70.             }
  71.         }
  72.        
  73.         [System.Serializable]
  74.         public class CurveData
  75.         {
  76.             public float Duration;
  77.             public AnimationCurve CurveConvertTimeToValue;
  78.         }
  79.  
  80.         public abstract class StateWalkController
  81.         {
  82.             public abstract void Update();
  83.             [Button] public abstract float GetSpeed();
  84.             public abstract float GetLastDuration();
  85.             public abstract Vector2Int GetInput();
  86.             public abstract bool IsActive();
  87.         }
  88.        
  89.         public class AccelerationState : StateWalkController
  90.         {
  91.             [ShowInInspector] private CurveData _curve;
  92.             [ShowInInspector] private Vector2Int _input;
  93.             [ShowInInspector] private float _targetSpeed;
  94.             [ShowInInspector] private float _currentDuration;
  95.  
  96.             public AccelerationState(CurveData curve, Vector2Int input, float speed, float currentDuration)
  97.             {
  98.                 _curve = curve;
  99.                 _input = input;
  100.                 _targetSpeed = speed;
  101.                 _currentDuration = currentDuration;
  102.             }
  103.  
  104.             public override void Update()
  105.                 => _currentDuration = Mathf.Clamp(_currentDuration + Time.deltaTime, 0, _curve.Duration);
  106.  
  107.             public override float GetSpeed()
  108.                 => _curve.CurveConvertTimeToValue.Evaluate(_currentDuration / _curve.Duration) * _targetSpeed;
  109.  
  110.             public override float GetLastDuration() => _currentDuration;
  111.             public override Vector2Int GetInput() => _input;
  112.             public override bool IsActive() => true;
  113.         }
  114.     }
  115.  
  116.     internal class BrakeState : WalkController.StateWalkController
  117.     {
  118.         [ShowInInspector] private float _currentDuration;
  119.         [ShowInInspector] private float _durationStart;
  120.         [ShowInInspector] private WalkController.CurveData _curve;
  121.         [ShowInInspector] private Vector2Int _input;
  122.         [ShowInInspector] private float _startedSpeed;
  123.  
  124.         public BrakeState(WalkController.CurveData curveBrake, Vector2Int lastInput, float duration, float startedSpeed)
  125.         {
  126.             _curve = curveBrake;
  127.             _input = lastInput;
  128.             _durationStart = _currentDuration = duration;
  129.             _startedSpeed = startedSpeed;
  130.         }
  131.  
  132.         public override void Update()
  133.         {
  134.             _currentDuration -= Time.deltaTime;
  135.             if (_currentDuration < 0) _currentDuration = 0;
  136.         }
  137.  
  138.         public override float GetSpeed()
  139.         {
  140.             float normalDuration = 1-(_currentDuration / _durationStart);
  141.             return _curve.CurveConvertTimeToValue.Evaluate(normalDuration) * _startedSpeed;
  142.         }
  143.  
  144.         public override float GetLastDuration() => _currentDuration;
  145.  
  146.         public override Vector2Int GetInput() => _input;
  147.  
  148.         public override bool IsActive() => _currentDuration > 0;
  149.     }
  150. }
  151.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement