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; [SerializeField] private List inventory = new(); private readonly List interactableObjects = new(); [SerializeField] private int blueberryCount; private int dialogIndex; private DialogManager dialogManager; private GameObject speaker; 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) { if (context.performed && !talking) { speaker = interactableObjects.Count > 0 ? ColliderInteractable() : PhysicsRaycastInteractable(); dialog = speaker.GetComponent().Talk(); if (dialog == null || dialog.Length == 0) return; // immedeately start the dialog dialogManager.ShowDialog("" + dialog[dialogIndex].speaker + ": ", dialog[dialogIndex].text, gameObject.GetComponentInChildren(), speaker.GetComponentInChildren()); talking = true; // skip the 0th dialog entry since it has already been shown 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; speaker = null; dialogManager.HideDialog(); } dialogIndex++; } } 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 && dialog.Length > 0) { print("Dialog continue"); // scroll the dialog only if there is text to be shown 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); speaker = null; dialogManager.HideDialog(); } else { dialogManager.ShowDialog("" + dialog[dialogIndex].speaker + ": ", dialog[dialogIndex].text, gameObject?.GetComponentInChildren(), speaker?.GetComponentInChildren()); dialogIndex++; } } } public Dialog[] GetDialog() { return dialog; } public void SetDialog(Dialog[] savedDialog) { dialog = savedDialog; } 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) { var item = inventory.Find(e => e.itemName == reward.itemName); if (item == null) inventory.Add(Instantiate(reward)); else item.quantity += reward.quantity; 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."); var item = inventory.Find(e => e.itemName == reward.itemName); if (item != null) { inventory.Remove(item); Debug.Log("Removed " + item.itemName + " 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; } }