using System.Collections.Generic; using UnityEngine; [CreateAssetMenu(menuName = "Communication/Dialog Node")] public class DialogNode : ScriptableObject { [Header("Speaker")] public CharacterData Speaker; [Tooltip("비우면 Speaker의 이름 그대로, 채우면 이 이름으로 표시 (예: ???)")] public string SpeakerNameOverride; [Header("Content")] [TextArea(2,5)] public string TalkText; public GestureData Gesture; public ExpressionData Expression; public VoiceClip Voice; // 진행은 항상 플레이어 입력(OnDialogNext)으로 넘어간다. [Header("Presentation")] public AudioClip Bgm; // 있으면 이 대사부터 전용 BGM 재생, 비어있으면 기본 BGM으로 복귀 [Header("Flow")] public DialogNode Next; // 선택지 없을 때 자동으로 갈 노드 public List Choices; // 있으면 플레이어 선택 대기 [Header("Hidden Branch")] [Tooltip("이 대사가 재생되는 동안 특정 행동(제스처)을 하면 Next/선택지 대신 이 노드로 몰래 분기. " + "비우면 히든 분기 없음 — 평소엔 존재하지 않는 것처럼 보인다")] public DialogNode HiddenBranch; [Tooltip("히든 분기를 여는 제스처 키 (아이템의 DialogGestureItem의 Gesture Key와 일치). " + "예: kimchi, bouquet, slap. 비우면 아무 제스처 오브젝트나 발동 가능")] public string HiddenGestureKey; [Tooltip("히든 분기를 탔을 때 기록할 선택지 Code (선택지의 Code와 동일한 용도). " + "비우면 기록 안 함")] public string HiddenCode; [Header("Affection Branch")] [Tooltip("켜면 이 노드는 대사 없이 호감도 조건만 검사해 즉시 라우팅한다: " + "조건을 만족하면 AffectionPassBranch로, 아니면 Next로")] public bool AffectionCheck; [Tooltip("검사할 호감도 조건들 (캐릭터·연산자·값 + 다음 조건과의 and/or). " + "캐릭터를 비우면 대화 주인 NPC. AND가 OR보다 우선. 비어 있으면 무조건 통과")] public List AffectionRequirements = new(); [Tooltip("조건을 만족했을 때 갈 노드 (실패하면 Next로)")] public DialogNode AffectionPassBranch; [Header("ChoiceQuestion")] [TextArea(2,5)] public string ChoiceQuestion; [Header("Story")] [Tooltip("0이 아니면 이 노드 재생 시 화자(비우면 대화 주인 NPC)의 호감도를 이만큼 증감")] public int Affection; [Tooltip("0이 아니면 이 노드 재생 시 메인 진행도를 이만큼 증가. " + "분기 끝 노드마다 다른 값을 주면 선택지에 따라 진행도를 다르게 줄 수 있다")] public int Progress; }