-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathPlayerMovement.cs
More file actions
122 lines (98 loc) · 3.39 KB
/
PlayerMovement.cs
File metadata and controls
122 lines (98 loc) · 3.39 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.InputSystem;
public class PlayerMovement : MonoBehaviour
{
private Player player;
private CharacterController characterController;
private PlayerControlls controls;
private Animator animator;
[Header("Movement info")]
[SerializeField] private float walkSpeed;
[SerializeField] private float runSpeed;
private float speed;
private Vector3 movementDirection;
private float verticalVelocity;
private bool isRunning;
[Header("Aim info")]
[SerializeField] private Transform aim;
[SerializeField] private LayerMask aimLayerMask;
private Vector3 lookingDirection;
private Vector2 moveInput;
private Vector2 aimInput;
private void Start()
{
player = GetComponent<Player>();
characterController = GetComponent<CharacterController>();
animator = GetComponentInChildren<Animator>();
speed = walkSpeed;
AssignInputEvents();
}
private void Update()
{
ApplyMovement();
AimTowardsMouse();
AnimatorControllers();
}
private void AnimatorControllers()
{
float xVelocity = Vector3.Dot(movementDirection, transform.right);
float zVelocity = Vector3.Dot(movementDirection, transform.forward);
animator.SetFloat("xVelocity", xVelocity, .1f, Time.deltaTime);
animator.SetFloat("zVelocity", zVelocity, .1f, Time.deltaTime);
bool playRunAnimation = isRunning && movementDirection.magnitude > 0;
animator.SetBool("isRunning", playRunAnimation);
}
private void AimTowardsMouse()
{
Ray ray = Camera.main.ScreenPointToRay(aimInput);
if (Physics.Raycast(ray, out var hitInfo, Mathf.Infinity, aimLayerMask))
{
lookingDirection = hitInfo.point - transform.position;
lookingDirection.y = 0;
lookingDirection.Normalize();
transform.forward = lookingDirection;
aim.position = new Vector3(hitInfo.point.x, transform.position.y + 1, hitInfo.point.z);
}
}
private void ApplyMovement()
{
movementDirection = new Vector3(moveInput.x, 0, moveInput.y);
ApplyGravity();
if (movementDirection.magnitude > 0)
{
characterController.Move(movementDirection * Time.deltaTime * speed);
}
}
private void ApplyGravity()
{
if (characterController.isGrounded == false)
{
verticalVelocity -= 9.81f * Time.deltaTime;
movementDirection.y = verticalVelocity;
} else
{
verticalVelocity = .5f;
}
}
private void AssignInputEvents()
{
controls = player.controls;
controls.Character.Movement.performed += context => moveInput = context.ReadValue<Vector2>();
controls.Character.Movement.canceled += context => moveInput = Vector2.zero;
controls.Character.Aim.performed += context => aimInput = context.ReadValue<Vector2>();
controls.Character.Aim.canceled += context => aimInput = Vector2.zero;
controls.Character.Run.performed += context =>
{
speed = runSpeed;
isRunning = true;
};
controls.Character.Run.canceled += context =>
{
speed = walkSpeed;
isRunning = false;
};
}
}