Files
P2SinNext/Assets/Code/UIManager.cs
2025-10-19 19:04:50 +05:00

243 lines
7.2 KiB
C#

using UnityEngine;
using TMPro;
using UnityEngine.UI;
using System.Collections;
using System.Collections.Generic;
public class UIManager : MonoBehaviour
{
[Header("UI Prefabs")]
public GameObject messageWindowPrefab;
[Header("Message Window Settings")]
public float slideDuration = 0.3f;
public AnimationCurve slideCurve = AnimationCurve.EaseInOut(0, 0, 1, 1);
public float cursorAnimationSpeed = 1f;
public float cursorAnimationHeight = 10f;
private RectTransform messageWindow;
public TMP_Text messageText;
public TMP_Text shadowText;
private RectTransform cursor;
private RectTransform cursor2;
private Vector2 cursorOriginalPosition;
private bool isMessageWindowVisible = false;
private bool isWaitingForInput = false;
private Coroutine cursorAnimationCoroutine;
private Coroutine slideCoroutine;
public int userSelectionVariant;
private ExecutionContext currentContext;
private bool isInitialized = false;
public void Initialize()
{
if (isInitialized) return;
CreateMessageWindow();
isInitialized = true;
}
private void CreateMessageWindow()
{
if (messageWindowPrefab == null)
{
Debug.LogError("MessageWindow prefab is not assigned!");
return;
}
GameObject messageWindowGO = Instantiate(messageWindowPrefab, transform);
messageWindow = messageWindowGO.GetComponent<RectTransform>();
// Íàõîäèì òåêñòîâûå êîìïîíåíòû
messageText = messageWindowGO.transform.Find("TextContainer/MessageText")?.GetComponent<TMP_Text>();
shadowText = messageWindowGO.transform.Find("TextContainer/ShadowText")?.GetComponent<TMP_Text>();
// Íàõîäèì êóðñîð
Transform cursorTransform = messageWindowGO.transform.Find("Cursor");
Transform cursor2Transform = messageWindowGO.transform.Find("Cursor2");
if (cursorTransform != null)
{
cursor = cursorTransform.GetComponent<RectTransform>();
cursorOriginalPosition = cursor.anchoredPosition;
cursor.gameObject.SetActive(false);
cursor2 = cursor2Transform.GetComponent<RectTransform>();
cursor2.gameObject.SetActive(false);
}
// Ñðàçó ñêðûâàåì îêíî
HideMessageWindowImmediate();
}
// Ìåòîäû äëÿ óïðàâëåíèÿ MessageWindow
public void ShowMessageWindow()
{
if (messageWindow != null && !isMessageWindowVisible)
{
// Àêòèâèðóåì îêíî ïåðåä àíèìàöèåé
messageWindow.gameObject.SetActive(true);
if (slideCoroutine != null)
StopCoroutine(slideCoroutine);
slideCoroutine = StartCoroutine(SlideWindow(true));
}
}
public void HideMessageWindow(ExecutionContext ctx)
{
if (messageWindow != null && isMessageWindowVisible)
{
currentContext = ctx;
ctx.IsPaused = true;
if (slideCoroutine != null)
StopCoroutine(slideCoroutine);
slideCoroutine = StartCoroutine(SlideWindow(false));
} else
{
ctx.IsPaused = false;
}
}
private IEnumerator SlideWindow(bool show)
{
float elapsed = 0f;
float startOffset = show ? -messageWindow.rect.height : 0f;
float targetOffset = show ? 0f : -messageWindow.rect.height;
while (elapsed < slideDuration)
{
elapsed += Time.deltaTime;
float t = slideCurve.Evaluate(elapsed / slideDuration);
// Àíèìèðóåì ÷åðåç offsetMin/offsetMax
float currentOffset = Mathf.Lerp(startOffset, targetOffset, t);
messageWindow.offsetMin = new Vector2(0f, currentOffset);
messageWindow.offsetMax = new Vector2(0f, currentOffset);
yield return null;
}
// Ôèíàëèçèðóåì ïîçèöèþ
float finalOffset = show ? 0f : -messageWindow.rect.height;
messageWindow.offsetMin = new Vector2(0f, finalOffset);
messageWindow.offsetMax = new Vector2(0f, finalOffset);
isMessageWindowVisible = show;
// Åñëè ñêðûâàåì îêíî - äåàêòèâèðóåì
if (!show)
{
messageWindow.gameObject.SetActive(false);
if (currentContext != null)
{
currentContext.IsPaused = false;
currentContext = null;
}
}
}
public void HideMessageWindowImmediate()
{
if (messageWindow != null)
{
// Óñòàíàâëèâàåì ïîçèöèþ íèæå ýêðàíà
messageWindow.offsetMin = new Vector2(0f, messageWindow.rect.height);
messageWindow.offsetMax = new Vector2(0f, messageWindow.rect.height);
isMessageWindowVisible = false;
messageWindow.gameObject.SetActive(false);
if (currentContext != null)
{
currentContext.IsPaused = false;
currentContext = null;
}
}
}
// Ìåòîäû äëÿ ðàáîòû ñ òåêñòîì
public void SetText(string text)
{
if (messageText != null) messageText.text = text;
if (shadowText != null) shadowText.text = text;
}
public void AppendText(string text)
{
if (messageText != null) messageText.text += text;
if (shadowText != null) shadowText.text += text;
}
public void ClearText()
{
if (messageText != null) messageText.text = "";
if (shadowText != null) shadowText.text = "";
}
// Ìåòîäû äëÿ êóðñîðà
public void ShowCursor(bool show)
{
if (cursor != null)
{
cursor.gameObject.SetActive(show);
cursor2.gameObject.SetActive(show);
isWaitingForInput = show;
if (show && cursorAnimationCoroutine == null)
{
cursorAnimationCoroutine = StartCoroutine(AnimateCursor());
}
else if (!show && cursorAnimationCoroutine != null)
{
StopCoroutine(cursorAnimationCoroutine);
cursorAnimationCoroutine = null;
cursor.anchoredPosition = cursorOriginalPosition;
cursor2.anchoredPosition = cursorOriginalPosition;
}
}
}
private IEnumerator AnimateCursor()
{
while (isWaitingForInput)
{
float yOffset = Mathf.Sin(Time.time * cursorAnimationSpeed) * cursorAnimationHeight;
float yOffset2 = Mathf.Sin((Time.time - 0.1f) * cursorAnimationSpeed) * cursorAnimationHeight;
cursor.anchoredPosition = cursorOriginalPosition + new Vector2(0, yOffset);
cursor2.anchoredPosition = cursorOriginalPosition + new Vector2(0, yOffset2);
yield return null;
}
}
// user dialog selection
public void ShowSelection(List<string> variants)
{
switch (variants.Count)
{
case 2:
case 3:
case 4:
case 5:
case 6:
break;
}
}
public void WipeSelection()
{
}
public bool IsMessageWindowVisible => isMessageWindowVisible;
public bool IsWaitingForInput => isWaitingForInput;
}