Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using Sirenix.OdinInspector;
- using UnityEngine;
- namespace Code.Csharp.Systems.CharacterSystems.MovebleSystems
- {
- public class WalkController : BaseMoveblePart
- {
- [SerializeField] private float _speed;
- [SerializeField] private float _runSpeed;
- [SerializeField] private float _minMagnitudeForActivatedBreke;
- [SerializeField] private CurveData _curveForce;
- [SerializeField] private CurveData _curveForceForRun;
- [SerializeField] private CurveData _curveBrake;
- [ShowInInspector] private StateWalkController _currentStateController;
- [ShowInInspector, Sirenix.OdinInspector.ReadOnly] private bool _isRun;
- [ShowInInspector, Sirenix.OdinInspector.ReadOnly] private Vector2Int _lastInput;
- [ShowInInspector, Sirenix.OdinInspector.ReadOnly] private Vector2Int _currentInput;
- [ShowInInspector, Sirenix.OdinInspector.ReadOnly] private Vector3 _lastVelocity;
- private Rigidbody _rb;
- private void Start() => _rb = MovebleFacade.Get<RootRigidbodyContainer>().Rigidbody;
- private void Update() => _currentStateController?.Update();
- private void FixedUpdate()
- {
- if (_currentStateController == null) return;
- if(!_currentStateController.IsActive()) return;
- var input = _currentStateController.GetInput();
- _lastVelocity = (_rb.transform.forward * input.y + _rb.transform.right * input.x) * _currentStateController.GetSpeed();
- _rb.velocity = _lastVelocity;
- }
- [Button]
- public void SetInput(Vector2Int input)
- {
- input.x = Mathf.Clamp(input.x, -1, 1);
- input.y = Mathf.Clamp(input.y, -1, 1);
- if(_currentInput.x==input.x && _currentInput.y == input.y) return;
- _lastInput = _currentInput;
- _currentInput = input;
- ChangeState();
- }
- [Button]
- public void SetRun(bool newState)
- {
- if (_isRun == newState) return;
- _isRun = newState;
- ChangeState();
- }
- private void ChangeState()
- {
- float duration = _currentStateController != null ? _currentStateController.GetLastDuration() : 0;
- if (_currentInput.magnitude > 0)
- {
- if (_isRun) _currentStateController = new AccelerationState(_curveForceForRun, _currentInput, _runSpeed, duration);
- else _currentStateController = new AccelerationState(_curveForce, _currentInput, _speed, duration);
- }
- else
- {
- float lastSpeed = _currentStateController != null ? _currentStateController.GetSpeed() : 0;
- if(_lastVelocity.magnitude>= _minMagnitudeForActivatedBreke)
- _currentStateController = new BrakeState(_curveBrake, _lastInput, duration, lastSpeed);
- else
- _currentStateController = new BrakeState(_curveBrake, _lastInput, 0, 0);
- }
- }
- [System.Serializable]
- public class CurveData
- {
- public float Duration;
- public AnimationCurve CurveConvertTimeToValue;
- }
- public abstract class StateWalkController
- {
- public abstract void Update();
- [Button] public abstract float GetSpeed();
- public abstract float GetLastDuration();
- public abstract Vector2Int GetInput();
- public abstract bool IsActive();
- }
- public class AccelerationState : StateWalkController
- {
- [ShowInInspector] private CurveData _curve;
- [ShowInInspector] private Vector2Int _input;
- [ShowInInspector] private float _targetSpeed;
- [ShowInInspector] private float _currentDuration;
- public AccelerationState(CurveData curve, Vector2Int input, float speed, float currentDuration)
- {
- _curve = curve;
- _input = input;
- _targetSpeed = speed;
- _currentDuration = currentDuration;
- }
- public override void Update()
- => _currentDuration = Mathf.Clamp(_currentDuration + Time.deltaTime, 0, _curve.Duration);
- public override float GetSpeed()
- => _curve.CurveConvertTimeToValue.Evaluate(_currentDuration / _curve.Duration) * _targetSpeed;
- public override float GetLastDuration() => _currentDuration;
- public override Vector2Int GetInput() => _input;
- public override bool IsActive() => true;
- }
- }
- internal class BrakeState : WalkController.StateWalkController
- {
- [ShowInInspector] private float _currentDuration;
- [ShowInInspector] private float _durationStart;
- [ShowInInspector] private WalkController.CurveData _curve;
- [ShowInInspector] private Vector2Int _input;
- [ShowInInspector] private float _startedSpeed;
- public BrakeState(WalkController.CurveData curveBrake, Vector2Int lastInput, float duration, float startedSpeed)
- {
- _curve = curveBrake;
- _input = lastInput;
- _durationStart = _currentDuration = duration;
- _startedSpeed = startedSpeed;
- }
- public override void Update()
- {
- _currentDuration -= Time.deltaTime;
- if (_currentDuration < 0) _currentDuration = 0;
- }
- public override float GetSpeed()
- {
- float normalDuration = 1-(_currentDuration / _durationStart);
- return _curve.CurveConvertTimeToValue.Evaluate(normalDuration) * _startedSpeed;
- }
- public override float GetLastDuration() => _currentDuration;
- public override Vector2Int GetInput() => _input;
- public override bool IsActive() => _currentDuration > 0;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement