57 lines
1.7 KiB
C#
57 lines
1.7 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
using UnityEngine.Events;
|
|
|
|
[CreateAssetMenu(menuName = "Dialogue/Dialogue Asset", fileName = "NewDialogue")]
|
|
public class DialogueAsset : ScriptableObject
|
|
{
|
|
[Tooltip("Start from this node id when dialogue begins")]
|
|
public int startNodeId = 0;
|
|
|
|
public List<Node> nodes = new();
|
|
|
|
[Serializable]
|
|
public class Node
|
|
{
|
|
public int id = 0;
|
|
public string speakerName;
|
|
public Sprite speakerPortrait;
|
|
|
|
[Tooltip("Shown in order. If more than one, player taps/presses to advance within the same node.")]
|
|
[TextArea(2, 4)] public List<string> lines = new();
|
|
|
|
[Tooltip("Invoked when this node is entered (before showing text).")]
|
|
public UnityEvent onEnter;
|
|
|
|
[Tooltip("If no choices and nextNodeId < 0, dialogue ends after this node.")]
|
|
public int nextNodeId = -1;
|
|
|
|
public List<Choice> choices = new();
|
|
}
|
|
|
|
[Serializable]
|
|
public class Choice
|
|
{
|
|
[TextArea(1, 2)] public string text;
|
|
|
|
[Tooltip("Go to this node when chosen. If < 0, ends dialogue.")]
|
|
public int nextNodeId = -1;
|
|
|
|
[Header("Conditions / Effects")]
|
|
[Tooltip("If non-empty, this choice is only visible when the flag is present in DialogueManager.")]
|
|
public string requireFlag;
|
|
|
|
[Tooltip("If non-empty, set this flag on choose (stored in DialogueManager).")]
|
|
public string setFlag;
|
|
|
|
[Tooltip("Optional SFX or other hook.")]
|
|
public UnityEvent onChoose;
|
|
}
|
|
|
|
public bool TryGetNode(int id, out Node node)
|
|
{
|
|
node = nodes.Find(n => n.id == id);
|
|
return node != null;
|
|
}
|
|
} |