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

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 1260e02c08174fe4ca1dd0e7a224de15
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 23800000
userData:
assetBundleName:
assetBundleVariant:

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;
}

View File

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

View File

@@ -0,0 +1,44 @@
using UnityEngine;
using UnityEngine.AI;
// 대상(보통 플레이어)을 NavMesh 위에서 따라다니는 간단한 동행 스크립트.
// 속도/회전속도/가속/높이(Base Offset) 등은 NavMeshAgent 컴포넌트에서 설정한다.
[RequireComponent(typeof(NavMeshAgent))]
public class FollowObject : MonoBehaviour
{
[Header("Target")]
[SerializeField] private Transform _target; // 비워두면 Camera.main 사용
[Header("Follow")]
[SerializeField] private float _followDistance = 3.0f; // 이 거리 안이면 멈춤 (= Agent stoppingDistance)
[SerializeField] private float _repathInterval = 0.2f; // 목적지 갱신 주기(초)
private NavMeshAgent _agent;
private float _repathTimer;
private void Awake()
{
_agent = GetComponent<NavMeshAgent>();
_agent.stoppingDistance = _followDistance;
}
private void Update()
{
var target = ResolveTarget();
if (target == null || !_agent.isOnNavMesh) return;
_repathTimer -= Time.deltaTime;
if (_repathTimer > 0f) return;
_repathTimer = _repathInterval;
_agent.SetDestination(target.position); // NavMesh가 지면/경사/장애물을 알아서 처리
}
private Transform ResolveTarget()
{
if (_target != null) return _target;
return Camera.main != null ? Camera.main.transform : null;
}
public void SetTarget(Transform target) => _target = target;
}

View File

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

View File

@@ -10,7 +10,7 @@ MonoBehaviour:
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 790b4d75d92f4b0984310a268dbd952f, type: 3}
m_Name: Fairy_CatsRoom
m_Name: Fairy_CatsRoom_Area1
m_EditorClassIdentifier: Unity.GraphToolkit.Editor::Unity.GraphToolkit.Editor.Implementation.GraphObjectImp
m_GraphModel:
rid: 6595524353106116630
@@ -28,7 +28,7 @@ MonoBehaviour:
m_HashGuid:
serializedVersion: 2
Hash: 4a8e76c6951ccabf2ccc35633c48b624
m_Name:
m_Name: Fairy_CatsRoom_Area1
m_GraphNodeModels:
- rid: 6595524353106116633
- rid: 6595524353106116635

View File

