This repository was archived by the owner on Jan 29, 2025. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathDialogController.cs
85 lines (68 loc) · 2.27 KB
/
DialogController.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
using System.Collections.Generic;
using UnityEngine;
public class DialogController : MonoBehaviour
{
[SerializeField] private DialogTimelineAsset dialogTimelineAsset;
[SerializeField] private GameObject dialogPanel;
[SerializeField] private TMPro.TextMeshProUGUI dialogText;
[SerializeField] private GameObject optionPanel;
[SerializeField] private GameObject optionButtonPrefab;
private DialogNode currentNode;
private void Start()
{
if (dialogTimelineAsset == null)
{
Debug.LogError("DialogTimelineAsset is not assigned.");
return;
}
StartDialog();
}
private void StartDialog()
{
currentNode = dialogTimelineAsset.StartNode;
ShowDialogNode(currentNode);
}
private void ShowDialogNode(DialogNode node)
{
dialogText.text = node.DialogText;
dialogPanel.SetActive(true);
if (node is EndNode)
{
optionPanel.SetActive(false);
return;
}
ClearOptions();
ShowOptions(node);
}
private void ShowOptions(DialogNode node)
{
optionPanel.SetActive(true);
List<OptionNode> optionNodes = dialogTimelineAsset.GetConnectedOptionNodes(node);
foreach (OptionNode optionNode in optionNodes)
{
GameObject optionButton = Instantiate(optionButtonPrefab, optionPanel.transform);
TMPro.TextMeshProUGUI buttonText = optionButton.GetComponentInChildren<TMPro.TextMeshProUGUI>();
buttonText.text = optionNode.OptionText;
UnityEngine.UI.Button button = optionButton.GetComponent<UnityEngine.UI.Button>();
button.onClick.AddListener(() => OnOptionSelected(optionNode));
}
}
private void OnOptionSelected(OptionNode optionNode)
{
DialogNode targetNode = dialogTimelineAsset.DialogNodes.Find(n => n.Id == optionNode.TargetDialogNodeId);
if (targetNode == null)
{
Debug.LogError("Target node not found.");
return;
}
ClearOptions();
ShowDialogNode(targetNode);
}
private void ClearOptions()
{
foreach (Transform child in optionPanel.transform)
{
Destroy(child.gameObject);
}
}
}