대화구조 수정
This commit is contained in:
BIN
Assets/01_Scenes/TestScene.unity
LFS
BIN
Assets/01_Scenes/TestScene.unity
LFS
Binary file not shown.
@@ -3,16 +3,23 @@
|
|||||||
using UnityEngine.InputSystem;
|
using UnityEngine.InputSystem;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
|
|
||||||
[RequireComponent(typeof(CharacterVoiceObject))]
|
|
||||||
public class DialogPlayer : MonoBehaviour
|
public class DialogPlayer : MonoBehaviour
|
||||||
{
|
{
|
||||||
// 대화 후보는 인스펙터가 아니라 StoryDatabase에서 온다 —
|
// 대화 후보는 인스펙터가 아니라 StoryDatabase에서 온다 —
|
||||||
// 현재 장소(LocationManager.Current) + 이 캐릭터의 비트 중 조건을 만족하는 것들.
|
// 현재 장소(LocationManager.Current) + 이 캐릭터의 비트 중 조건을 만족하는 것들.
|
||||||
// 여럿이면 선택 메뉴가 뜨고, DB 목록에서 위에 있을수록 우선순위가 높다.
|
// 여럿이면 선택 메뉴가 뜨고, DB 목록에서 위에 있을수록 우선순위가 높다.
|
||||||
|
//
|
||||||
|
// CharacterVoiceObject는 선택이다:
|
||||||
|
// 있으면 → NPC 플레이어. 그 캐릭터의 비트(말을 걸어야 시작되는 대화)를 재생한다.
|
||||||
|
// 없으면 → 씬 플레이어. Character가 빈 "장소 비트"를 재생한다 (서술·진입 연출 등).
|
||||||
|
// LocationManager가 장소 입장 직후 자동으로 호출한다.
|
||||||
|
|
||||||
private CharacterVoiceObject _voice; // 이 NPC의 캐릭터 정보 (호감도 조건 대상)
|
private CharacterVoiceObject _voice; // 이 NPC의 캐릭터 정보 (없으면 씬 플레이어)
|
||||||
private Animator _animator;
|
private Animator _animator;
|
||||||
|
|
||||||
|
// 이 플레이어가 담당하는 캐릭터. 씬 플레이어는 null이고, 그게 곧 "장소 비트" 조회 키가 된다.
|
||||||
|
private CharacterData OwnerCharacter => _voice != null ? _voice.Character : null;
|
||||||
|
|
||||||
// 대화 중 제스처/표정을 재생한 Animator들의 원래 상태 — 대화 종료 시 전부 복원.
|
// 대화 중 제스처/표정을 재생한 Animator들의 원래 상태 — 대화 종료 시 전부 복원.
|
||||||
// (끼어든 다른 NPC의 Animator도 포함되므로 딕셔너리로 추적한다)
|
// (끼어든 다른 NPC의 Animator도 포함되므로 딕셔너리로 추적한다)
|
||||||
private readonly Dictionary<Animator, (int gestureHash, int expressionHash, bool hasExpression)> _touchedAnimators = new();
|
private readonly Dictionary<Animator, (int gestureHash, int expressionHash, bool hasExpression)> _touchedAnimators = new();
|
||||||
@@ -61,7 +68,12 @@ private void OnDestroy()
|
|||||||
if (_entryInProgress == this) _entryInProgress = null;
|
if (_entryInProgress == this) _entryInProgress = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Awaitable Play()
|
// 장소 비트를 자동으로 시작한다 (LocationManager가 장소 입장 직후 호출).
|
||||||
|
// 선택 메뉴를 띄우지 않는다 — 메뉴는 플레이어가 "말을 건" 경우의 UI다.
|
||||||
|
public void PlayAuto() => _ = Play(autoSelect: true);
|
||||||
|
|
||||||
|
// autoSelect가 true면 후보가 여럿이어도 메뉴 없이 최상단(우선순위 1위) 비트를 바로 재생한다.
|
||||||
|
public async Awaitable Play(bool autoSelect = false)
|
||||||
{
|
{
|
||||||
if (IsPlaying) return;
|
if (IsPlaying) return;
|
||||||
|
|
||||||
@@ -85,7 +97,9 @@ public async Awaitable Play()
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
StoryBeat beat = playable.Count == 1 ? playable[0] : await SelectBeat(playable);
|
StoryBeat beat = playable.Count == 1 || autoSelect
|
||||||
|
? playable[0]
|
||||||
|
: await SelectBeat(playable);
|
||||||
if (beat == null) return; // 선택 대기 중 취소됨 (다른 NPC와 대화 시작, 씬 전환 등)
|
if (beat == null) return; // 선택 대기 중 취소됨 (다른 NPC와 대화 시작, 씬 전환 등)
|
||||||
|
|
||||||
_entryInProgress = this; // 여기서부터 실제 대사 재생 — 끝날 때까지 다른 NPC 상호작용 무시
|
_entryInProgress = this; // 여기서부터 실제 대사 재생 — 끝날 때까지 다른 NPC 상호작용 무시
|
||||||
@@ -153,7 +167,7 @@ private List<StoryBeat> FindPlayableBeats()
|
|||||||
Debug.LogWarning($"[DialogPlayer] LocationManager 또는 StoryDatabase가 없음: {name}");
|
Debug.LogWarning($"[DialogPlayer] LocationManager 또는 StoryDatabase가 없음: {name}");
|
||||||
return new List<StoryBeat>();
|
return new List<StoryBeat>();
|
||||||
}
|
}
|
||||||
return lm.Database.GetPlayableBeats(lm.Current, _voice.Character);
|
return lm.Database.GetPlayableBeats(lm.Current, OwnerCharacter);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 재생 가능한 대화가 여럿일 때 DialogEnterHud로 플레이어에게 고르게 한다. 취소되면 null.
|
// 재생 가능한 대화가 여럿일 때 DialogEnterHud로 플레이어에게 고르게 한다. 취소되면 null.
|
||||||
@@ -310,7 +324,7 @@ private async Awaitable<bool> PlayNode(DialogNode node)
|
|||||||
// 호감도 증감 — 화자 기준, 화자가 비어 있으면 대화 주인 NPC
|
// 호감도 증감 — 화자 기준, 화자가 비어 있으면 대화 주인 NPC
|
||||||
if (node.Affection != 0)
|
if (node.Affection != 0)
|
||||||
{
|
{
|
||||||
var affectionTarget = node.Speaker != null ? node.Speaker : _voice.Character;
|
var affectionTarget = node.Speaker != null ? node.Speaker : OwnerCharacter;
|
||||||
StoryManager.Instance.AddAffection(affectionTarget, node.Affection);
|
StoryManager.Instance.AddAffection(affectionTarget, node.Affection);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -380,7 +394,7 @@ private bool IsAffectionMet(DialogNode node)
|
|||||||
var req = requirements[i];
|
var req = requirements[i];
|
||||||
if (req == null) continue;
|
if (req == null) continue;
|
||||||
|
|
||||||
var target = req.Character != null ? req.Character : _voice.Character;
|
var target = req.Character != null ? req.Character : OwnerCharacter;
|
||||||
group &= req.IsMet(story.GetAffection(target));
|
group &= req.IsMet(story.GetAffection(target));
|
||||||
|
|
||||||
// 다음 연결자가 OR이거나 마지막이면 AND 그룹을 닫고 OR로 합친다
|
// 다음 연결자가 OR이거나 마지막이면 AND 그룹을 닫고 OR로 합친다
|
||||||
@@ -556,6 +570,7 @@ private async Awaitable WaitForAdvanceInput()
|
|||||||
//테스트용 — 캐릭터를 클릭하면 대화 시작 (Collider2D가 있어야 잡힌다)
|
//테스트용 — 캐릭터를 클릭하면 대화 시작 (Collider2D가 있어야 잡힌다)
|
||||||
private void Update()
|
private void Update()
|
||||||
{
|
{
|
||||||
|
if (_voice == null) return; //씬 플레이어(장소 비트 담당)는 클릭 대상이 아니다
|
||||||
if (Mouse.current == null) return;
|
if (Mouse.current == null) return;
|
||||||
if (!Mouse.current.leftButton.wasPressedThisFrame) return;
|
if (!Mouse.current.leftButton.wasPressedThisFrame) return;
|
||||||
if (Camera.main == null) return;
|
if (Camera.main == null) return;
|
||||||
|
|||||||
@@ -8,8 +8,18 @@ public class CharacterVoiceObject : MonoBehaviour
|
|||||||
|
|
||||||
private static readonly Dictionary<CharacterData, CharacterVoiceObject> _registry = new();
|
private static readonly Dictionary<CharacterData, CharacterVoiceObject> _registry = new();
|
||||||
|
|
||||||
private void OnEnable() => _registry[Character] = this;
|
// Character를 비워 두면 Dictionary 널 키로 예외가 나므로 등록하지 않는다.
|
||||||
private void OnDisable() => _registry.Remove(Character);
|
// (화자 없는 대화는 CharacterVoiceObject 자체를 붙이지 않는 씬 플레이어로 처리한다)
|
||||||
|
private void OnEnable()
|
||||||
|
{
|
||||||
|
if (Character != null) _registry[Character] = this;
|
||||||
|
else Debug.LogWarning($"[CharacterVoiceObject] Character가 비어 있어 등록하지 않음: {name}");
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnDisable()
|
||||||
|
{
|
||||||
|
if (Character != null) _registry.Remove(Character);
|
||||||
|
}
|
||||||
|
|
||||||
public static CharacterVoiceObject Find(CharacterData data)
|
public static CharacterVoiceObject Find(CharacterData data)
|
||||||
=> _registry.TryGetValue(data, out var obj) ? obj : null;
|
=> _registry.TryGetValue(data, out var obj) ? obj : null;
|
||||||
|
|||||||
@@ -14,6 +14,11 @@ public class LocationManager : MonoBehaviour
|
|||||||
[Tooltip("게임 시작 시 입장할 장소")]
|
[Tooltip("게임 시작 시 입장할 장소")]
|
||||||
[SerializeField] private LocationData _startLocation;
|
[SerializeField] private LocationData _startLocation;
|
||||||
|
|
||||||
|
[Tooltip("장소 비트(StoryBeat의 Character를 비워 둔 항목)를 재생할 DialogPlayer. " +
|
||||||
|
"CharacterVoiceObject 없는 씬 오브젝트에 DialogPlayer만 붙여 연결한다. " +
|
||||||
|
"비우면 장소 자동 진행을 쓰지 않는다")]
|
||||||
|
[SerializeField] private DialogPlayer _scenePlayer;
|
||||||
|
|
||||||
public StoryDatabase Database => _database;
|
public StoryDatabase Database => _database;
|
||||||
public LocationData Current { get; private set; }
|
public LocationData Current { get; private set; }
|
||||||
|
|
||||||
@@ -66,6 +71,12 @@ public void MoveTo(LocationData location)
|
|||||||
? Instantiate(location.Prefab, _locationRoot)
|
? Instantiate(location.Prefab, _locationRoot)
|
||||||
: null;
|
: null;
|
||||||
RefreshSlots();
|
RefreshSlots();
|
||||||
|
|
||||||
|
// 장소 비트 자동 진행 — 프리팹 생성과 슬롯 갱신이 끝난 뒤에 시작한다.
|
||||||
|
// 조건을 만족하는 장소 비트가 없으면 아무 일도 일어나지 않는다.
|
||||||
|
// 반복 재생을 막으려면 그 비트의 OnceOnly를 켜 둘 것.
|
||||||
|
if (_scenePlayer != null)
|
||||||
|
_scenePlayer.PlayAuto();
|
||||||
}
|
}
|
||||||
|
|
||||||
// 대화로 진행도/트리거가 바뀌면 등장 캐릭터도 달라질 수 있다
|
// 대화로 진행도/트리거가 바뀌면 등장 캐릭터도 달라질 수 있다
|
||||||
|
|||||||
@@ -12,7 +12,8 @@ public class StoryBeat
|
|||||||
[Tooltip("이 대화가 일어나는 장소")]
|
[Tooltip("이 대화가 일어나는 장소")]
|
||||||
public LocationData Location;
|
public LocationData Location;
|
||||||
|
|
||||||
[Tooltip("대화를 거는 캐릭터")]
|
[Tooltip("대화를 거는 캐릭터. 비우면 '장소 비트' — 말을 거는 대상 없이 " +
|
||||||
|
"이 장소에 입장하면 자동으로 재생된다 (서술·챕터 진입 연출 등)")]
|
||||||
public CharacterData Character;
|
public CharacterData Character;
|
||||||
|
|
||||||
[Tooltip("재생할 대화 그래프 (.dlg = DialogGroup)")]
|
[Tooltip("재생할 대화 그래프 (.dlg = DialogGroup)")]
|
||||||
@@ -21,6 +22,10 @@ public class StoryBeat
|
|||||||
[Tooltip("활성 조건 (진행도/호감도 범위 + 트리거)")]
|
[Tooltip("활성 조건 (진행도/호감도 범위 + 트리거)")]
|
||||||
public DialogCondition Condition = new();
|
public DialogCondition Condition = new();
|
||||||
|
|
||||||
|
[Tooltip("켜면 한 번 완료한 뒤에는 다시 후보에 오르지 않는다. " +
|
||||||
|
"장소 비트처럼 입장할 때마다 반복되면 안 되는 대화에 필수")]
|
||||||
|
public bool OnceOnly;
|
||||||
|
|
||||||
[Tooltip("이 대화를 처음 완료하면 메인 진행도 +N (필수 대화가 아니면 0)")]
|
[Tooltip("이 대화를 처음 완료하면 메인 진행도 +N (필수 대화가 아니면 0)")]
|
||||||
[Min(0)] public int ProgressOnComplete;
|
[Min(0)] public int ProgressOnComplete;
|
||||||
|
|
||||||
|
|||||||
@@ -42,10 +42,21 @@ public StoryBeat FindBeat(DialogGroup group)
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// character가 null이면 "장소 비트"(Character를 비워 둔 항목)를 찾는다 —
|
||||||
|
// 말을 거는 대상 없이 장소 입장 시 자동 재생되는 대화다.
|
||||||
private static bool IsPlayable(StoryBeat beat, LocationData location, CharacterData character)
|
private static bool IsPlayable(StoryBeat beat, LocationData location, CharacterData character)
|
||||||
{
|
{
|
||||||
if (beat.Location != location || beat.Character != character || beat.Group == null)
|
if (beat.Location != location || beat.Character != character || beat.Group == null)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
// 1회성 비트는 완료 이력이 있으면 후보에서 빠진다 (장소 비트가 입장마다 반복되는 것 방지)
|
||||||
|
if (beat.OnceOnly)
|
||||||
|
{
|
||||||
|
var story = StoryManager.Instance;
|
||||||
|
if (story != null && story.IsDialogCompleted(beat.Group.name))
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
return beat.Condition == null || beat.Condition.IsMet(character);
|
return beat.Condition == null || beat.Condition.IsMet(character);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -24,6 +24,17 @@ public class TypewriterStyle : ScriptableObject
|
|||||||
|
|
||||||
public Color TextColor = Color.white;
|
public Color TextColor = Color.white;
|
||||||
|
|
||||||
|
[Header("Emphasis")]
|
||||||
|
[Tooltip("대사에 [[강조]] 로 감싼 부분이 이 색으로 표시된다")]
|
||||||
|
public Color EmphasisColor = new Color(1f, 0.23f, 0.19f);
|
||||||
|
|
||||||
|
[Tooltip("강조 단어가 밝아지며 맥동하는 세기. 0이면 맥동 없이 색만 바뀐다 " +
|
||||||
|
"(0이면 매 프레임 다시 그리지 않으므로 비용도 없다)")]
|
||||||
|
[Range(0f, 1f)] public float GlowStrength = 0.45f;
|
||||||
|
|
||||||
|
[Tooltip("맥동 속도 (초당 왕복 횟수)")]
|
||||||
|
[Min(0.01f)] public float GlowSpeed = 1.5f;
|
||||||
|
|
||||||
[Header("Sound")]
|
[Header("Sound")]
|
||||||
[Tooltip("타이핑되는 동안 루프로 재생할 사운드. 비우면 무음. " +
|
[Tooltip("타이핑되는 동안 루프로 재생할 사운드. 비우면 무음. " +
|
||||||
"글자마다 개별 재생이 아니라, 타이핑이 끝나거나 스킵되면 멈춘다")]
|
"글자마다 개별 재생이 아니라, 타이핑이 끝나거나 스킵되면 멈춘다")]
|
||||||
|
|||||||
@@ -28,6 +28,10 @@ public class DialogHud : MonoBehaviour
|
|||||||
private string _speakerText = string.Empty;
|
private string _speakerText = string.Empty;
|
||||||
private Typewriter _typewriter;
|
private Typewriter _typewriter;
|
||||||
|
|
||||||
|
// 강조 단어([[...]])의 맥동 연출. 지금 대사에 강조가 있을 때만 매 프레임 다시 그린다.
|
||||||
|
private readonly TextGlow _glow = new();
|
||||||
|
private bool _hasEmphasis;
|
||||||
|
|
||||||
// 같은 버전으로 콜백이 중복 호출될 때 헛일을 막는다 (Unity 권장 패턴)
|
// 같은 버전으로 콜백이 중복 호출될 때 헛일을 막는다 (Unity 권장 패턴)
|
||||||
private int _uiVersion = -1;
|
private int _uiVersion = -1;
|
||||||
|
|
||||||
@@ -66,9 +70,21 @@ private void OnUIReload(PanelRenderer panelRenderer, VisualElement root, int ver
|
|||||||
_speakerName = root.Q<Label>("SpeakerName");
|
_speakerName = root.Q<Label>("SpeakerName");
|
||||||
_dialogText = root.Q<Label>("DialogText");
|
_dialogText = root.Q<Label>("DialogText");
|
||||||
|
|
||||||
|
// 글자별 정점 후처리 연결 — Label이 리로드로 새로 만들어질 때마다 다시 걸어야 한다
|
||||||
|
if (_dialogText != null)
|
||||||
|
_dialogText.PostProcessTextVertices = _glow.Process;
|
||||||
|
|
||||||
ApplyState(); // 첫 호출에선 _visible=false라 숨김 상태로 시작한다
|
ApplyState(); // 첫 호출에선 _visible=false라 숨김 상태로 시작한다
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 맥동은 매 프레임 정점을 다시 만들어야 보이므로 리페인트를 요청한다.
|
||||||
|
// 강조가 없는 대사에서는 아무 일도 하지 않는다.
|
||||||
|
private void Update()
|
||||||
|
{
|
||||||
|
if (_visible && _hasEmphasis && _glow.IsAnimating && _dialogText != null)
|
||||||
|
_dialogText.MarkDirtyRepaint();
|
||||||
|
}
|
||||||
|
|
||||||
// 화자 이름 + 대사 표시. 대사는 style(없으면 기본 스타일)로 한 글자씩 드러난다.
|
// 화자 이름 + 대사 표시. 대사는 style(없으면 기본 스타일)로 한 글자씩 드러난다.
|
||||||
// - speakerNameOverride가 비어있지 않으면 CharacterData.Name 대신 그 이름을 표시한다 (예: "???")
|
// - speakerNameOverride가 비어있지 않으면 CharacterData.Name 대신 그 이름을 표시한다 (예: "???")
|
||||||
// - style은 이 대사만의 연출 (DialogNode.Typewriter). 둘 다 비면 한 번에 표시된다.
|
// - style은 이 대사만의 연출 (DialogNode.Typewriter). 둘 다 비면 한 번에 표시된다.
|
||||||
@@ -81,15 +97,22 @@ private void OnUIReload(PanelRenderer panelRenderer, VisualElement root, int ver
|
|||||||
_speakerText = DialogVariables.Format(speakerName); // {key} 토큰 치환
|
_speakerText = DialogVariables.Format(speakerName); // {key} 토큰 치환
|
||||||
_visible = true;
|
_visible = true;
|
||||||
|
|
||||||
|
var effective = style != null ? style : _defaultStyle;
|
||||||
|
|
||||||
|
// 토큰 치환 → 강조 표기 펼치기 순서. 토큰 값 안에 [[...]]가 있어도 강조가 적용된다.
|
||||||
|
string body = DialogMarkup.Expand(DialogVariables.Format(text), effective);
|
||||||
|
_hasEmphasis = body.Contains("<link=" + TextGlow.LINK_ID);
|
||||||
|
_glow.SetStyle(effective);
|
||||||
|
|
||||||
// Begin이 진행 콜백으로 ApplyState를 부르므로 _visible을 먼저 세워 둔다
|
// Begin이 진행 콜백으로 ApplyState를 부르므로 _visible을 먼저 세워 둔다
|
||||||
_typewriter.Begin(DialogVariables.Format(text), style != null ? style : _defaultStyle,
|
_typewriter.Begin(body, effective, destroyCancellationToken);
|
||||||
destroyCancellationToken);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Hide()
|
public void Hide()
|
||||||
{
|
{
|
||||||
_speakerText = string.Empty;
|
_speakerText = string.Empty;
|
||||||
_visible = false;
|
_visible = false;
|
||||||
|
_hasEmphasis = false;
|
||||||
_typewriter.Clear(); // 타이핑 사운드 정지 + ApplyState 호출
|
_typewriter.Clear(); // 타이핑 사운드 정지 + ApplyState 호출
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -97,7 +120,17 @@ public void Hide()
|
|||||||
// 요소가 아직 없으면(리로드 콜백 전) 조용히 넘어가고, 콜백이 오면 같은 함수로 복원된다.
|
// 요소가 아직 없으면(리로드 콜백 전) 조용히 넘어가고, 콜백이 오면 같은 함수로 복원된다.
|
||||||
private void ApplyState()
|
private void ApplyState()
|
||||||
{
|
{
|
||||||
if (_speakerName != null) _speakerName.text = _speakerText;
|
if (_speakerName != null)
|
||||||
|
{
|
||||||
|
_speakerName.text = _speakerText;
|
||||||
|
|
||||||
|
// 서술(화자 없는 대사)에서는 이름표를 감추되 **자리는 그대로 남긴다**.
|
||||||
|
// display:None은 레이아웃에서 요소를 빼버려서 DialogText(flex-grow:1)가 그 공간까지
|
||||||
|
// 차지해 대사가 위로 올라온다. visibility:Hidden은 position이 Relative인 요소의
|
||||||
|
// 공간을 유지하므로, 화자가 있으나 없으나 대사 영역 크기가 동일하다.
|
||||||
|
_speakerName.style.visibility = string.IsNullOrEmpty(_speakerText)
|
||||||
|
? Visibility.Hidden : Visibility.Visible;
|
||||||
|
}
|
||||||
|
|
||||||
if (_dialogText != null)
|
if (_dialogText != null)
|
||||||
{
|
{
|
||||||
|
|||||||
54
Assets/02_Scripts/_UI/DialogMarkup.cs
Normal file
54
Assets/02_Scripts/_UI/DialogMarkup.cs
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
using System;
|
||||||
|
using System.Text;
|
||||||
|
using UnityEngine;
|
||||||
|
|
||||||
|
// 대사 텍스트의 저작용 단축 표기를 리치 텍스트로 펼친다.
|
||||||
|
//
|
||||||
|
// 그날 밤 [[피 묻은 칼]]을 봤습니다
|
||||||
|
// ↓
|
||||||
|
// 그날 밤 <link=glow><color=#FF3B30>피 묻은 칼</color></link>을 봤습니다
|
||||||
|
//
|
||||||
|
// 왜 단축 표기를 두는가: 그래프의 Talk Text 칸에 <color=#FF3B30>을 손으로 쓰면
|
||||||
|
// 오타가 조용히 깨지고, 색을 바꿀 때 모든 대사를 찾아 고쳐야 한다.
|
||||||
|
// 색은 TypewriterStyle.EmphasisColor 한 곳에서 관리된다.
|
||||||
|
//
|
||||||
|
// <link>을 같이 붙이는 이유: TextGlow가 Glyph.linkID로 강조 글자를 식별해 맥동시킨다.
|
||||||
|
public static class DialogMarkup
|
||||||
|
{
|
||||||
|
public const string OPEN = "[[";
|
||||||
|
public const string CLOSE = "]]";
|
||||||
|
|
||||||
|
public static string Expand(string text, TypewriterStyle style)
|
||||||
|
{
|
||||||
|
if (string.IsNullOrEmpty(text) || text.IndexOf(OPEN, StringComparison.Ordinal) < 0)
|
||||||
|
return text;
|
||||||
|
|
||||||
|
string hex = ColorUtility.ToHtmlStringRGB(style != null ? style.EmphasisColor : Color.red);
|
||||||
|
|
||||||
|
var sb = new StringBuilder(text.Length + 48);
|
||||||
|
int i = 0;
|
||||||
|
while (i < text.Length)
|
||||||
|
{
|
||||||
|
int open = text.IndexOf(OPEN, i, StringComparison.Ordinal);
|
||||||
|
if (open < 0)
|
||||||
|
{
|
||||||
|
sb.Append(text, i, text.Length - i);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
int close = text.IndexOf(CLOSE, open + OPEN.Length, StringComparison.Ordinal);
|
||||||
|
if (close < 0)
|
||||||
|
{
|
||||||
|
sb.Append(text, i, text.Length - i); // 닫히지 않은 표기 — 손대지 않고 그대로 둔다
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
sb.Append(text, i, open - i);
|
||||||
|
sb.Append("<link=").Append(TextGlow.LINK_ID).Append("><color=#").Append(hex).Append('>');
|
||||||
|
sb.Append(text, open + OPEN.Length, close - open - OPEN.Length);
|
||||||
|
sb.Append("</color></link>");
|
||||||
|
i = close + CLOSE.Length;
|
||||||
|
}
|
||||||
|
return sb.ToString();
|
||||||
|
}
|
||||||
|
}
|
||||||
2
Assets/02_Scripts/_UI/DialogMarkup.cs.meta
Normal file
2
Assets/02_Scripts/_UI/DialogMarkup.cs.meta
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 880e12adc5032fa4d8771e062c033623
|
||||||
58
Assets/02_Scripts/_UI/TextGlow.cs
Normal file
58
Assets/02_Scripts/_UI/TextGlow.cs
Normal file
@@ -0,0 +1,58 @@
|
|||||||
|
using UnityEngine;
|
||||||
|
using UnityEngine.UIElements;
|
||||||
|
|
||||||
|
// 강조 단어를 맥동시키는 글자별(정점) 효과.
|
||||||
|
//
|
||||||
|
// TextElement.PostProcessTextVertices에 연결하면 UI Toolkit이 글리프 정점을 만든 직후 이 콜백이
|
||||||
|
// 불린다. Glyph.vertices는 NativeSlice<Vertex> — 실제 메시 버퍼를 가리키는 뷰라서, Glyph가
|
||||||
|
// struct로 복사돼도 여기에 쓰면 그대로 화면에 반영된다.
|
||||||
|
//
|
||||||
|
// 대상은 <link=glow>로 표시된 글자뿐이다 (DialogMarkup이 붙인다).
|
||||||
|
// 글리프 순번을 세지 않으므로 태그·공백·줄바꿈에 전혀 영향받지 않는다 —
|
||||||
|
// Glyph에는 원본 문자 인덱스가 없어서 순번을 세는 방식은 추측에 기대야 한다.
|
||||||
|
//
|
||||||
|
// 중요: RGB만 밝게 올리고 **알파는 절대 건드리지 않는다.**
|
||||||
|
// Typewriter가 아직 안 드러난 글자를 <alpha=#00>으로 숨기는데, 알파를 만지면
|
||||||
|
// 아직 나오지 않아야 할 강조 단어가 미리 보여 버린다.
|
||||||
|
public sealed class TextGlow
|
||||||
|
{
|
||||||
|
// DialogMarkup이 붙이는 <link=...> 값. 이 값으로 강조 글자를 식별한다.
|
||||||
|
public const string LINK_ID = "glow";
|
||||||
|
|
||||||
|
private TypewriterStyle _style;
|
||||||
|
|
||||||
|
public void SetStyle(TypewriterStyle style) => _style = style;
|
||||||
|
|
||||||
|
// 맥동이 켜져 있는가 (매 프레임 MarkDirtyRepaint를 부를지 판단용)
|
||||||
|
public bool IsAnimating => _style != null && _style.GlowStrength > 0f;
|
||||||
|
|
||||||
|
public void Process(TextElement.GlyphsEnumerable glyphs)
|
||||||
|
{
|
||||||
|
var style = _style;
|
||||||
|
if (style == null || style.GlowStrength <= 0f) return;
|
||||||
|
|
||||||
|
// 0~1 왕복. unscaledTime이라 일시정지(timeScale 0) 중에도 맥동한다
|
||||||
|
float wave = 0.5f - 0.5f * Mathf.Cos(Time.unscaledTime * style.GlowSpeed * 2f * Mathf.PI);
|
||||||
|
float boost = wave * style.GlowStrength;
|
||||||
|
|
||||||
|
foreach (var glyph in glyphs)
|
||||||
|
{
|
||||||
|
if (glyph.linkID != LINK_ID) continue;
|
||||||
|
|
||||||
|
var verts = glyph.vertices;
|
||||||
|
for (int i = 0; i < verts.Length; i++)
|
||||||
|
{
|
||||||
|
var v = verts[i];
|
||||||
|
v.tint = Brighten(v.tint, boost);
|
||||||
|
verts[i] = v; // NativeSlice는 실제 버퍼를 가리키므로 이 쓰기가 화면에 반영된다
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 흰색 쪽으로 boost만큼 당긴다. 알파는 그대로 유지 — 숨김 상태(alpha 0)를 보존해야 한다.
|
||||||
|
private static Color32 Brighten(Color32 c, float boost) => new Color32(
|
||||||
|
(byte)(c.r + (255 - c.r) * boost),
|
||||||
|
(byte)(c.g + (255 - c.g) * boost),
|
||||||
|
(byte)(c.b + (255 - c.b) * boost),
|
||||||
|
c.a);
|
||||||
|
}
|
||||||
2
Assets/02_Scripts/_UI/TextGlow.cs.meta
Normal file
2
Assets/02_Scripts/_UI/TextGlow.cs.meta
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 9031534da157fdd49b9077c83401f908
|
||||||
539
Assets/07_Data/DialogGraph/TestDescDialog.dlg
Normal file
539
Assets/07_Data/DialogGraph/TestDescDialog.dlg
Normal file
@@ -0,0 +1,539 @@
|
|||||||
|
%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: 12501, guid: 0000000000000000e000000000000000, type: 0}
|
||||||
|
m_Name: TestDescDialog
|
||||||
|
m_EditorClassIdentifier: UnityEditor.dll::Unity.GraphToolkit.Editor.Implementation.GraphObjectImp
|
||||||
|
m_GraphModel:
|
||||||
|
rid: 6600512887158735084
|
||||||
|
references:
|
||||||
|
version: 2
|
||||||
|
RefIds:
|
||||||
|
- rid: -2
|
||||||
|
type: {class: , ns: , asm: }
|
||||||
|
- rid: 4848514907161231424
|
||||||
|
type: {class: 'Constant`1[[System.Int32, mscorlib]]', ns: Unity.GraphToolkit.Editor, asm: UnityEditor.GraphToolkitModule}
|
||||||
|
data:
|
||||||
|
m_Value: 0
|
||||||
|
- rid: 4848514907161231425
|
||||||
|
type: {class: 'Constant`1[[TypewriterStyle, Assembly-CSharp]]', ns: Unity.GraphToolkit.Editor, asm: UnityEditor.GraphToolkitModule}
|
||||||
|
data:
|
||||||
|
m_Value: {fileID: 0}
|
||||||
|
- rid: 4848514907161231443
|
||||||
|
type: {class: 'Constant`1[[UnityEngine.AudioClip, UnityEngine.AudioModule]]', ns: Unity.GraphToolkit.Editor, asm: UnityEditor.GraphToolkitModule}
|
||||||
|
data:
|
||||||
|
m_Value: {fileID: 0}
|
||||||
|
- rid: 4848514907161231444
|
||||||
|
type: {class: UserNodeModelImp, ns: Unity.GraphToolkit.Editor.Implementation, asm: UnityEditor.GraphToolkitModule}
|
||||||
|
data:
|
||||||
|
m_Guid:
|
||||||
|
m_Value0: 7849459999523502538
|
||||||
|
m_Value1: 14539083487489350035
|
||||||
|
m_HashGuid:
|
||||||
|
serializedVersion: 2
|
||||||
|
Hash: ca793c0648e2ee6c93d98c876633c5c9
|
||||||
|
m_Version: 2
|
||||||
|
m_Position: {x: 331.24704, y: -52.737083}
|
||||||
|
m_Title:
|
||||||
|
m_Tooltip:
|
||||||
|
m_NodePreviewModel:
|
||||||
|
rid: -2
|
||||||
|
m_State: 0
|
||||||
|
m_InputConstantsById:
|
||||||
|
m_KeyList:
|
||||||
|
- __option_ChoiceCount
|
||||||
|
- __option_HiddenBranchCount
|
||||||
|
- Speaker
|
||||||
|
- SpeakerNameOverride
|
||||||
|
- TalkText
|
||||||
|
- Gesture
|
||||||
|
- Expression
|
||||||
|
- Voice
|
||||||
|
- Bgm
|
||||||
|
- Sfx
|
||||||
|
- Typewriter
|
||||||
|
- Affection
|
||||||
|
- Progress
|
||||||
|
m_ValueList:
|
||||||
|
- rid: 4848514907161231446
|
||||||
|
- rid: 4848514907161231447
|
||||||
|
- rid: 4848514907161231448
|
||||||
|
- rid: 4848514907161231449
|
||||||
|
- rid: 4848514907161231450
|
||||||
|
- rid: 4848514907161231451
|
||||||
|
- rid: 4848514907161231452
|
||||||
|
- rid: 4848514907161231453
|
||||||
|
- rid: 4848514907161231454
|
||||||
|
- rid: 4848514907161231455
|
||||||
|
- rid: 4848514907161231456
|
||||||
|
- rid: 4848514907161231457
|
||||||
|
- rid: 4848514907161231458
|
||||||
|
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: 4848514907161231459
|
||||||
|
- rid: 4848514907161231445
|
||||||
|
type: {class: WireModel, ns: Unity.GraphToolkit.Editor, asm: UnityEditor.GraphToolkitModule}
|
||||||
|
data:
|
||||||
|
m_Guid:
|
||||||
|
m_Value0: 3243418246931430021
|
||||||
|
m_Value1: 8369528762439370719
|
||||||
|
m_HashGuid:
|
||||||
|
serializedVersion: 2
|
||||||
|
Hash: 853a5e12b6ef022ddf079dd6108a2674
|
||||||
|
m_Version: 2
|
||||||
|
m_FromPortReference:
|
||||||
|
m_NodeModelGuid:
|
||||||
|
m_Value0: 8557079674992562767
|
||||||
|
m_Value1: 2087592960078497513
|
||||||
|
m_NodeModelHashGuid:
|
||||||
|
serializedVersion: 2
|
||||||
|
Hash: 4f92a586a0dac076e9c61595bc9ef81c
|
||||||
|
m_UniqueId: Out
|
||||||
|
m_PortDirection: 2
|
||||||
|
m_PortOrientation: 0
|
||||||
|
m_Title:
|
||||||
|
m_ToPortReference:
|
||||||
|
m_NodeModelGuid:
|
||||||
|
m_Value0: 7849459999523502538
|
||||||
|
m_Value1: 14539083487489350035
|
||||||
|
m_NodeModelHashGuid:
|
||||||
|
serializedVersion: 2
|
||||||
|
Hash: ca793c0648e2ee6c93d98c876633c5c9
|
||||||
|
m_UniqueId: In
|
||||||
|
m_PortDirection: 1
|
||||||
|
m_PortOrientation: 0
|
||||||
|
m_Title:
|
||||||
|
- rid: 4848514907161231446
|
||||||
|
type: {class: 'Constant`1[[System.Int32, mscorlib]]', ns: Unity.GraphToolkit.Editor, asm: UnityEditor.GraphToolkitModule}
|
||||||
|
data:
|
||||||
|
m_Value: 0
|
||||||
|
- rid: 4848514907161231447
|
||||||
|
type: {class: 'Constant`1[[System.Int32, mscorlib]]', ns: Unity.GraphToolkit.Editor, asm: UnityEditor.GraphToolkitModule}
|
||||||
|
data:
|
||||||
|
m_Value: 0
|
||||||
|
- rid: 4848514907161231448
|
||||||
|
type: {class: 'Constant`1[[CharacterData, Assembly-CSharp]]', ns: Unity.GraphToolkit.Editor, asm: UnityEditor.GraphToolkitModule}
|
||||||
|
data:
|
||||||
|
m_Value: {fileID: 11400000, guid: e07e7378d9bcc4f458036eb19c476048, type: 2}
|
||||||
|
- rid: 4848514907161231449
|
||||||
|
type: {class: 'Constant`1[[DinoLove.Dialog.GraphTool.Editor.DialogShortText, Assembly-CSharp-Editor]]', ns: Unity.GraphToolkit.Editor, asm: UnityEditor.GraphToolkitModule}
|
||||||
|
data:
|
||||||
|
m_Value:
|
||||||
|
Value:
|
||||||
|
- rid: 4848514907161231450
|
||||||
|
type: {class: 'Constant`1[[DinoLove.Dialog.GraphTool.Editor.DialogText, Assembly-CSharp-Editor]]', ns: Unity.GraphToolkit.Editor, asm: UnityEditor.GraphToolkitModule}
|
||||||
|
data:
|
||||||
|
m_Value:
|
||||||
|
Value: "[[\uB370\uBC15]] \uC774\uC9C0\uB098!"
|
||||||
|
- rid: 4848514907161231451
|
||||||
|
type: {class: 'Constant`1[[GestureData, Assembly-CSharp]]', ns: Unity.GraphToolkit.Editor, asm: UnityEditor.GraphToolkitModule}
|
||||||
|
data:
|
||||||
|
m_Value: {fileID: 0}
|
||||||
|
- rid: 4848514907161231452
|
||||||
|
type: {class: 'Constant`1[[ExpressionData, Assembly-CSharp]]', ns: Unity.GraphToolkit.Editor, asm: UnityEditor.GraphToolkitModule}
|
||||||
|
data:
|
||||||
|
m_Value: {fileID: 0}
|
||||||
|
- rid: 4848514907161231453
|
||||||
|
type: {class: 'Constant`1[[VoiceClip, Assembly-CSharp]]', ns: Unity.GraphToolkit.Editor, asm: UnityEditor.GraphToolkitModule}
|
||||||
|
data:
|
||||||
|
m_Value: {fileID: 0}
|
||||||
|
- rid: 4848514907161231454
|
||||||
|
type: {class: 'Constant`1[[UnityEngine.AudioClip, UnityEngine.AudioModule]]', ns: Unity.GraphToolkit.Editor, asm: UnityEditor.GraphToolkitModule}
|
||||||
|
data:
|
||||||
|
m_Value: {fileID: 0}
|
||||||
|
- rid: 4848514907161231455
|
||||||
|
type: {class: 'Constant`1[[UnityEngine.AudioClip, UnityEngine.AudioModule]]', ns: Unity.GraphToolkit.Editor, asm: UnityEditor.GraphToolkitModule}
|
||||||
|
data:
|
||||||
|
m_Value: {fileID: 0}
|
||||||
|
- rid: 4848514907161231456
|
||||||
|
type: {class: 'Constant`1[[TypewriterStyle, Assembly-CSharp]]', ns: Unity.GraphToolkit.Editor, asm: UnityEditor.GraphToolkitModule}
|
||||||
|
data:
|
||||||
|
m_Value: {fileID: 0}
|
||||||
|
- rid: 4848514907161231457
|
||||||
|
type: {class: 'Constant`1[[System.Int32, mscorlib]]', ns: Unity.GraphToolkit.Editor, asm: UnityEditor.GraphToolkitModule}
|
||||||
|
data:
|
||||||
|
m_Value: 0
|
||||||
|
- rid: 4848514907161231458
|
||||||
|
type: {class: 'Constant`1[[System.Int32, mscorlib]]', ns: Unity.GraphToolkit.Editor, asm: UnityEditor.GraphToolkitModule}
|
||||||
|
data:
|
||||||
|
m_Value: 0
|
||||||
|
- rid: 4848514907161231459
|
||||||
|
type: {class: DialogLineNode, ns: DinoLove.Dialog.GraphTool.Editor, asm: Assembly-CSharp-Editor}
|
||||||
|
data:
|
||||||
|
- rid: 4848514907161231460
|
||||||
|
type: {class: UserNodeModelImp, ns: Unity.GraphToolkit.Editor.Implementation, asm: UnityEditor.GraphToolkitModule}
|
||||||
|
data:
|
||||||
|
m_Guid:
|
||||||
|
m_Value0: 3739637933438275872
|
||||||
|
m_Value1: 12559177808371301060
|
||||||
|
m_HashGuid:
|
||||||
|
serializedVersion: 2
|
||||||
|
Hash: 20112a13e3dce533c4baf0e2ac294bae
|
||||||
|
m_Version: 2
|
||||||
|
m_Position: {x: 901.86993, y: -46.30094}
|
||||||
|
m_Title:
|
||||||
|
m_Tooltip:
|
||||||
|
m_NodePreviewModel:
|
||||||
|
rid: -2
|
||||||
|
m_State: 0
|
||||||
|
m_InputConstantsById:
|
||||||
|
m_KeyList:
|
||||||
|
- KeepBgm
|
||||||
|
m_ValueList:
|
||||||
|
- rid: 4848514907161231462
|
||||||
|
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: 4848514907161231463
|
||||||
|
- rid: 4848514907161231461
|
||||||
|
type: {class: WireModel, ns: Unity.GraphToolkit.Editor, asm: UnityEditor.GraphToolkitModule}
|
||||||
|
data:
|
||||||
|
m_Guid:
|
||||||
|
m_Value0: 6048737915114996666
|
||||||
|
m_Value1: 9878709595707897437
|
||||||
|
m_HashGuid:
|
||||||
|
serializedVersion: 2
|
||||||
|
Hash: bac3dd11166ff1535d7669a3093a1889
|
||||||
|
m_Version: 2
|
||||||
|
m_FromPortReference:
|
||||||
|
m_NodeModelGuid:
|
||||||
|
m_Value0: 7849459999523502538
|
||||||
|
m_Value1: 14539083487489350035
|
||||||
|
m_NodeModelHashGuid:
|
||||||
|
serializedVersion: 2
|
||||||
|
Hash: ca793c0648e2ee6c93d98c876633c5c9
|
||||||
|
m_UniqueId: Out
|
||||||
|
m_PortDirection: 2
|
||||||
|
m_PortOrientation: 0
|
||||||
|
m_Title:
|
||||||
|
m_ToPortReference:
|
||||||
|
m_NodeModelGuid:
|
||||||
|
m_Value0: 3739637933438275872
|
||||||
|
m_Value1: 12559177808371301060
|
||||||
|
m_NodeModelHashGuid:
|
||||||
|
serializedVersion: 2
|
||||||
|
Hash: 20112a13e3dce533c4baf0e2ac294bae
|
||||||
|
m_UniqueId: In
|
||||||
|
m_PortDirection: 1
|
||||||
|
m_PortOrientation: 0
|
||||||
|
m_Title:
|
||||||
|
- rid: 4848514907161231462
|
||||||
|
type: {class: 'Constant`1[[System.Boolean, mscorlib]]', ns: Unity.GraphToolkit.Editor, asm: UnityEditor.GraphToolkitModule}
|
||||||
|
data:
|
||||||
|
m_Value: 0
|
||||||
|
- rid: 4848514907161231463
|
||||||
|
type: {class: DialogEndNode, ns: DinoLove.Dialog.GraphTool.Editor, asm: Assembly-CSharp-Editor}
|
||||||
|
data:
|
||||||
|
- rid: 6600512887158735084
|
||||||
|
type: {class: GraphModelImp, ns: Unity.GraphToolkit.Editor.Implementation, asm: UnityEditor.GraphToolkitModule}
|
||||||
|
data:
|
||||||
|
m_Guid:
|
||||||
|
m_Value0: 9794163788213571237
|
||||||
|
m_Value1: 6016515793404660238
|
||||||
|
m_HashGuid:
|
||||||
|
serializedVersion: 2
|
||||||
|
Hash: a5ce76dc12dceb870e8a69bb3cf57e53
|
||||||
|
m_Name: TestDescDialog
|
||||||
|
m_GraphNodeModels:
|
||||||
|
- rid: 6600512887158735087
|
||||||
|
- rid: 6600512887158735111
|
||||||
|
- rid: 4848514907161231444
|
||||||
|
- rid: 4848514907161231460
|
||||||
|
m_GraphWireModels:
|
||||||
|
- rid: 6600512887158735113
|
||||||
|
- rid: 4848514907161231445
|
||||||
|
- rid: 4848514907161231461
|
||||||
|
m_GraphStickyNoteModels: []
|
||||||
|
m_GraphPlacematModels: []
|
||||||
|
m_GraphVariableModels: []
|
||||||
|
m_GraphPortalModels: []
|
||||||
|
m_SectionModels:
|
||||||
|
- rid: 6600512887158735085
|
||||||
|
m_LocalSubgraphs: []
|
||||||
|
m_LastKnownBounds:
|
||||||
|
serializedVersion: 2
|
||||||
|
x: -404
|
||||||
|
y: -53
|
||||||
|
width: 1461
|
||||||
|
height: 466
|
||||||
|
m_GraphElementMetaData:
|
||||||
|
- m_Guid:
|
||||||
|
m_Value0: 8557079674992562767
|
||||||
|
m_Value1: 2087592960078497513
|
||||||
|
m_HashGuid:
|
||||||
|
serializedVersion: 2
|
||||||
|
Hash: 4f92a586a0dac076e9c61595bc9ef81c
|
||||||
|
m_Category: 0
|
||||||
|
m_Index: 0
|
||||||
|
- m_Guid:
|
||||||
|
m_Value0: 13680180985569699724
|
||||||
|
m_Value1: 14420258866515227426
|
||||||
|
m_HashGuid:
|
||||||
|
serializedVersion: 2
|
||||||
|
Hash: 8c67ef2b20c4d9bd2233d18b090d1fc8
|
||||||
|
m_Category: 0
|
||||||
|
m_Index: 1
|
||||||
|
- m_Guid:
|
||||||
|
m_Value0: 10165275467295493703
|
||||||
|
m_Value1: 18408072349542380157
|
||||||
|
m_HashGuid:
|
||||||
|
serializedVersion: 2
|
||||||
|
Hash: 470e24f82d50128d7df22992459c76ff
|
||||||
|
m_Category: 2
|
||||||
|
m_Index: 0
|
||||||
|
- m_Guid:
|
||||||
|
m_Value0: 7849459999523502538
|
||||||
|
m_Value1: 14539083487489350035
|
||||||
|
m_HashGuid:
|
||||||
|
serializedVersion: 2
|
||||||
|
Hash: ca793c0648e2ee6c93d98c876633c5c9
|
||||||
|
m_Category: 0
|
||||||
|
m_Index: 2
|
||||||
|
- m_Guid:
|
||||||
|
m_Value0: 3243418246931430021
|
||||||
|
m_Value1: 8369528762439370719
|
||||||
|
m_HashGuid:
|
||||||
|
serializedVersion: 2
|
||||||
|
Hash: 853a5e12b6ef022ddf079dd6108a2674
|
||||||
|
m_Category: 2
|
||||||
|
m_Index: 1
|
||||||
|
- m_Guid:
|
||||||
|
m_Value0: 3739637933438275872
|
||||||
|
m_Value1: 12559177808371301060
|
||||||
|
m_HashGuid:
|
||||||
|
serializedVersion: 2
|
||||||
|
Hash: 20112a13e3dce533c4baf0e2ac294bae
|
||||||
|
m_Category: 0
|
||||||
|
m_Index: 3
|
||||||
|
- m_Guid:
|
||||||
|
m_Value0: 6048737915114996666
|
||||||
|
m_Value1: 9878709595707897437
|
||||||
|
m_HashGuid:
|
||||||
|
serializedVersion: 2
|
||||||
|
Hash: bac3dd11166ff1535d7669a3093a1889
|
||||||
|
m_Category: 2
|
||||||
|
m_Index: 2
|
||||||
|
m_EntryPoint:
|
||||||
|
rid: 6600512887158735087
|
||||||
|
m_Graph:
|
||||||
|
rid: 6600512887158735086
|
||||||
|
- rid: 6600512887158735085
|
||||||
|
type: {class: SectionModel, ns: Unity.GraphToolkit.Editor, asm: UnityEditor.GraphToolkitModule}
|
||||||
|
data:
|
||||||
|
m_Guid:
|
||||||
|
m_Value0: 13894749353265220958
|
||||||
|
m_Value1: 16881712273075319024
|
||||||
|
m_HashGuid:
|
||||||
|
serializedVersion: 2
|
||||||
|
Hash: 5e4d7654eb10d4c0f0b00185dee347ea
|
||||||
|
m_Version: 2
|
||||||
|
m_Items: []
|
||||||
|
m_Title:
|
||||||
|
- rid: 6600512887158735086
|
||||||
|
type: {class: DialogGraph, ns: DinoLove.Dialog.GraphTool.Editor, asm: Assembly-CSharp-Editor}
|
||||||
|
data:
|
||||||
|
- rid: 6600512887158735087
|
||||||
|
type: {class: UserNodeModelImp, ns: Unity.GraphToolkit.Editor.Implementation, asm: UnityEditor.GraphToolkitModule}
|
||||||
|
data:
|
||||||
|
m_Guid:
|
||||||
|
m_Value0: 8557079674992562767
|
||||||
|
m_Value1: 2087592960078497513
|
||||||
|
m_HashGuid:
|
||||||
|
serializedVersion: 2
|
||||||
|
Hash: 4f92a586a0dac076e9c61595bc9ef81c
|
||||||
|
m_Version: 2
|
||||||
|
m_Position: {x: -85.50522, y: -42.782944}
|
||||||
|
m_Title:
|
||||||
|
m_Tooltip:
|
||||||
|
m_NodePreviewModel:
|
||||||
|
rid: -2
|
||||||
|
m_State: 0
|
||||||
|
m_InputConstantsById:
|
||||||
|
m_KeyList:
|
||||||
|
- __option_ChoiceCount
|
||||||
|
- Speaker
|
||||||
|
- SpeakerNameOverride
|
||||||
|
- TalkText
|
||||||
|
- Gesture
|
||||||
|
- Expression
|
||||||
|
- Voice
|
||||||
|
- Bgm
|
||||||
|
- Affection
|
||||||
|
- Progress
|
||||||
|
- __option_HiddenBranchCount
|
||||||
|
- Typewriter
|
||||||
|
- Sfx
|
||||||
|
m_ValueList:
|
||||||
|
- rid: 6600512887158735088
|
||||||
|
- rid: 6600512887158735093
|
||||||
|
- rid: 6600512887158735094
|
||||||
|
- rid: 6600512887158735096
|
||||||
|
- rid: 6600512887158735097
|
||||||
|
- rid: 6600512887158735098
|
||||||
|
- rid: 6600512887158735099
|
||||||
|
- rid: 6600512887158735100
|
||||||
|
- rid: 6600512887158735108
|
||||||
|
- rid: 6600512887158735109
|
||||||
|
- rid: 4848514907161231424
|
||||||
|
- rid: 4848514907161231425
|
||||||
|
- rid: 4848514907161231443
|
||||||
|
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: 6600512887158735110
|
||||||
|
- rid: 6600512887158735088
|
||||||
|
type: {class: 'Constant`1[[System.Int32, mscorlib]]', ns: Unity.GraphToolkit.Editor, asm: UnityEditor.GraphToolkitModule}
|
||||||
|
data:
|
||||||
|
m_Value: 0
|
||||||
|
- rid: 6600512887158735093
|
||||||
|
type: {class: 'Constant`1[[CharacterData, Assembly-CSharp]]', ns: Unity.GraphToolkit.Editor, asm: UnityEditor.GraphToolkitModule}
|
||||||
|
data:
|
||||||
|
m_Value: {fileID: 0}
|
||||||
|
- rid: 6600512887158735094
|
||||||
|
type: {class: 'Constant`1[[DinoLove.Dialog.GraphTool.Editor.DialogShortText, Assembly-CSharp-Editor]]', ns: Unity.GraphToolkit.Editor, asm: UnityEditor.GraphToolkitModule}
|
||||||
|
data:
|
||||||
|
m_Value:
|
||||||
|
Value:
|
||||||
|
- rid: 6600512887158735096
|
||||||
|
type: {class: 'Constant`1[[DinoLove.Dialog.GraphTool.Editor.DialogText, Assembly-CSharp-Editor]]', ns: Unity.GraphToolkit.Editor, asm: UnityEditor.GraphToolkitModule}
|
||||||
|
data:
|
||||||
|
m_Value:
|
||||||
|
Value: "\uD14C\uC2A4\uD2B8 [[\uC11C\uC220]] \uC774\uC790\uB098!!"
|
||||||
|
- rid: 6600512887158735097
|
||||||
|
type: {class: 'Constant`1[[GestureData, Assembly-CSharp]]', ns: Unity.GraphToolkit.Editor, asm: UnityEditor.GraphToolkitModule}
|
||||||
|
data:
|
||||||
|
m_Value: {fileID: 0}
|
||||||
|
- rid: 6600512887158735098
|
||||||
|
type: {class: 'Constant`1[[ExpressionData, Assembly-CSharp]]', ns: Unity.GraphToolkit.Editor, asm: UnityEditor.GraphToolkitModule}
|
||||||
|
data:
|
||||||
|
m_Value: {fileID: 0}
|
||||||
|
- rid: 6600512887158735099
|
||||||
|
type: {class: 'Constant`1[[VoiceClip, Assembly-CSharp]]', ns: Unity.GraphToolkit.Editor, asm: UnityEditor.GraphToolkitModule}
|
||||||
|
data:
|
||||||
|
m_Value: {fileID: 0}
|
||||||
|
- rid: 6600512887158735100
|
||||||
|
type: {class: 'Constant`1[[UnityEngine.AudioClip, UnityEngine.AudioModule]]', ns: Unity.GraphToolkit.Editor, asm: UnityEditor.GraphToolkitModule}
|
||||||
|
data:
|
||||||
|
m_Value: {fileID: 0}
|
||||||
|
- rid: 6600512887158735108
|
||||||
|
type: {class: 'Constant`1[[System.Int32, mscorlib]]', ns: Unity.GraphToolkit.Editor, asm: UnityEditor.GraphToolkitModule}
|
||||||
|
data:
|
||||||
|
m_Value: 0
|
||||||
|
- rid: 6600512887158735109
|
||||||
|
type: {class: 'Constant`1[[System.Int32, mscorlib]]', ns: Unity.GraphToolkit.Editor, asm: UnityEditor.GraphToolkitModule}
|
||||||
|
data:
|
||||||
|
m_Value: 0
|
||||||
|
- rid: 6600512887158735110
|
||||||
|
type: {class: DialogLineNode, ns: DinoLove.Dialog.GraphTool.Editor, asm: Assembly-CSharp-Editor}
|
||||||
|
data:
|
||||||
|
- rid: 6600512887158735111
|
||||||
|
type: {class: UserNodeModelImp, ns: Unity.GraphToolkit.Editor.Implementation, asm: UnityEditor.GraphToolkitModule}
|
||||||
|
data:
|
||||||
|
m_Guid:
|
||||||
|
m_Value0: 13680180985569699724
|
||||||
|
m_Value1: 14420258866515227426
|
||||||
|
m_HashGuid:
|
||||||
|
serializedVersion: 2
|
||||||
|
Hash: 8c67ef2b20c4d9bd2233d18b090d1fc8
|
||||||
|
m_Version: 2
|
||||||
|
m_Position: {x: -404.02042, y: 43.72515}
|
||||||
|
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: 6600512887158735112
|
||||||
|
- rid: 6600512887158735112
|
||||||
|
type: {class: DialogStartNode, ns: DinoLove.Dialog.GraphTool.Editor, asm: Assembly-CSharp-Editor}
|
||||||
|
data:
|
||||||
|
- rid: 6600512887158735113
|
||||||
|
type: {class: WireModel, ns: Unity.GraphToolkit.Editor, asm: UnityEditor.GraphToolkitModule}
|
||||||
|
data:
|
||||||
|
m_Guid:
|
||||||
|
m_Value0: 10165275467295493703
|
||||||
|
m_Value1: 18408072349542380157
|
||||||
|
m_HashGuid:
|
||||||
|
serializedVersion: 2
|
||||||
|
Hash: 470e24f82d50128d7df22992459c76ff
|
||||||
|
m_Version: 2
|
||||||
|
m_FromPortReference:
|
||||||
|
m_NodeModelGuid:
|
||||||
|
m_Value0: 13680180985569699724
|
||||||
|
m_Value1: 14420258866515227426
|
||||||
|
m_NodeModelHashGuid:
|
||||||
|
serializedVersion: 2
|
||||||
|
Hash: 8c67ef2b20c4d9bd2233d18b090d1fc8
|
||||||
|
m_UniqueId: Out
|
||||||
|
m_PortDirection: 2
|
||||||
|
m_PortOrientation: 0
|
||||||
|
m_Title:
|
||||||
|
m_ToPortReference:
|
||||||
|
m_NodeModelGuid:
|
||||||
|
m_Value0: 8557079674992562767
|
||||||
|
m_Value1: 2087592960078497513
|
||||||
|
m_NodeModelHashGuid:
|
||||||
|
serializedVersion: 2
|
||||||
|
Hash: 4f92a586a0dac076e9c61595bc9ef81c
|
||||||
|
m_UniqueId: In
|
||||||
|
m_PortDirection: 1
|
||||||
|
m_PortOrientation: 0
|
||||||
|
m_Title:
|
||||||
10
Assets/07_Data/DialogGraph/TestDescDialog.dlg.meta
Normal file
10
Assets/07_Data/DialogGraph/TestDescDialog.dlg.meta
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: edbf376d9f010274da63f6f6a4b8a224
|
||||||
|
ScriptedImporter:
|
||||||
|
internalIDToNameTable: []
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
|
script: {fileID: 11500000, guid: 2ae5ca89bbed445479d9023586f0c041, type: 3}
|
||||||
Binary file not shown.
Reference in New Issue
Block a user