2026-06-22 캐릭터 영역별 스크립트

This commit is contained in:
2026-06-22 12:57:29 +09:00
parent 483e3c89f8
commit 3575022478
12 changed files with 486 additions and 22 deletions

View File

@@ -5,17 +5,25 @@
[RequireComponent(typeof(CharacterVoiceObject))]
public class DialogPlayer : MonoBehaviour
{
[SerializeField] private List<DialogGroup> _dialogGroups;
[System.Serializable]
public struct RegionGroup
{
public string Region; // 영역 이름 (NPC마다 자유롭게 지정 — 그룹 이름과 무관)
public DialogGroup Group;
}
[Tooltip("영역 이름 ↔ 그 영역에서 재생할 DialogGroup")]
[SerializeField] private List<RegionGroup> _regionGroups;
[Header("Region")]
[SerializeField] private string _currentRegion; // 현재 영역(DialogGroup 이름). DialogRegion 트리거가 갱신
[SerializeField] private string _currentRegion; // 현재 영역 이름. DialogRegion 트리거가 갱신
[Header("Dialog HUD Placement")] // 씬에서 캐릭터 위치/주변(벽 등)에 맞춰 조절
[SerializeField] private float _hudChestHeight = 1.2f; // 화자 발 기준 가슴 높이
[SerializeField] private float _hudForwardOffset = 0.5f; // 화자→플레이어 방향으로 띄울 거리
[SerializeField] private float _hudLateralOffset = 0f; // 좌우 오프셋 (+ 플레이어 시점 오른쪽)
private Dictionary<string, DialogGroup> _dialogGroupMap;
private Dictionary<string, DialogGroup> _regionMap;
private Animator _animator;
private int _initialGestureHash;
private int _initialExpressionHash;
@@ -25,9 +33,9 @@ public class DialogPlayer : MonoBehaviour
private void Awake()
{
_dialogGroupMap = new Dictionary<string, DialogGroup>();
foreach (var g in _dialogGroups)
_dialogGroupMap[g.DialogGroupName] = g;
_regionMap = new Dictionary<string, DialogGroup>();
foreach (var e in _regionGroups)
if (e.Group != null) _regionMap[e.Region] = e.Group;
_animator = GetComponentInChildren<Animator>();
@@ -44,17 +52,17 @@ private void Awake()
public async Awaitable Play()
{
var groupName = ResolveGroupName();
if (groupName != null)
await Play(groupName);
var region = ResolveRegion();
if (region != null)
await Play(region);
}
// 현재 영역에 맞는 그룹명. 영역이 없거나 매칭 그룹이 없으면 첫 그룹으로 폴백.
private string ResolveGroupName()
// 현재 영역. 영역이 없거나 매칭 그룹이 없으면 리스트 첫 항목으로 폴백.
private string ResolveRegion()
{
if (!string.IsNullOrEmpty(_currentRegion) && _dialogGroupMap.ContainsKey(_currentRegion))
if (!string.IsNullOrEmpty(_currentRegion) && _regionMap.ContainsKey(_currentRegion))
return _currentRegion;
return _dialogGroups.Count > 0 ? _dialogGroups[0].DialogGroupName : null;
return _regionGroups.Count > 0 ? _regionGroups[0].Region : null;
}
// 영역 전환 (DialogRegion 트리거가 호출). 다음 Play()부터 해당 영역 대화가 재생됨.
@@ -62,12 +70,12 @@ private string ResolveGroupName()
public string CurrentRegion => _currentRegion;
public async Awaitable Play(string groupName)
public async Awaitable Play(string region)
{
if (IsPlaying) return;
if (!_dialogGroupMap.TryGetValue(groupName, out var group))
if (!_regionMap.TryGetValue(region, out var group))
{
Debug.LogWarning($"[DialogPlayer] 그룹 없음: {groupName}");
Debug.LogWarning($"[DialogPlayer] 영역 대화 없음: {region}");
return;
}