using UnityEngine; public class PlayerController : MonoBehaviour { public GameObject DougBody; public Shovel Shovel; public float walkSpeed; float digTime = 0.9f; float digTimestamp = 0; bool isDigging = false; Interactable nearestInteractable; private CharacterController characterController; private Vector3 moveDir; private float gravity = 10; // Start is called once before the first execution of Update after the MonoBehaviour is created void Start() { characterController = GetComponent(); } // Update is called once per frame void Update() { if (!isDigging) { RotatePlayerTowardMouse(); TryInteract(); } Walk(); DigDetector(); } void Walk() { float verticalMovement = 0; float horizontalMovement = 0; if (!isDigging) { verticalMovement = Input.GetAxisRaw("Vertical"); horizontalMovement = Input.GetAxisRaw("Horizontal"); } moveDir = new Vector3(horizontalMovement, 0, verticalMovement).normalized; moveDir *= walkSpeed; if (!characterController.isGrounded) { moveDir.y = -gravity; } characterController.Move(moveDir * Time.deltaTime); } void DigDetector() { if (!isDigging) { if (Input.GetMouseButtonDown(0)) { Shovel.Dig(); isDigging = true; digTimestamp = Time.time + digTime; // fuck coroutines fr fr } } else { if (Time.time > digTimestamp) { isDigging = false; } } } void RotatePlayerTowardMouse() { Vector2 positionOnScreen = Camera.main.WorldToViewportPoint(DougBody.transform.position); Vector2 mouseOnScreen = (Vector2)Camera.main.ScreenToViewportPoint(Input.mousePosition); float angle = Mathf.Atan2(positionOnScreen.y - mouseOnScreen.y, positionOnScreen.x - mouseOnScreen.x) * Mathf.Rad2Deg; DougBody.transform.rotation = Quaternion.Euler(new Vector3(0f, -(angle + 90), 0f)); } void TryInteract() { if (Input.GetKeyDown(KeyCode.E) && nearestInteractable != null) { nearestInteractable.Interact(); } } private void OnTriggerEnter(Collider other) { Interactable interactable = other.GetComponent(); // store nearest interactable if it exists if (interactable != null) { nearestInteractable = interactable; interactable.MoveInsideRange(); } } private void OnTriggerExit(Collider other) { // just null out interactables when we leave an interactable trigger (we cant and shouldn't overlap interactables) Interactable interactable = other.GetComponent(); // store nearest interactable if it exists if (interactable != null && nearestInteractable != null) { nearestInteractable.MoveOutsideRange(); nearestInteractable = null; } } }