대화로직 수정중

This commit is contained in:
2026-06-22 11:32:17 +09:00
parent 8c764be378
commit 3ff479e357
13 changed files with 636 additions and 8 deletions

View File

@@ -7,6 +7,9 @@ public class DialogPlayer : MonoBehaviour
{
[SerializeField] private List<DialogGroup> _dialogGroups;
[Header("Region")]
[SerializeField] private string _currentRegion; // 현재 영역(DialogGroup 이름). DialogRegion 트리거가 갱신
[Header("Dialog HUD Placement")] // 씬에서 캐릭터 위치/주변(벽 등)에 맞춰 조절
[SerializeField] private float _hudChestHeight = 1.2f; // 화자 발 기준 가슴 높이
[SerializeField] private float _hudForwardOffset = 0.5f; // 화자→플레이어 방향으로 띄울 거리
@@ -41,10 +44,24 @@ private void Awake()
public async Awaitable Play()
{
if(_dialogGroups.Count > 0)
_ = Play(_dialogGroups[0].DialogGroupName);
var groupName = ResolveGroupName();
if (groupName != null)
await Play(groupName);
}
// 현재 영역에 맞는 그룹명. 영역이 없거나 매칭 그룹이 없으면 첫 그룹으로 폴백.
private string ResolveGroupName()
{
if (!string.IsNullOrEmpty(_currentRegion) && _dialogGroupMap.ContainsKey(_currentRegion))
return _currentRegion;
return _dialogGroups.Count > 0 ? _dialogGroups[0].DialogGroupName : null;
}
// 영역 전환 (DialogRegion 트리거가 호출). 다음 Play()부터 해당 영역 대화가 재생됨.
public void SetRegion(string region) => _currentRegion = region;
public string CurrentRegion => _currentRegion;
public async Awaitable Play(string groupName)
{
if (IsPlaying) return;

View File

@@ -0,0 +1,27 @@
using UnityEngine;
// 영역 트리거. 이 콜라이더(isTrigger) 안으로 NPC(DialogPlayer 보유)가 들어오면
// 그 NPC의 현재 영역을 _regionKey로 전환한다.
// _regionKey는 해당 영역에서 재생할 DialogGroup의 이름과 일치해야 한다 (예: "Coast", "Hill").
//
// 주의: OnTriggerEnter가 동작하려면 들어오는 쪽(또는 트리거 쪽)에 Rigidbody가 있어야 하고,
// 이 오브젝트의 Collider는 Is Trigger여야 한다.
[RequireComponent(typeof(Collider))]
public class DialogRegion : MonoBehaviour
{
[SerializeField] private string _regionKey; // DialogGroup 이름과 일치
private void Reset()
{
// 컴포넌트 추가 시 편의상 트리거로 설정
var col = GetComponent<Collider>();
if (col != null) col.isTrigger = true;
}
private void OnTriggerEnter(Collider other)
{
var player = other.GetComponentInParent<DialogPlayer>();
if (player != null)
player.SetRegion(_regionKey);
}
}