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/UIController.cs | 220 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 220 insertions(+), 0 deletions(-)
diff --git a/Assets/Scripts/Interact/UIController.cs b/Assets/Scripts/Interact/UIController.cs
new file mode 100644
index 0000000..da682a9
--- /dev/null
+++ b/Assets/Scripts/Interact/UIController.cs
@@ -0,0 +1,220 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+using UnityEngine.Events;
+using UnityEngine.UI;
+using TMPro;
+
+public class UIController : MonoBehaviour
+{
+ [Header("UI Configuration")]
+ [SerializeField] private string uiName = "Generic UI";
+ [SerializeField] private bool closeOnEscapeKey = true;
+ [SerializeField] private bool closeOnInteractKey = true;
+ [SerializeField] private bool pauseGameWhenOpen = false;
+ [SerializeField] private GameObject[] panelsToManage;
+
+ [Header("Animation")]
+ [SerializeField] private bool useAnimation = true;
+ [SerializeField] private float animationDuration = 0.3f;
+ [SerializeField] private Animator uiAnimator;
+
+ [Header("UI Elements")]
+ [SerializeField] private Button closeButton;
+ [SerializeField] private TextMeshProUGUI titleText;
+ [SerializeField] private TextMeshProUGUI descriptionText;
+
+ [Header("Events")]
+ public UnityEvent OnUIOpenedEvent = new UnityEvent();
+ public UnityEvent OnUIClosedEvent = new UnityEvent();
+
+ // Current state tracking
+ private bool isOpen = false;
+ private string currentType = "";
+ private GameObject interactionSource;
+ private KeyCode? interactKey;
+
+ private void Awake()
+ {
+ // Set up close button if available
+ if (closeButton != null)
+ {
+ closeButton.onClick.AddListener(CloseUI);
+ }
+
+ // Initial state is closed
+ //gameObject.SetActive(false);
+ }
+
+ private void OnEnable()
+ {
+ // Set UI as open
+ isOpen = true;
+
+ // Pause game if configured to do so
+ if (pauseGameWhenOpen)
+ {
+ GameManager.PauseGame();
+ }
+
+ if (closeOnInteractKey)
+ {
+ interactKey = FindAnyObjectByType<PlayerInteraction>().interactKey;
+ }
+
+ // Invoke open event
+ OnUIOpenedEvent.Invoke();
+
+ // Play open animation if using an animator
+ if (useAnimation && uiAnimator != null)
+ {
+ uiAnimator.SetTrigger("Open");
+ }
+ }
+
+ private void Update()
+ {
+ // Check for escape key to close UI
+ if (isOpen && (closeOnEscapeKey && Input.GetKeyDown(KeyCode.Escape) || (closeOnInteractKey && interactKey.HasValue && Input.GetKeyDown(interactKey.Value))))
+ {
+ CloseUI();
+ }
+ }
+
+ /// <summary>
+ /// Called when this UI is opened by an interactable
+ /// </summary>
+ /// <param name="type">The type of interaction that opened this UI</param>
+ /// <param name="source">Reference to the GameObject that triggered the interaction</param>
+ public virtual void OnUIOpened(string type, GameObject source)
+ {
+ currentType = type;
+ interactionSource = source;
+
+ // Update UI elements based on type
+ UpdateUIElements();
+
+ // Activate the appropriate panel if we have multiple
+ ActivateRelevantPanel(type);
+ }
+
+ /// <summary>
+ /// Close the UI
+ /// </summary>
+ public virtual void CloseUI()
+ {
+ // If using animation, trigger close animation and wait before disabling
+ if (useAnimation && uiAnimator != null)
+ {
+ uiAnimator.SetTrigger("Close");
+ StartCoroutine(CloseAfterAnimation());
+ }
+ else
+ {
+ // Otherwise close immediately
+ FinalizeClose();
+ }
+ }
+
+ private IEnumerator CloseAfterAnimation()
+ {
+ yield return new WaitForSecondsRealtime(animationDuration);
+ FinalizeClose();
+ }
+
+ private void FinalizeClose()
+ {
+ // Restore time scale if it was changed
+ if (pauseGameWhenOpen)
+ {
+ GameManager.ResumeGame();
+ }
+
+ // Set state to closed
+ isOpen = false;
+
+ // Invoke closed event
+ OnUIClosedEvent.Invoke();
+
+ // Disable gameObject
+ gameObject.SetActive(false);
+ }
+
+ /// <summary>
+ /// Updates UI elements like title and description based on the interaction type
+ /// </summary>
+ protected virtual void UpdateUIElements()
+ {
+ // Set title if available
+ if (titleText != null)
+ {
+ titleText.text = GetTitleForType(currentType);
+ }
+
+ // Set description if available
+ if (descriptionText != null)
+ {
+ descriptionText.text = GetDescriptionForType(currentType);
+ }
+ }
+
+ /// <summary>
+ /// Gets the appropriate title based on interaction type
+ /// Override this in derived classes for specific implementations
+ /// </summary>
+ protected virtual string GetTitleForType(string type)
+ {
+ return uiName;
+ }
+
+ /// <summary>
+ /// Gets the appropriate description based on interaction type
+ /// Override this in derived classes for specific implementations
+ /// </summary>
+ protected virtual string GetDescriptionForType(string type)
+ {
+ return "";
+ }
+
+ /// <summary>
+ /// Activates the relevant panel based on the interaction type
+ /// </summary>
+ protected virtual void ActivateRelevantPanel(string type)
+ {
+ // If we have multiple panels, we can selectively enable them
+ // This is a simple implementation, you might want to expand this
+ // with a dictionary or switch statement for more complex UIs
+ if (panelsToManage != null && panelsToManage.Length > 0)
+ {
+ // Default behavior: activate the first panel
+ foreach (var panel in panelsToManage)
+ {
+ panel.SetActive(panel == panelsToManage[0]);
+ }
+ }
+ }
+
+ /// <summary>
+ /// Get the GameObject that triggered this UI to open
+ /// </summary>
+ protected GameObject GetInteractionSource()
+ {
+ return interactionSource;
+ }
+
+ /// <summary>
+ /// Get the current interaction type
+ /// </summary>
+ protected string GetCurrentType()
+ {
+ return currentType;
+ }
+
+ /// <summary>
+ /// Check if the UI is currently open
+ /// </summary>
+ public bool IsOpen()
+ {
+ return isOpen;
+ }
+}
--
Gitblit v1.10.0