@@ -0,0 +1,387 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &1
MonoBehaviour:
m_ObjectHideFlags: 61
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 790b4d75d92f4b0984310a268dbd952f, type: 3}
m_Name: Fairy_CatsRoom_Area2
m_EditorClassIdentifier: Unity.GraphToolkit.Editor::Unity.GraphToolkit.Editor.Implementation.GraphObjectImp
m_GraphModel:
rid: 6595524353106116630
references:
version: 2
RefIds:
- rid: -2
type: {class: , ns: , asm: }
- rid: 6595524353106116630
type: {class: GraphModelImp, ns: Unity.GraphToolkit.Editor.Implementation, asm: Unity.GraphToolkit.Editor}
data:
m_Guid:
m_Value0: 13819889836145151562
m_Value1: 2645381255326452780
m_HashGuid:
serializedVersion: 2
Hash: 4a8e76c6951ccabf2ccc35633c48b624
m_Name: Fairy_CatsRoom_Area2
m_GraphNodeModels:
- rid: 6595524353106116633
- rid: 6595524353106116635
- rid: 6595524353106116646
m_GraphWireModels:
- rid: 6595524353106116636
- rid: 6595524353106116647
m_GraphStickyNoteModels: []
m_GraphPlacematModels: []
m_GraphVariableModels: []
m_GraphPortalModels: []
m_SectionModels:
- rid: 6595524353106116631
m_LocalSubgraphs: []
m_LastKnownBounds:
serializedVersion: 2
x: 222
y: 84
width: 923
height: 341
m_GraphElementMetaData:
- m_Guid:
m_Value0: 14845512388065122572
m_Value1: 17804268460506216482
m_HashGuid:
serializedVersion: 2
Hash: 0c5948afdcda05ce22f82972d57715f7
m_Category: 0
m_Index: 0
- m_Guid:
m_Value0: 7989713923298697385
m_Value1: 15604869423937906234
m_HashGuid:
serializedVersion: 2
Hash: a920365f7b2ae16e3a662c1c10a28fd8
m_Category: 0
m_Index: 1
- m_Guid:
m_Value0: 5269650743910428719
m_Value1: 257959026697812224
m_HashGuid:
serializedVersion: 2
Hash: 2f7027896e8f214900b9ed385e749403
m_Category: 2
m_Index: 0
- m_Guid:
m_Value0: 7697830479301862552
m_Value1: 13043115897654624489
m_HashGuid:
serializedVersion: 2
Hash: 9864f63b0930d46ae940f4b3cd7402b5
m_Category: 0
m_Index: 2
- m_Guid:
m_Value0: 13678802302849805841
m_Value1: 5869810211712229956
m_HashGuid:
serializedVersion: 2
Hash: 116e289638ded4bd446211b849c17551
m_Category: 2
m_Index: 1
m_EntryPoint:
rid: 6595524353106116633
m_Graph:
rid: 6595524353106116632
- rid: 6595524353106116631
type: {class: SectionModel, ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor}
data:
m_Guid:
m_Value0: 13482299192089173763
m_Value1: 8100932157345530803
m_HashGuid:
serializedVersion: 2
Hash: 03df02d4aebf1abbb3831e64e04a6c70
m_Version: 2
m_Items: []
m_Title:
- rid: 6595524353106116632
type: {class: DialogGraph, ns: WhaleAdventure.Dialog.GraphTool.Editor, asm: Assembly-CSharp-Editor}
data:
- rid: 6595524353106116633
type: {class: UserNodeModelImp, ns: Unity.GraphToolkit.Editor.Implementation, asm: Unity.GraphToolkit.Editor}
data:
m_Guid:
m_Value0: 14845512388065122572
m_Value1: 17804268460506216482
m_HashGuid:
serializedVersion: 2
Hash: 0c5948afdcda05ce22f82972d57715f7
m_Version: 2
m_Position: {x: 222.2174, y: 116.434784}
m_Title:
m_Tooltip:
m_NodePreviewModel:
rid: -2
m_State: 0
m_InputConstantsById:
m_KeyList: []
m_ValueList: []
m_InputPortInfos:
expandedPortsById:
m_KeyList: []
m_ValueList:
m_OutputPortInfos:
expandedPortsById:
m_KeyList: []
m_ValueList:
m_Collapsed: 0
m_CurrentModeIndex: 0
m_ElementColor:
m_Color: {r: 0, g: 0, b: 0, a: 0}
m_HasUserColor: 0
m_Node:
rid: 6595524353106116634
- rid: 6595524353106116634
type: {class: DialogStartNode, ns: WhaleAdventure.Dialog.GraphTool.Editor, asm: Assembly-CSharp-Editor}
data:
- rid: 6595524353106116635
type: {class: UserNodeModelImp, ns: Unity.GraphToolkit.Editor.Implementation, asm: Unity.GraphToolkit.Editor}
data:
m_Guid:
m_Value0: 7989713923298697385
m_Value1: 15604869423937906234
m_HashGuid:
serializedVersion: 2
Hash: a920365f7b2ae16e3a662c1c10a28fd8
m_Version: 2
m_Position: {x: 430.9063, y: 86.04323}
m_Title:
m_Tooltip:
m_NodePreviewModel:
rid: -2
m_State: 0
m_InputConstantsById:
m_KeyList:
- __option_ChoiceCount
- Speaker
- TalkText
- Gesture
- Expression
- Voice
- LineDuration
- LookAtPlayer
m_ValueList:
- rid: 6595524353106116637
- rid: 6595524353106116638
- rid: 6595524353106116639
- rid: 6595524353106116640
- rid: 6595524353106116641
- rid: 6595524353106116642
- rid: 6595524353106116643
- rid: 6595524353106116644
m_InputPortInfos:
expandedPortsById:
m_KeyList: []
m_ValueList:
m_OutputPortInfos:
expandedPortsById:
m_KeyList: []
m_ValueList:
m_Collapsed: 0
m_CurrentModeIndex: 0
m_ElementColor:
m_Color: {r: 0, g: 0, b: 0, a: 0}
m_HasUserColor: 0
m_Node:
rid: 6595524353106116645
- rid: 6595524353106116636
type: {class: WireModel, ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor}
data:
m_Guid:
m_Value0: 5269650743910428719
m_Value1: 257959026697812224
m_HashGuid:
serializedVersion: 2
Hash: 2f7027896e8f214900b9ed385e749403
m_Version: 2
m_FromPortReference:
m_NodeModelGuid:
m_Value0: 14845512388065122572
m_Value1: 17804268460506216482
m_NodeModelHashGuid:
serializedVersion: 2
Hash: 0c5948afdcda05ce22f82972d57715f7
m_UniqueId: Out
m_PortDirection: 2
m_PortOrientation: 0
m_Title:
m_ToPortReference:
m_NodeModelGuid:
m_Value0: 7989713923298697385
m_Value1: 15604869423937906234
m_NodeModelHashGuid:
serializedVersion: 2
Hash: a920365f7b2ae16e3a662c1c10a28fd8
m_UniqueId: In
m_PortDirection: 1
m_PortOrientation: 0
m_Title:
- rid: 6595524353106116637
type: {class: 'Constant`1[[System.Int32, mscorlib]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor}
data:
m_Value: 0
- rid: 6595524353106116638
type: {class: 'Constant`1[[CharacterData, Assembly-CSharp]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor}
data:
m_Value: {fileID: 11400000, guid: 816884903bb3c4d478520286d768c304, type: 2}
- rid: 6595524353106116639
type: {class: 'Constant`1[[WhaleAdventure.Dialog.GraphTool.Editor.DialogText, Assembly-CSharp-Editor]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor}
data:
m_Value:
Value: "\uACE0\uC591\uC774\uB4E4\uC774 \uC74C\uC545\uC744 \uC88B\uC544\uD558\uB294
\uBAA8\uC591\uC774\uC57C."
- rid: 6595524353106116640
type: {class: 'Constant`1[[GestureData, Assembly-CSharp]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor}
data:
m_Value: {fileID: 0}
- rid: 6595524353106116641
type: {class: 'Constant`1[[ExpressionData, Assembly-CSharp]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor}
data:
m_Value: {fileID: 0}
- rid: 6595524353106116642
type: {class: 'Constant`1[[VoiceClip, Assembly-CSharp]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor}
data:
m_Value: {fileID: 0}
- rid: 6595524353106116643
type: {class: 'Constant`1[[System.Single, mscorlib]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor}
data:
m_Value: 5
- rid: 6595524353106116644
type: {class: 'Constant`1[[System.Boolean, mscorlib]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor}
data:
m_Value: 1
- rid: 6595524353106116645
type: {class: DialogLineNode, ns: WhaleAdventure.Dialog.GraphTool.Editor, asm: Assembly-CSharp-Editor}
data:
- rid: 6595524353106116646
type: {class: UserNodeModelImp, ns: Unity.GraphToolkit.Editor.Implementation, asm: Unity.GraphToolkit.Editor}
data:
m_Guid:
m_Value0: 7697830479301862552
m_Value1: 13043115897654624489
m_HashGuid:
serializedVersion: 2
Hash: 9864f63b0930d46ae940f4b3cd7402b5
m_Version: 2
m_Position: {x: 806, y: 84}
m_Title:
m_Tooltip:
m_NodePreviewModel:
rid: -2
m_State: 0
m_InputConstantsById:
m_KeyList:
- __option_ChoiceCount
- Speaker
- TalkText
- Gesture
- Expression
- Voice
- LineDuration
- LookAtPlayer
m_ValueList:
- rid: 6595524353106116648
- rid: 6595524353106116649
- rid: 6595524353106116650
- rid: 6595524353106116651
- rid: 6595524353106116652
- rid: 6595524353106116653
- rid: 6595524353106116654
- rid: 6595524353106116655
m_InputPortInfos:
expandedPortsById:
m_KeyList: []
m_ValueList:
m_OutputPortInfos:
expandedPortsById:
m_KeyList: []
m_ValueList:
m_Collapsed: 0
m_CurrentModeIndex: 0
m_ElementColor:
m_Color: {r: 0, g: 0, b: 0, a: 0}
m_HasUserColor: 0
m_Node:
rid: 6595524353106116656
- rid: 6595524353106116647
type: {class: WireModel, ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor}
data:
m_Guid:
m_Value0: 13678802302849805841
m_Value1: 5869810211712229956
m_HashGuid:
serializedVersion: 2
Hash: 116e289638ded4bd446211b849c17551
m_Version: 2
m_FromPortReference:
m_NodeModelGuid:
m_Value0: 7989713923298697385
m_Value1: 15604869423937906234
m_NodeModelHashGuid:
serializedVersion: 2
Hash: a920365f7b2ae16e3a662c1c10a28fd8
m_UniqueId: Out
m_PortDirection: 2
m_PortOrientation: 0
m_Title:
m_ToPortReference:
m_NodeModelGuid:
m_Value0: 7697830479301862552
m_Value1: 13043115897654624489
m_NodeModelHashGuid:
serializedVersion: 2
Hash: 9864f63b0930d46ae940f4b3cd7402b5
m_UniqueId: In
m_PortDirection: 1
m_PortOrientation: 0
m_Title:
- rid: 6595524353106116648
type: {class: 'Constant`1[[System.Int32, mscorlib]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor}
data:
m_Value: 0
- rid: 6595524353106116649
type: {class: 'Constant`1[[CharacterData, Assembly-CSharp]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor}
data:
m_Value: {fileID: 11400000, guid: 816884903bb3c4d478520286d768c304, type: 2}
- rid: 6595524353106116650
type: {class: 'Constant`1[[WhaleAdventure.Dialog.GraphTool.Editor.DialogText, Assembly-CSharp-Editor]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor}
data:
m_Value:
Value: "\uACE0\uC591\uC774\uB4E4\uC758 \uC74C\uC545\uC5D0 \uB9DE\uCDB0
\uB098\uBB34\uBC14\uAC00\uC9C0\uB97C \uB450\uB4DC\uB824\uC11C \uACE0\uC591\uC774\uB4E4\uC744
\uB9CC\uC871\uC2DC\uCF1C\uBCF4\uC790."
- rid: 6595524353106116651
type: {class: 'Constant`1[[GestureData, Assembly-CSharp]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor}
data:
m_Value: {fileID: 0}
- rid: 6595524353106116652
type: {class: 'Constant`1[[ExpressionData, Assembly-CSharp]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor}
data:
m_Value: {fileID: 0}
- rid: 6595524353106116653
type: {class: 'Constant`1[[VoiceClip, Assembly-CSharp]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor}
data:
m_Value: {fileID: 0}
- rid: 6595524353106116654
type: {class: 'Constant`1[[System.Single, mscorlib]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor}
data:
m_Value: 5
- rid: 6595524353106116655
type: {class: 'Constant`1[[System.Boolean, mscorlib]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor}
data:
m_Value: 0
- rid: 6595524353106116656
type: {class: DialogLineNode, ns: WhaleAdventure.Dialog.GraphTool.Editor, asm: Assembly-CSharp-Editor}
data:

View File

@@ -0,0 +1,10 @@
fileFormatVersion: 2
guid: 658ff34671008804094c53a5d3d2b9a3
ScriptedImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 2
userData:
assetBundleName:
assetBundleVariant:
script: {fileID: 11500000, guid: 2ae5ca89bbed445479d9023586f0c041, type: 3}