public class PlayerController : MonoBehaviour
{
[SerializeField] private Joystick _joystick;
private Rigidbody _rigidbody;
private Animator _animator;
private float _speedMove = 5f;
private float _gravityForce;
private Vector3 _moveVector;
private void Start()
{
_animator = GetComponent<Animator>();
_rigidbody = GetComponent<Rigidbody>();
}
private void FixedUpdate()
{
Movement();
Gravity();
}
private void Movement()
{
_moveVector = Vector3.zero;
_moveVector.x = _joystick.Horizontal * _speedMove;
_moveVector.z = _joystick.Vertical * _speedMove;
if (_moveVector.x != 0 || _moveVector.z != 0)
_animator.SetBool(StorageHashStrings.AnimatorParams.Move, true);
else
_animator.SetBool(StorageHashStrings.AnimatorParams.Move, false);
LookRotation();
_moveVector.y = _gravityForce;
_rigidbody.AddRelativeForce((transform.forward + _moveVector) * Time.deltaTime, ForceMode.Impulse);
}
private void LookRotation()
{
if(Vector3.Angle(Vector3.forward, _moveVector) > 1f || Vector3.Angle(Vector3.forward, _moveVector) == 0)
{
Vector3 direction = Vector3.RotateTowards(transform.forward, _moveVector, _speedMove, 0.0f);
transform.rotation = Quaternion.LookRotation(direction);
}
}
private void Gravity()
{
if (!IsGrounded())
_gravityForce -= 20f * Time.deltaTime;
else
_gravityForce = -1f;
}
private bool IsGrounded()
{
return Physics.Raycast(transform.position, Vector3.down,0.1f);
}
}