2026-04-24 커뮤니케이션 시스템

This commit is contained in:
2026-04-24 14:14:04 +09:00
parent 14b4b47cd4
commit 3ea92ba3f9
23 changed files with 169 additions and 0 deletions

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: eb6d4501b8312bd45b64f94666429fce
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 4e1fa77a8f96cfa499f3381d7a03bb12
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,8 @@
using System;
[Serializable]
public class DialogChoice
{
public DialogNode DestinationNode;
public string ChoiceText;
}

View File

@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 53b0b23b66f7c2c4f999504013357bae

View File

@@ -0,0 +1,8 @@
using UnityEngine;
[CreateAssetMenu(menuName = "Communication/Dialog Group")]
public class DialogGroup : ScriptableObject
{
public string DialogGroupName;
public DialogNode StartNode;
}

View File

@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 1391123ae67c59242b2ba15388efd65b

View File

@@ -0,0 +1,25 @@
using System;
using System.Collections.Generic;
using UnityEngine;
[CreateAssetMenu(menuName = "Communication/Dialog Node")]
public class DialogNode : ScriptableObject
{
[Header("Speaker")]
public CharacterData Speaker;
[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("Flow")]
public DialogNode Next; // 선택지 없을 때 자동으로 갈 노드
public List<DialogChoice> Choices; // 있으면 플레이어 선택 대기
}

View File

@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 120455f2b87acc14c9b01cab221c71eb

View File

@@ -0,0 +1,24 @@
using System.Collections.Generic;
using UnityEngine;
public class DialogPlayer : MonoBehaviour
{
[SerializeField] private List<DialogGroup> _dialogGroups;
private Dictionary<string, DialogGroup> _dialogGroupMap;
private void Awake()
{
_dialogGroupMap = new Dictionary<string, DialogGroup>();
foreach (var g in _dialogGroups)
{
_dialogGroupMap[g.DialogGroupName] = g;
}
}
public void VoicePlay(DialogNode node)
{
//CharacterVoiceObject speakerVoiceObject = FindSpeakerVoiceObject(node.Speaker);
//speakerVoiceObject.Play(node.Voice.Clip);
}
}

View File

@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 9e349795efd8d1445b33cddf0442db11

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: e2502925ef2616a429da6f70b887176a
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,9 @@
using UnityEngine;
public class CharacterVoiceObject : MonoBehaviour
{
public CharacterData Character;
public AudioSource VoiceSource;
public void Play(AudioClip clip) => VoiceSource.PlayOneShot(clip);
}

View File

@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: f7b9cbce15ac9074ca0a54f7837824b8

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 5f885cca7d988aa4db7692d1b7dc15e5
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,9 @@
using UnityEngine;
[CreateAssetMenu(menuName = "Character/CharacterData")]
public class CharacterData : ScriptableObject
{
public string Id;
public string Name;
public Sprite Portrait;
}

View File

@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 0446c9fbb574c5242beeae1ece853b87

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: f57c57748092259458a9d5dc3db640d9
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,10 @@
using UnityEngine;
[CreateAssetMenu(menuName = "Communication/Expression")]
public class ExpressionData : ScriptableObject
{
[HideInInspector] public int AnimationLayer = 1;
public string StateName;
public float CrossFadeDuration = 0.2f;
public AnimationClip PreviewClip;
}

View File

@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 197305103c49bf349a3a749f48a4513e

View File

@@ -0,0 +1,10 @@
using UnityEngine;
[CreateAssetMenu(menuName = "Communication/Gesture")]
public class GestureData : ScriptableObject
{
[HideInInspector] public int AnimationLayer = 0;
public string StateName;
public float CrossFadeDuration = 0.2f;
public AnimationClip PreviewClip;
}

View File

@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 59589a6a14790d546aa8c5979fbb71ef

View File

@@ -0,0 +1,8 @@
using UnityEngine;
[CreateAssetMenu(menuName = "Communication/VoiceClip")]
public class VoiceClip : ScriptableObject
{
public string VoiceCode; //해당 음성 고유코드
public AudioClip Clip;
}

View File

@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 56b64eb84b3a1a44fa7fff7ae5e932d0