using UnityEngine; using UnityEngine.InputSystem; public class PlayerController : MonoBehaviour { [SerializeField] InputActionReference moveAction, jumpAction, lookAction, selectAction, discardAction; [SerializeField] float moveSpeed, lookSpeed, minLookAngle, maxLookAngle, interactionRange, throwForce; [SerializeField] float jumpForce; [SerializeField] CharacterController charCon; [SerializeField] Camera theCam; [SerializeField] Transform holdPoint; [SerializeField] LayerMask whatIsStock, whatIsShelf; private float ySpeed, horiRot, vertRot, currentThrowPower; private StockObject heldPickup; private void OnEnable() { if (moveAction != null) moveAction.action.Enable(); if (jumpAction != null) jumpAction.action.Enable(); if (lookAction != null) lookAction.action.Enable(); if (selectAction != null) selectAction.action.Enable(); if (discardAction != null) discardAction.action.Enable(); } private void OnDisable() { if (moveAction != null) moveAction.action.Disable(); if (jumpAction != null) jumpAction.action.Disable(); if (lookAction != null) lookAction.action.Disable(); if (selectAction != null) selectAction.action.Disable(); if (discardAction != null) discardAction.action.Disable(); } // Start is called before the first frame update void Start() { Cursor.lockState = CursorLockMode.Locked; } // Update is called once per frame void Update() { Vector2 lookInput = lookAction.action.ReadValue(); horiRot += lookInput.x * Time.deltaTime * lookSpeed; transform.rotation = Quaternion.Euler(0f, horiRot, 0f); vertRot -= lookInput.y * Time.deltaTime * lookSpeed; vertRot = Mathf.Clamp(vertRot, minLookAngle, maxLookAngle); theCam.transform.localRotation = Quaternion.Euler(vertRot, 0f, 0f); // Safety check to prevent errors if references are missing in the Inspector if (moveAction == null || charCon == null) return; Vector2 moveInput = moveAction.action.ReadValue(); //Debug.Log(moveInput); //transform.position = transform.position + new Vector3(moveInput.x * Time.deltaTime * moveSpeed, 0f, moveInput.y * Time.deltaTime * moveSpeed); //Vector3 moveAmount = new Vector3(moveInput.x, 0f, moveInput.y); Vector3 vertMove = transform.forward * moveInput.y; Vector3 horiMove = transform.right * moveInput.x; Vector3 moveAmount = vertMove + horiMove; moveAmount = moveAmount.normalized * moveSpeed; if (charCon.isGrounded) { ySpeed = 0; if (jumpAction.action.WasPressedThisFrame()) ySpeed = jumpForce; } ySpeed = ySpeed + (Physics.gravity.y * Time.deltaTime); moveAmount.y = ySpeed; charCon.Move(moveAmount * Time.deltaTime); //check for pickup Ray ray = theCam.ViewportPointToRay(new Vector3(0.5f, 0.5f, 0f)); RaycastHit hit; if (heldPickup == null) { if(selectAction.action.WasPressedThisFrame()) { if (Physics.Raycast(ray, out hit, interactionRange, whatIsStock)) { //Debug.Log("Hit " + hit.collider.name); heldPickup = hit.collider.GetComponent(); heldPickup.transform.SetParent(holdPoint); heldPickup.Pickup(); } } if (discardAction.action.WasPressedThisFrame()) { if (Physics.Raycast(ray, out hit, interactionRange, whatIsShelf)) { heldPickup = hit.collider.GetComponent().Getstock(); if (heldPickup != null) { heldPickup.transform.SetParent(holdPoint); heldPickup.Pickup(); } } } } else if (heldPickup != null) { if(selectAction.action.WasPressedThisFrame()) { if (Physics.Raycast(ray, out hit, interactionRange, whatIsShelf)) { //heldPickup.MakePlaced(); //heldPickup.transform.SetParent(hit.transform); //heldPickup = null; hit.collider.GetComponent().PlaceStock(heldPickup); if(heldPickup.isPlaced) heldPickup = null; } } // While the button is held, increase the current power up to the max throwForce if (discardAction.action.IsPressed()) { currentThrowPower = Mathf.Min(currentThrowPower + (throwForce * Time.deltaTime), throwForce); } // When the button is released, either throw or drop if (discardAction.action.WasReleasedThisFrame()) { heldPickup.Release(); // If power is above a small threshold (not just a quick click), apply force if (currentThrowPower > throwForce * 0.1f) { heldPickup.theRB.AddForce(theCam.transform.forward * currentThrowPower, ForceMode.Impulse); } heldPickup = null; currentThrowPower = 0f; } } } }