using System; using UnityEngine; public class Player : MonoBehaviour { [Header("Setup")] [SerializeField] private InputManager _inputManager; [SerializeField] private GameObject _cameraGameObject; [SerializeField] private Animator _animator; [Header("Camera Options")] [SerializeField] private Vector3 camOffset; [SerializeField] private float cameraFollowSpeed = 2.5f; [Header("Player Options")] [Range(0f, 10f)] [SerializeField] private float moveSpeed = 6.5f; [Range(0f, 100f)] [SerializeField] private float animationSpeed = 10f; [Header("Enemy Snapping")] [SerializeField] private float minAimDistance; [SerializeField] private float maxAimDistance; [SerializeField] private Canvas aimCanvas; [Header("Dash")] [Range(0f, 100f)] public float dashSpeed = 7f; [Range(0f, 1f)] public float dashTime = 0.2f; [Range(0f, 4f)] public float dashCooldownTime = 1f; [SerializeField] public TrailRenderer dashTrail; [Header("Attacking")] [Range(0f, 10f)] [SerializeField] private float attackMoveSpeed = 2f; [SerializeField] private LayerMask _enemyLayer; [SerializeField] private Collider _hurtBox; [SerializeField] private float _basedamage; [SerializeField] private string[] _availableAttacks; private Camera _camera; private CharacterController _controller; private Animate _animate; private PlayerMove _playerMove; private PlayerRotate _playerRotate; private PlayerAimRotate _playerAimRotate; private PlayerAttack _playerAttack; private CameraMove _cameraMove; void Awake() { SetupGame(); } void SetupGame() { camOffset.z = camOffset.x; _camera = _cameraGameObject.GetComponent(); _controller = GetComponent(); _playerRotate = gameObject.AddComponent(); _playerAimRotate = gameObject.AddComponent(); _playerAimRotate.initialize(aimCanvas); _animate = _animator.gameObject.AddComponent(); _animate.initialize(_animator); _playerAttack = gameObject.AddComponent(); _playerAttack.initialize(_inputManager, _enemyLayer, _animate, _hurtBox, _availableAttacks); _playerMove = gameObject.AddComponent(); _playerMove.initialize(_controller, dashTrail); _cameraMove = gameObject.AddComponent(); _cameraMove.initialize(transform, camOffset, cameraFollowSpeed, _camera.transform); } void Update() { Vector3 moveInput = new Vector3(_inputManager.moveInput.x, 0f , _inputManager.moveInput.y); bool attacking = _playerAttack.Attack(); float movementSpeed = attacking ? attackMoveSpeed : moveSpeed; Vector3 aimTarget = _playerAimRotate.AimTarget(minAimDistance, maxAimDistance, _camera, _inputManager.aimInput); Vector3 moveDirection = _playerMove.GetMoveDirection(moveInput, _camera.transform) + _playerMove.Gravity(); Vector3 lookTarget = attacking ? aimTarget : _playerRotate.LookTarget(moveDirection); // if player is attacking look towards attack direction. _playerMove.Dash(dashTime, dashCooldownTime, dashSpeed, _inputManager.sprintPerformed, attacking); _playerMove.ApplyMovement(moveDirection, lookTarget, movementSpeed); _cameraMove.MoveCamera(); _playerAimRotate.ApplyRotation(aimTarget); _animate.AnimateState("Walk", moveInput.magnitude, animationSpeed); } }