2026-06-19 UI, UI로직
This commit is contained in:
191
Assets/My project/TruthFountain/Scripts/TruthFountainUI.cs
Normal file
191
Assets/My project/TruthFountain/Scripts/TruthFountainUI.cs
Normal file
@@ -0,0 +1,191 @@
|
||||
using TMPro;
|
||||
using UnityEngine;
|
||||
using UnityEngine.UI;
|
||||
|
||||
public class TruthFountainUI : MonoBehaviour
|
||||
{
|
||||
[Header("Root")]
|
||||
[SerializeField] private GameObject uiRoot;
|
||||
|
||||
[Header("Texts")]
|
||||
[SerializeField] private TMP_Text titleText;
|
||||
[SerializeField] private TMP_Text questionText;
|
||||
[SerializeField] private TMP_Text questionHintText;
|
||||
[SerializeField] private TMP_Text progressText;
|
||||
[SerializeField] private TMP_Text resultText;
|
||||
|
||||
[Header("Choices")]
|
||||
[SerializeField] private TruthChoiceButtonUI[] choiceButtons;
|
||||
|
||||
[Header("Nose Gauge")]
|
||||
[SerializeField] private Image noseGaugeFill;
|
||||
[SerializeField] private TMP_Text noseValueText;
|
||||
|
||||
[Header("Final Result")]
|
||||
[SerializeField] private GameObject finalResultPanel;
|
||||
[SerializeField] private TMP_Text finalTitleText;
|
||||
[SerializeField] private TMP_Text finalDescriptionText;
|
||||
[SerializeField] private Button confirmButton;
|
||||
|
||||
private TruthFountainGameManager gameManager;
|
||||
|
||||
private void Reset()
|
||||
{
|
||||
uiRoot = gameObject;
|
||||
}
|
||||
|
||||
public void Bind(TruthFountainGameManager manager)
|
||||
{
|
||||
gameManager = manager;
|
||||
|
||||
if (confirmButton != null)
|
||||
{
|
||||
confirmButton.onClick.RemoveAllListeners();
|
||||
confirmButton.onClick.AddListener(HandleConfirmClicked);
|
||||
}
|
||||
}
|
||||
|
||||
public void SetVisible(bool visible)
|
||||
{
|
||||
GameObject targetRoot = uiRoot != null ? uiRoot : gameObject;
|
||||
targetRoot.SetActive(visible);
|
||||
}
|
||||
|
||||
public void Initialize(TruthFountainData data)
|
||||
{
|
||||
if (titleText != null)
|
||||
{
|
||||
titleText.text = data != null ? data.Title : "진실의 샘";
|
||||
}
|
||||
|
||||
SetResultMessage(string.Empty, false);
|
||||
ShowFinalResult(false, string.Empty, string.Empty);
|
||||
UpdateNoseGauge(0, data != null ? data.MaxLieScore : 1);
|
||||
}
|
||||
|
||||
public void ShowQuestion(TruthQuestionData question, int questionIndex, int totalQuestions, TruthFountainGameManager manager)
|
||||
{
|
||||
if (questionText != null)
|
||||
{
|
||||
questionText.text = question != null ? question.QuestionText : "질문 데이터가 없습니다.";
|
||||
}
|
||||
|
||||
if (questionHintText != null)
|
||||
{
|
||||
questionHintText.text = question != null ? question.HintText : string.Empty;
|
||||
}
|
||||
|
||||
if (progressText != null)
|
||||
{
|
||||
progressText.text = $"질문 {questionIndex + 1} / {Mathf.Max(1, totalQuestions)}";
|
||||
}
|
||||
|
||||
SetResultMessage(string.Empty, false);
|
||||
SetupChoiceButtons(question, manager);
|
||||
}
|
||||
|
||||
public void SetupChoiceButtons(TruthQuestionData question, TruthFountainGameManager manager)
|
||||
{
|
||||
TruthChoiceData[] choices = question != null ? question.Choices : null;
|
||||
|
||||
for (int i = 0; i < choiceButtons.Length; i++)
|
||||
{
|
||||
TruthChoiceData choice = choices != null && i < choices.Length ? choices[i] : null;
|
||||
|
||||
if (choiceButtons[i] != null)
|
||||
{
|
||||
choiceButtons[i].Setup(choice, manager);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void SetChoiceButtonsInteractable(bool interactable)
|
||||
{
|
||||
foreach (TruthChoiceButtonUI choiceButton in choiceButtons)
|
||||
{
|
||||
if (choiceButton != null && choiceButton.gameObject.activeSelf)
|
||||
{
|
||||
choiceButton.SetInteractable(interactable);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void ShowChoiceFeedback(TruthChoiceButtonUI selectedButton)
|
||||
{
|
||||
foreach (TruthChoiceButtonUI choiceButton in choiceButtons)
|
||||
{
|
||||
if (choiceButton == null || !choiceButton.gameObject.activeSelf)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
if (choiceButton == selectedButton)
|
||||
{
|
||||
choiceButton.ShowTruthOrLieFeedback();
|
||||
}
|
||||
else
|
||||
{
|
||||
choiceButton.ResetVisual();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void SetResultMessage(string message, bool visible = true)
|
||||
{
|
||||
if (resultText == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
resultText.text = message;
|
||||
resultText.gameObject.SetActive(visible && !string.IsNullOrWhiteSpace(message));
|
||||
}
|
||||
|
||||
public void UpdateNoseGauge(int lieScore, int maxLieScore)
|
||||
{
|
||||
int safeMax = Mathf.Max(1, maxLieScore);
|
||||
float fillAmount = Mathf.Clamp01((float)lieScore / safeMax);
|
||||
|
||||
if (noseGaugeFill != null)
|
||||
{
|
||||
noseGaugeFill.fillAmount = fillAmount;
|
||||
}
|
||||
|
||||
if (noseValueText != null)
|
||||
{
|
||||
noseValueText.text = $"코 길이 {Mathf.RoundToInt(fillAmount * 100f)}%";
|
||||
}
|
||||
}
|
||||
|
||||
public void ShowFinalResult(bool visible, string title, string description)
|
||||
{
|
||||
if (finalResultPanel != null)
|
||||
{
|
||||
finalResultPanel.SetActive(visible);
|
||||
}
|
||||
|
||||
if (finalTitleText != null)
|
||||
{
|
||||
finalTitleText.text = title;
|
||||
}
|
||||
|
||||
if (finalDescriptionText != null)
|
||||
{
|
||||
finalDescriptionText.text = description;
|
||||
}
|
||||
|
||||
SetChoiceButtonsInteractable(!visible);
|
||||
}
|
||||
|
||||
private void HandleConfirmClicked()
|
||||
{
|
||||
if (gameManager != null)
|
||||
{
|
||||
gameManager.ConfirmFinalResult();
|
||||
}
|
||||
else
|
||||
{
|
||||
ShowFinalResult(false, string.Empty, string.Empty);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user