From 40ac185dc7a017d95771fe580c77eab20e663908 Mon Sep 17 00:00:00 2001 From: miepzerino <o.skotnik@gmail.com> Date: Tue, 08 Apr 2025 17:36:08 +0000 Subject: [PATCH] #46 added interactables --- Assets/Scripts/Interact/PlayerInteraction.cs | 98 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 98 insertions(+), 0 deletions(-) diff --git a/Assets/Scripts/Interact/PlayerInteraction.cs b/Assets/Scripts/Interact/PlayerInteraction.cs new file mode 100644 index 0000000..9259f52 --- /dev/null +++ b/Assets/Scripts/Interact/PlayerInteraction.cs @@ -0,0 +1,98 @@ +// PlayerInteraction.cs - Handles player's interactions with objects +using UnityEngine; +using UnityEngine.UI; +using TMPro; +using UnityEngine.TextCore.Text; + +public class PlayerInteraction : MonoBehaviour +{ + [SerializeField] private float checkRadius = 3f; + [SerializeField] private LayerMask interactableMask; + [SerializeField] public KeyCode interactKey = KeyCode.E; + + // UI references + [SerializeField] private GameObject interactionPromptUI; + [SerializeField] private TextMeshProUGUI promptText; + [SerializeField] private float promptHeightOffset = 1.5f; // Height above the interactable + + private Interactable currentInteractable; + + private void Update() + { + // Check for interactable objects + //CheckForInteractable(); + + // Handle interaction input + if (Input.GetKeyDown(interactKey) && currentInteractable != null && !GameManager.GameIsPaused) + { + currentInteractable.Interact(); + } + } + private void LateUpdate() + { + if (currentInteractable != null && interactionPromptUI.activeSelf) + { + // Update position every frame when active + Vector3 targetPosition = currentInteractable.transform.position; // + Vector3.up * promptHeightOffset; + interactionPromptUI.transform.position = targetPosition; + } + } + + public void SetCurrentInteractable(Interactable interactable) + { + currentInteractable = interactable; + UpdateInteractionUI(); + } + + private void CheckForInteractable() + { + // Cast a sphere to detect interactable objects + Collider[] colliders = Physics.OverlapSphere(transform.position, checkRadius, interactableMask); + Debug.Log("Checking for interactables within radius: " + checkRadius); + // Find closest interactable + float closestDistance = checkRadius; + Interactable closestInteractable = null; + + Debug.Log("Found " + colliders.Length + " colliders in range."); + foreach (var collider in colliders) + { + Debug.Log("Collider detected: " + collider.gameObject.name); + if (collider.TryGetComponent(out Interactable interactable)) + { + float distance = Vector3.Distance(transform.position, interactable.transform.position); + if (distance < closestDistance && interactable.IsInRange(transform)) + { + closestDistance = distance; + closestInteractable = interactable; + } + } + } + + // Update current interactable + if (closestInteractable != currentInteractable) + { + currentInteractable = closestInteractable; + UpdateInteractionUI(); + } + } + + private void UpdateInteractionUI() + { + if (currentInteractable != null) + { + // Update prompt text + promptText.text = currentInteractable.GetPromptMessage(); + + // Show the prompt + interactionPromptUI.SetActive(true); + + // Position the prompt above the interactable + Vector3 targetPosition = currentInteractable.transform.position + Vector3.up * promptHeightOffset; + interactionPromptUI.transform.position = targetPosition; + } + else + { + interactionPromptUI.SetActive(false); + } + } +} -- Gitblit v1.9.3