using System.Collections.Generic; using TMPro; using UnityEngine; [CreateAssetMenu(menuName = "Communication/Dialog Node")] public class DialogNode : ScriptableObject { [Header("Speaker")] public CharacterData Speaker; [Tooltip("비우면 Speaker의 이름 그대로, 채우면 이 이름으로 표시 (예: ???)")] public string SpeakerNameOverride; [Tooltip("대사창을 띄울 기준 캐릭터. 비우면 Speaker 옆에 띄움 " + "(다른 NPC가 끼어드는 대사를 원래 대화 상대 옆에 표시하고 싶을 때 지정)")] public CharacterData HudAnchor; [Header("Content")] [TextArea(2,5)] public string TalkText; public GestureData Gesture; public ExpressionData Expression; public VoiceClip Voice; public float LineDuration; //자동 넘김 시간 //LineDuration=0 → 플레이어 입력 대기 (수동) //Voice 있음 → 클립 길이만큼 대기 //Voice 없음 → LineDuration 대기 [Header("Presentation")] public AudioClip Bgm; // 있으면 이 대사부터 전용 BGM 재생, 비어있으면 기본 BGM으로 복귀 public GameObject Vfx; // 이 대사 시작 시 화자 위치에서 1회 재생할 이펙트 프리팹 [Header("Behavior")] public bool LookAtPlayer; public bool ForcePlayerLook; // true면 이 대사 시작 시 플레이어(카메라)가 화자를 바라보도록 리그를 회전 public bool WaitForInput; // true면 LineDuration 무시하고 B버튼(OnDialogNext) 입력까지 대기 public bool StagingOnly; // true면 대화창을 숨기고 연출(회전·제스처·VFX·이벤트·대기)만 수행 [Header("Flow")] public DialogNode Next; // 선택지 없을 때 자동으로 갈 노드 public List Choices; // 있으면 플레이어 선택 대기 [Header("ChoiceQuestion")] [TextArea(2,5)] public string ChoiceQuestion; [Header("Event")] public string EventKey; // 비어있지 않으면 이 노드가 재생될 때 DialogPlayer가 같은 Key의 이벤트를 호출 [Header("Story")] [Tooltip("0이 아니면 이 노드 재생 시 화자(비우면 대화 주인 NPC)의 호감도를 이만큼 증감")] public int Affection; [Tooltip("0이 아니면 이 노드 재생 시 메인 진행도를 이만큼 증가. " + "분기 끝 노드마다 다른 값을 주면 선택지에 따라 진행도를 다르게 줄 수 있다")] public int Progress; }