using System.Collections.Generic; using UnityEngine; using UnityEngine.InputSystem; public class PlayerInteraction : MonoBehaviour { public float interactRange = 3f; public Dialog[] dialog; [SerializeField] private InputActionReference InteractAction; [SerializeField] private InputActionReference DialogAction; [SerializeField] private GameObject dialogManagerObject; private readonly List interactableObjects = new(); private int blueberryCount; private int dialogIndex; private DialogManager dialogManager; private List inventory = new(); private bool talking; private void Start() { InteractAction.action.Enable(); InteractAction.action.performed += OnInteract; DialogAction.action.Enable(); DialogAction.action.performed += onDialogContinue; dialogManager = dialogManagerObject.GetComponent(); } private void OnTriggerEnter(Collider other) { print("outside"); if (other.gameObject.tag == "Interactable") { print("inside"); interactableObjects.Add(other.gameObject); } } private void OnTriggerExit(Collider other) { if (other.gameObject.tag == "Interactable") interactableObjects.Remove(other.gameObject); } private void OnInteract(InputAction.CallbackContext context) { print("talking: " + talking); if (context.performed && !talking) { var speaker = interactableObjects.Count > 0 ? ColliderInteractable() : PhysicsRaycastInteractable(); dialog = speaker.GetComponent().Talk(); if (dialog == null) return; // immedeately start the dialog dialogManager.ShowDialog("" + dialog[dialogIndex].speaker + ": " + dialog[dialogIndex].text); print("testo"); talking = true; // skip the 0th dialog entry since it has already been shown dialogIndex++; if (dialogIndex >= dialog.Length) { // reset the dialog index if we reach the end of the dialog dialogIndex = 0; // reset the dialog to be null so it cannot be scrolled through when not in an interaction dialog = null; talking = false; dialogManager.HideDialog(); } } } private GameObject PhysicsRaycastInteractable() { var ray = new Ray(transform.position, transform.forward); RaycastHit hit; if (Physics.Raycast(ray, out hit, interactRange)) if (hit.collider.CompareTag("Interactable")) //Debug.Log("Interacted with: " + hit.collider.name); // You can add more actions here return hit.collider.gameObject; return null; } private GameObject ColliderInteractable() { var closestDistance = float.MaxValue; var pos = -1; for (var i = 0; i < interactableObjects.Count; i++) if ((interactableObjects[i].transform.position - transform.position).magnitude < closestDistance) { closestDistance = (interactableObjects[i].transform.position - transform.position).magnitude; pos = i; } return interactableObjects[pos]; } private void onDialogContinue(InputAction.CallbackContext context) { if (context.performed && dialog != null) { print("Dialog continue"); // scroll the dialog only if there is text to be shown print(dialog[dialogIndex].text); dialogManager.ShowDialog("" + dialog[dialogIndex].speaker + ": " + dialog[dialogIndex].text); dialogIndex++; if (dialogIndex >= dialog.Length) { // reset the dialog index if we reach the end of the dialog dialogIndex = 0; // reset the dialog to be null so it cannot be scrolled through when not in an interaction dialog = null; print("Dialog ended"); print(" " + talking); talking = false; print(" " + talking); dialogManager.HideDialog(); } } } public int GetBlueberryCount() { return blueberryCount; } public void SetBlueberryCount(int count) { blueberryCount = count; } public void CollectBlueberry(int newBlueberries) { blueberryCount += newBlueberries; Debug.Log("Collected " + blueberryCount + " blueberries. Total: " + blueberryCount); } public void AddToInventory(InventoryItem reward) { inventory.Add(reward); Debug.Log("Added " + reward.name + " to inventory. Total items: " + inventory.Count); } public void RemoveFromInventory(InventoryItem reward) { Debug.Log("Attempting to remove " + reward.name + " from inventory."); if (inventory.Contains(reward)) { inventory.Remove(reward); Debug.Log("Removed " + reward.name + " from inventory. Total items: " + inventory.Count); } else { Debug.LogWarning("Item not found in inventory: " + reward.name); } } public int GetItemQuantity(string itemName) { var item = inventory.Find(i => i.itemName == itemName); return item != null ? item.quantity : 0; } public List GetInventoryItems() { return inventory; } public void SetInventoryItems(List items) { inventory = items; } }