111 lines
3.5 KiB
C#
111 lines
3.5 KiB
C#
using UnityEngine;
|
|
|
|
namespace Animators.Leonid_Animator.Player
|
|
{
|
|
[RequireComponent(
|
|
typeof(Rigidbody),
|
|
typeof(InputHandler),
|
|
typeof(AnimatorHandler))]
|
|
public class CharacterLocomotion : MonoBehaviour
|
|
{
|
|
private Transform _cameraObject;
|
|
private InputHandler _inputHandler;
|
|
private Vector3 _moveDirection;
|
|
|
|
[HideInInspector] public Transform myTransform;
|
|
[HideInInspector] public AnimatorHandler myAnimatorHandler;
|
|
|
|
public Rigidbody myRigidbody;
|
|
[SerializeField] public float jumpForce;
|
|
|
|
[Header("Stats")]
|
|
[SerializeField] private float movementSpeed = 25;
|
|
[SerializeField] private float rotationSpeed = 10;
|
|
|
|
|
|
private void Awake()
|
|
{
|
|
myRigidbody = GetComponent<Rigidbody>();
|
|
_inputHandler = GetComponent<InputHandler>();
|
|
myAnimatorHandler = GetComponent<AnimatorHandler>();
|
|
}
|
|
|
|
private void Start()
|
|
{
|
|
_cameraObject = Camera.main.transform;
|
|
myTransform = transform;
|
|
myAnimatorHandler.Initialize();
|
|
}
|
|
|
|
private void Update()
|
|
{
|
|
var deltaTime = Time.unscaledDeltaTime;
|
|
_inputHandler.TickInput(deltaTime);
|
|
_moveDirection = _cameraObject.forward * _inputHandler.vertical
|
|
+ _cameraObject.right * _inputHandler.horizontal;
|
|
_moveDirection.Normalize();
|
|
_moveDirection *= movementSpeed;
|
|
_moveDirection.y = 0;
|
|
|
|
var projectedVelocity = Vector3.ProjectOnPlane(_moveDirection, _normalVector);
|
|
myRigidbody.velocity = projectedVelocity;
|
|
|
|
if (myAnimatorHandler.canRotate)
|
|
{
|
|
HandleRotation(deltaTime);
|
|
}
|
|
|
|
myAnimatorHandler.UpdateAnimatorValues(
|
|
_inputHandler.moveAmount,
|
|
0,
|
|
_inputHandler.jumpPressed,
|
|
_inputHandler.crouchPressed,
|
|
_inputHandler.firePressed);
|
|
|
|
var velocity = myRigidbody.velocity;
|
|
myRigidbody.AddForce(_inputHandler.jumpPressed ?
|
|
new Vector3(0, jumpForce, 0)
|
|
: new Vector3(velocity.x*200, -50, velocity.z * 200));
|
|
}
|
|
|
|
private void LateUpdate()
|
|
{
|
|
_inputHandler.jumpPressed = false;
|
|
_inputHandler.crouchPressed = false;
|
|
}
|
|
|
|
public Vector3 GetMeshCenter()
|
|
{
|
|
if (myAnimatorHandler.isCrouching)
|
|
return transform.position + 1f * Vector3.up;
|
|
else
|
|
{
|
|
return transform.position + 2f * Vector3.up;
|
|
}
|
|
}
|
|
|
|
#region Movement
|
|
|
|
private Vector3 _normalVector;
|
|
private Vector3 _targetPosition;
|
|
|
|
private void HandleRotation(float delta)
|
|
{
|
|
if (Mathf.Abs(_inputHandler.horizontal) + Mathf.Abs(_inputHandler.vertical) < 0.1)
|
|
return;
|
|
|
|
var targetDir = _cameraObject.forward * _inputHandler.vertical
|
|
+ _cameraObject.right * _inputHandler.horizontal;
|
|
targetDir.Normalize();
|
|
targetDir.y = 0;
|
|
if (targetDir == Vector3.zero)
|
|
targetDir = myTransform.forward;
|
|
|
|
var rotation = Quaternion.LookRotation(targetDir);
|
|
var targetRotation = Quaternion.Slerp(myTransform.rotation, rotation, rotationSpeed * delta);
|
|
myTransform.rotation = targetRotation;
|
|
}
|
|
|
|
#endregion
|
|
}
|
|
} |