diff --git a/Assets/01_Scenes/Cave_Test_2.unity b/Assets/01_Scenes/Cave_Test_2.unity index aeebdffc..f66b280b 100644 --- a/Assets/01_Scenes/Cave_Test_2.unity +++ b/Assets/01_Scenes/Cave_Test_2.unity @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:2293052e36bdb20d11e118cf452ef01fcb4f2552d78f9974bca5d3fd2fef785c -size 1089477 +oid sha256:7c0f1af38d7578c9219f8ae64174728e566c1ccd4455a5cd836f8f1b9f557081 +size 1077527 diff --git a/Assets/01_Scenes/MemoryPieceScene.unity b/Assets/01_Scenes/MemoryPieceScene.unity new file mode 100644 index 00000000..7360bcb6 --- /dev/null +++ b/Assets/01_Scenes/MemoryPieceScene.unity @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e8c97bc576519cf7abab91fed23703b75a75adcef0892ebbd0d64e039b3bfd76 +size 100420 diff --git a/Assets/01_Scenes/MemoryPieceScene.unity.meta b/Assets/01_Scenes/MemoryPieceScene.unity.meta new file mode 100644 index 00000000..41d397d5 --- /dev/null +++ b/Assets/01_Scenes/MemoryPieceScene.unity.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 4699f447f4cd2d14891cd7dbc70588c2 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/01_Scenes/blackjack.unity b/Assets/01_Scenes/blackjack.unity index f11110de..45be1fae 100644 --- a/Assets/01_Scenes/blackjack.unity +++ b/Assets/01_Scenes/blackjack.unity @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:65774115e762f3e0294fab567e4a4f2fb401b8f336865edb75f34c52fe0bf8a9 -size 2292269 +oid sha256:2ad4ca520489b3cd3e1b2c1244112afdfdfcaab23247d69edfec969ef5dfebf6 +size 2312189 diff --git a/Assets/02_Scripts/Blackjack/HookWalkToTable.cs b/Assets/02_Scripts/Blackjack/HookWalkToTable.cs index 0289e073..41079703 100644 --- a/Assets/02_Scripts/Blackjack/HookWalkToTable.cs +++ b/Assets/02_Scripts/Blackjack/HookWalkToTable.cs @@ -9,11 +9,13 @@ public class HookWalkToTable : MonoBehaviour public Transform tableFrontPoint; public Transform chairFrontPoint; - [Header("Sit Point")] + [Header("Sit / Stand Point")] public Transform sitPoint; + public Transform standPoint; [Header("Move Setting")] public float arriveBuffer = 0.15f; + public float navMeshSampleDistance = 1.5f; [Header("Animator")] public Animator animator; @@ -21,8 +23,16 @@ public class HookWalkToTable : MonoBehaviour public string sitTriggerName = "sitTrigger"; public string standTriggerName = "standTrigger"; + [Header("Force Stand Animation")] + public bool forcePlayStandState = true; + public string standStateName = "Sit To Stand 0"; + [Header("Stand Up Setting")] public float standUpDuration = 1.5f; + public bool disableAgentAfterStandUp = true; + + [Header("After Match")] + public bool blockWalkingAfterStandUp = true; [Header("Collision")] public bool disableCollidersWhenSitting = true; @@ -37,16 +47,21 @@ public class HookWalkToTable : MonoBehaviour private int step = 0; private bool isMoving = false; - private bool hasArrived = false; private bool isSitting = false; private bool isStandingUp = false; + private bool hasStoodUpAfterMatch = false; private Vector3 currentDestination; - void Start() + private void Start() { agent = GetComponent(); + if (animator == null) + { + animator = GetComponentInChildren(); + } + if (agent != null) { agent.isStopped = true; @@ -57,32 +72,37 @@ void Start() if (animator != null) { + animator.applyRootMotion = false; animator.SetBool(walkBoolName, false); animator.ResetTrigger(sitTriggerName); animator.ResetTrigger(standTriggerName); } + else + { + Debug.LogWarning("Hook Animator is missing."); + } if (hookColliders == null || hookColliders.Length == 0) { hookColliders = GetComponentsInChildren(); } + + Debug.Log("HookWalkToTable ready."); } - void Update() + private void Update() { - // ׽Ʈ: T ̺ ̵ ɱ if (Keyboard.current != null && Keyboard.current[testStartKey].wasPressedThisFrame) { StartWalking(); } - // ׽Ʈ: Y Ͼ if (Keyboard.current != null && Keyboard.current[testStandUpKey].wasPressedThisFrame) { StandUp(); } - if (!isMoving || agent == null) + if (!isMoving || agent == null || !agent.enabled) { return; } @@ -102,6 +122,12 @@ void Update() public void StartWalking() { + if (blockWalkingAfterStandUp && hasStoodUpAfterMatch) + { + Debug.Log("Hook already stood up after match. StartWalking ignored."); + return; + } + if (agent == null) { Debug.LogWarning("NavMeshAgent is missing."); @@ -116,23 +142,28 @@ public void StartWalking() if (isMoving || isSitting || isStandingUp) { + Debug.Log("Hook cannot start walking now."); return; } step = 0; - hasArrived = false; isMoving = true; EnableHookColliders(); if (animator != null) { + animator.applyRootMotion = false; animator.ResetTrigger(sitTriggerName); animator.ResetTrigger(standTriggerName); animator.SetBool(walkBoolName, true); } - agent.enabled = true; + if (!agent.enabled) + { + agent.enabled = true; + } + agent.isStopped = false; MoveTo(tableFrontPoint); @@ -140,11 +171,18 @@ public void StartWalking() Debug.Log("Hook starts walking to table front point."); } - void MoveTo(Transform target) + private void MoveTo(Transform target) { + if (target == null) + { + Debug.LogWarning("Move target is null."); + StopWalking(); + return; + } + NavMeshHit hit; - if (NavMesh.SamplePosition(target.position, out hit, 1.5f, NavMesh.AllAreas)) + if (NavMesh.SamplePosition(target.position, out hit, navMeshSampleDistance, NavMesh.AllAreas)) { currentDestination = hit.position; agent.SetDestination(currentDestination); @@ -158,7 +196,7 @@ void MoveTo(Transform target) } } - void GoNextStep() + private void GoNextStep() { step++; @@ -173,44 +211,41 @@ void GoNextStep() } } - void ArriveAndSit() + private void ArriveAndSit() { isMoving = false; - hasArrived = true; isSitting = true; isStandingUp = false; - // 1. ̵ - if (agent != null) + if (agent != null && agent.enabled) { agent.isStopped = true; agent.ResetPath(); agent.enabled = false; } - // 2. ɾ ִ ũ ݶ̴ if (disableCollidersWhenSitting) { DisableHookColliders(); } - // 3. ġ ̵ if (sitPoint != null) { - transform.position = sitPoint.position; - transform.rotation = sitPoint.rotation; + transform.SetPositionAndRotation(sitPoint.position, sitPoint.rotation); } else if (chairFrontPoint != null) { transform.rotation = chairFrontPoint.rotation; } - // 4. ɴ ִϸ̼ if (animator != null) { + animator.applyRootMotion = false; animator.SetBool(walkBoolName, false); animator.ResetTrigger(standTriggerName); animator.ResetTrigger(sitTriggerName); + + Debug.Log("Sit trigger call: " + sitTriggerName); animator.SetTrigger(sitTriggerName); } @@ -219,31 +254,61 @@ void ArriveAndSit() public void StandUp() { - if (!isSitting || isStandingUp) + if (isStandingUp) { + Debug.Log("Hook is already standing up."); + return; + } + + if (!isSitting) + { + Debug.LogWarning("Hook is not sitting. StandUp ignored."); return; } StartCoroutine(StandUpRoutine()); } - IEnumerator StandUpRoutine() + private IEnumerator StandUpRoutine() { isStandingUp = true; isSitting = false; + isMoving = false; + + if (agent != null && agent.enabled) + { + agent.isStopped = true; + agent.ResetPath(); + agent.enabled = false; + } if (animator != null) { + animator.applyRootMotion = false; + animator.SetBool(walkBoolName, false); animator.ResetTrigger(sitTriggerName); animator.ResetTrigger(standTriggerName); + + Debug.Log("Stand trigger call: " + standTriggerName); animator.SetTrigger(standTriggerName); + + if (forcePlayStandState && !string.IsNullOrEmpty(standStateName)) + { + animator.CrossFadeInFixedTime(standStateName, 0.08f, 0); + Debug.Log("Force play stand state: " + standStateName); + } } Debug.Log("Hook started stand up animation."); yield return new WaitForSeconds(standUpDuration); + if (standPoint != null) + { + transform.SetPositionAndRotation(standPoint.position, standPoint.rotation); + } + if (enableCollidersAfterStandUp) { EnableHookColliders(); @@ -251,18 +316,51 @@ IEnumerator StandUpRoutine() if (agent != null) { - agent.enabled = true; - agent.isStopped = true; - agent.ResetPath(); + if (disableAgentAfterStandUp) + { + agent.enabled = false; + } + else + { + if (!agent.enabled) + { + agent.enabled = true; + } + + agent.isStopped = true; + agent.ResetPath(); + } } - hasArrived = false; + hasStoodUpAfterMatch = true; isStandingUp = false; Debug.Log("Hook stood up."); } - void DisableHookColliders() + public void ResetHookAfterMatchBlock() + { + hasStoodUpAfterMatch = false; + Debug.Log("Hook StartWalking block reset."); + } + + private void StopWalking() + { + isMoving = false; + + if (agent != null && agent.enabled) + { + agent.isStopped = true; + agent.ResetPath(); + } + + if (animator != null) + { + animator.SetBool(walkBoolName, false); + } + } + + private void DisableHookColliders() { if (hookColliders == null || hookColliders.Length == 0) { @@ -278,7 +376,7 @@ void DisableHookColliders() } } - void EnableHookColliders() + private void EnableHookColliders() { if (hookColliders == null || hookColliders.Length == 0) { @@ -293,20 +391,4 @@ void EnableHookColliders() } } } - - void StopWalking() - { - isMoving = false; - - if (agent != null && agent.enabled) - { - agent.isStopped = true; - agent.ResetPath(); - } - - if (animator != null) - { - animator.SetBool(walkBoolName, false); - } - } } \ No newline at end of file diff --git a/Assets/02_Scripts/Managers/CollectionManager.cs b/Assets/02_Scripts/Managers/CollectionManager.cs new file mode 100644 index 00000000..dc587dd7 --- /dev/null +++ b/Assets/02_Scripts/Managers/CollectionManager.cs @@ -0,0 +1,46 @@ +using UnityEngine; + +public class CollectionManager : MonoBehaviour +{ + public static CollectionManager Instance; + + [Header("Star Data")] + private int _currentStars = 0; + + [Header("CollectionHuds")] + [SerializeField] private StarPieceHud _starPieceHud; + + public int GetStarCount => _currentStars; + void Awake() + { + if (Instance != null && Instance != this) + { + Destroy(gameObject); + return; + } + + Instance = this; + DontDestroyOnLoad(gameObject); + } + + void Start() + { + UpdateUI(); + } + + public void AddStar(int amount) + { + _currentStars += amount; + UpdateUI(); + + Debug.Log("Star Added: " + amount + " / Total Star: " + _currentStars); + } + + void UpdateUI() + { + if(_starPieceHud != null) + { + _starPieceHud.RefreshUI(); + } + } +} diff --git a/Assets/02_Scripts/Managers/CollectionManager.cs.meta b/Assets/02_Scripts/Managers/CollectionManager.cs.meta new file mode 100644 index 00000000..9e15bd6b --- /dev/null +++ b/Assets/02_Scripts/Managers/CollectionManager.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 5246c040c89587145b3d5b6f6631a948 \ No newline at end of file diff --git a/Assets/02_Scripts/Managers/GameClear.cs b/Assets/02_Scripts/Managers/GameClear.cs index 840eb45d..b3dc85e6 100644 --- a/Assets/02_Scripts/Managers/GameClear.cs +++ b/Assets/02_Scripts/Managers/GameClear.cs @@ -94,16 +94,39 @@ public void SetZoneActive(DialogRegion zone, bool active) public void SetClearDialogParameter() { + string sceneName1 = "블랙잭"; + string sceneCode1 = "blackjack"; + string sceneName2 = "캣룸"; + string sceneCode2 = "CatsRoom"; - //DialogVariables.Set("SpaceSceneName1", RandomSceneRouteManager.Instance.GetNextSceneName1()); - //DialogVariables.Set("SpaceSceneCode1", RandomSceneRouteManager.Instance.GetNextSceneCode1()); - //DialogVariables.Set("SpaceSceneName2", RandomSceneRouteManager.Instance.GetNextSceneName2()); - //DialogVariables.Set("SpaceSceneCode2", RandomSceneRouteManager.Instance.GetNextSceneCode2()); + if (RandomSceneRouteManager.Instance != null) + { + RandomSceneRouteManager.Instance.PrepareNextSceneChoices(); - //테스트용 - DialogVariables.Set("SpaceSceneName1", "블랙잭"); - DialogVariables.Set("SpaceSceneCode1", "blackjack"); - DialogVariables.Set("SpaceSceneName2", "미로방"); - DialogVariables.Set("SpaceSceneCode2", "MazeRoom"); + sceneName1 = RandomSceneRouteManager.Instance.GetNextSceneName1(); + sceneCode1 = RandomSceneRouteManager.Instance.GetNextSceneCode1(); + sceneName2 = RandomSceneRouteManager.Instance.GetNextSceneName2(); + sceneCode2 = RandomSceneRouteManager.Instance.GetNextSceneCode2(); + } + else + { + Debug.LogWarning("RandomSceneRouteManager가 없어서 테스트용 선택지를 사용합니다."); + } + + DialogVariables.Set("SpaceSceneName1", sceneName1); + DialogVariables.Set("SpaceSceneCode1", sceneCode1); + DialogVariables.Set("SpaceSceneName2", sceneName2); + DialogVariables.Set("SpaceSceneCode2", sceneCode2); + + if (_clearGate != null) + { + _clearGate.SetDoorChoices(sceneCode1, sceneCode2); + } + else + { + Debug.LogWarning("GameClear에 RoomClearGateController가 연결되지 않았습니다."); + } + + Debug.Log($"선택지 세팅 완료: {sceneName1}/{sceneCode1}, {sceneName2}/{sceneCode2}"); } } diff --git a/Assets/02_Scripts/Managers/StarPickup.cs b/Assets/02_Scripts/Managers/StarPickup.cs new file mode 100644 index 00000000..a61d271c --- /dev/null +++ b/Assets/02_Scripts/Managers/StarPickup.cs @@ -0,0 +1,81 @@ +using UnityEngine; + +public class StarPickup : MonoBehaviour +{ + [SerializeField] private string _playerTag; + + [Header("Visual Spin")] + public Transform visualRoot; + public bool rotate = true; + public float rotateSpeed = 180f; + + [Tooltip("회전축")] + public Vector3 rotateAxis = Vector3.up; + + [Header("Float Motion")] + public bool floatMotion = true; + public float floatHeight = 0.08f; + public float floatSpeed = 2f; + + [Header("Sound")] + public AudioClip pickupSound; + + private Vector3 startPosition; + + void Awake() + { + if (visualRoot == null) + { + visualRoot = transform; + } + } + + void Start() + { + startPosition = transform.position; + } + + void Update() + { + if (rotate && visualRoot != null) + { + visualRoot.Rotate(rotateAxis.normalized, rotateSpeed * Time.deltaTime, Space.Self); + } + + if (floatMotion) + { + float yOffset = Mathf.Sin(Time.time * floatSpeed) * floatHeight; + transform.position = startPosition + new Vector3(0f, yOffset, 0f); + } + } + + public void CollectStar() + { + + Debug.Log("CollectStar called."); + + if (CollectionManager.Instance != null) + { + CollectionManager.Instance.AddStar(1); + } + else + { + Debug.LogWarning("CollectionManager not found."); + } + + if (pickupSound != null && pickupSound != null) + { + SoundManager.Instance.PlaySFX(pickupSound); + } + + Destroy(gameObject); + } + + public void OnTriggerEnter(Collider other) + { + if(other.CompareTag(_playerTag)) + { + CollectStar(); + } + } +} diff --git a/Assets/02_Scripts/Managers/StarPickup.cs.meta b/Assets/02_Scripts/Managers/StarPickup.cs.meta new file mode 100644 index 00000000..34fbb3a6 --- /dev/null +++ b/Assets/02_Scripts/Managers/StarPickup.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 400203bf2ecfc114f91e0dc63fe1e219 \ No newline at end of file diff --git a/Assets/02_Scripts/Managers/change room manager/GateOpenZone.cs b/Assets/02_Scripts/Managers/change room manager/GateOpenZone.cs deleted file mode 100644 index 0745de74..00000000 --- a/Assets/02_Scripts/Managers/change room manager/GateOpenZone.cs +++ /dev/null @@ -1,55 +0,0 @@ -using UnityEngine; - -public class GateOpenZone : MonoBehaviour -{ - [Header("Ʈ ")] - [SerializeField] private RoomClearGateController roomClearGateController; - - [Header("Player Check")] - [SerializeField] private string playerTag = "Player"; - - private bool used = false; - - private void OnTriggerEnter(Collider other) - { - if (used) - { - return; - } - - if (!IsPlayer(other)) - { - return; - } - - if (roomClearGateController == null) - { - Debug.LogWarning("RoomClearGateController ʾҽϴ."); - return; - } - - if (!roomClearGateController.IsRoomCleared) - { - Debug.Log(" Ŭ Դϴ. Ʈ ʽϴ."); - return; - } - - used = true; - roomClearGateController.OpenClearGate(); - } - - private bool IsPlayer(Collider other) - { - if (other.CompareTag(playerTag)) - { - return true; - } - - if (other.transform.root.CompareTag(playerTag)) - { - return true; - } - - return false; - } -} \ No newline at end of file diff --git a/Assets/02_Scripts/Managers/change room manager/GateOpenZone.cs.meta b/Assets/02_Scripts/Managers/change room manager/GateOpenZone.cs.meta deleted file mode 100644 index 16038a4f..00000000 --- a/Assets/02_Scripts/Managers/change room manager/GateOpenZone.cs.meta +++ /dev/null @@ -1,2 +0,0 @@ -fileFormatVersion: 2 -guid: 6986d649e7cfba74881058e544e2f727 \ No newline at end of file diff --git a/Assets/02_Scripts/Managers/change room manager/RandomSceneRouteManager.cs b/Assets/02_Scripts/Managers/change room manager/RandomSceneRouteManager.cs index b268d287..73b6870c 100644 --- a/Assets/02_Scripts/Managers/change room manager/RandomSceneRouteManager.cs +++ b/Assets/02_Scripts/Managers/change room manager/RandomSceneRouteManager.cs @@ -15,6 +15,11 @@ public class RandomSceneRouteManager : MonoBehaviour private readonly HashSet visitedScenes = new HashSet(); private bool finalSceneUsed = false; + private string nextSceneCode1 = ""; + private string nextSceneCode2 = ""; + private string nextSceneName1 = ""; + private string nextSceneName2 = ""; + private void Awake() { if (Instance == null) @@ -28,10 +33,9 @@ private void Awake() } } - public string GetNextSceneName() + public void PrepareNextSceneChoices() { string currentSceneName = SceneManager.GetActiveScene().name; - Debug.Log(" ̸: " + currentSceneName); if (IsRoomScene(currentSceneName)) @@ -63,28 +67,131 @@ public string GetNextSceneName() candidates.Add(cleanSceneName); } - if (candidates.Count > 0) + Shuffle(candidates); + + nextSceneCode1 = ""; + nextSceneCode2 = ""; + nextSceneName1 = ""; + nextSceneName2 = ""; + + if (candidates.Count >= 1) { - int randomIndex = Random.Range(0, candidates.Count); - string selectedSceneName = candidates[randomIndex]; - - visitedScenes.Add(selectedSceneName); - - Debug.Log(" õ : " + selectedSceneName); - return selectedSceneName; + nextSceneCode1 = candidates[0]; + nextSceneName1 = GetDisplayName(nextSceneCode1); } - if (!finalSceneUsed && !string.IsNullOrWhiteSpace(finalSceneName)) + if (candidates.Count >= 2) + { + nextSceneCode2 = candidates[1]; + nextSceneName2 = GetDisplayName(nextSceneCode2); + } + else if (candidates.Count == 1 && !finalSceneUsed && !string.IsNullOrWhiteSpace(finalSceneName)) + { + nextSceneCode2 = finalSceneName.Trim(); + nextSceneName2 = GetDisplayName(nextSceneCode2); + } + + if (candidates.Count == 0) + { + if (!finalSceneUsed && !string.IsNullOrWhiteSpace(finalSceneName)) + { + nextSceneCode1 = finalSceneName.Trim(); + nextSceneName1 = GetDisplayName(nextSceneCode1); + } + else + { + Debug.LogWarning("̵ ϴ."); + } + } + + Debug.Log(" 1: " + nextSceneName1 + " / " + nextSceneCode1); + Debug.Log(" 2: " + nextSceneName2 + " / " + nextSceneCode2); + } + + public string GetNextSceneName1() + { + return nextSceneName1; + } + + public string GetNextSceneCode1() + { + return nextSceneCode1; + } + + public string GetNextSceneName2() + { + return nextSceneName2; + } + + public string GetNextSceneCode2() + { + return nextSceneCode2; + } + + public string GetNextSceneName() + { + PrepareNextSceneChoices(); + + if (!string.IsNullOrEmpty(nextSceneCode1)) + { + return nextSceneCode1; + } + + return string.Empty; + } + + public void MarkSceneVisited(string sceneName) + { + if (string.IsNullOrWhiteSpace(sceneName)) + { + return; + } + + string cleanSceneName = sceneName.Trim(); + + if (cleanSceneName == finalSceneName) { finalSceneUsed = true; - - string cleanFinalSceneName = finalSceneName.Trim(); - Debug.Log(" 湮 Ϸ. ̵: " + cleanFinalSceneName); - return cleanFinalSceneName; } - Debug.LogWarning("̵ ϴ."); - return string.Empty; + if (IsRoomScene(cleanSceneName)) + { + visitedScenes.Add(cleanSceneName); + } + + Debug.Log("湮 ó : " + cleanSceneName); + } + + private void Shuffle(List list) + { + for (int i = 0; i < list.Count; i++) + { + int randomIndex = Random.Range(i, list.Count); + string temp = list[i]; + list[i] = list[randomIndex]; + list[randomIndex] = temp; + } + } + + private string GetDisplayName(string sceneName) + { + switch (sceneName) + { + case "blackjack": + return ""; + + case "CatsRoom": + return "Ĺ"; + + case "MazeRoom": + return "̷ι"; + + case "Cave_Test_2": + return ""; + + default: + return sceneName; + } } private bool IsRoomScene(string sceneName) @@ -129,6 +236,12 @@ public void ResetRoute() { visitedScenes.Clear(); finalSceneUsed = false; + + nextSceneCode1 = ""; + nextSceneCode2 = ""; + nextSceneName1 = ""; + nextSceneName2 = ""; + Debug.Log(" 湮 ʱȭ"); } } \ No newline at end of file diff --git a/Assets/02_Scripts/Managers/change room manager/RoomClearGateController.cs b/Assets/02_Scripts/Managers/change room manager/RoomClearGateController.cs index 6b6dd8e9..99318ca1 100644 --- a/Assets/02_Scripts/Managers/change room manager/RoomClearGateController.cs +++ b/Assets/02_Scripts/Managers/change room manager/RoomClearGateController.cs @@ -2,28 +2,86 @@ public class RoomClearGateController : MonoBehaviour { - [Header("�� Ŭ���� �� ���� ����Ʈ")] + [Header("룸 클리어 후 열릴 게이트")] [SerializeField] private RoomExitGate exitGate; + [Header("Option")] + [SerializeField] private bool requireRoomClearedBeforeOpen = true; + private bool isRoomCleared = false; private bool gateOpened = false; - public bool IsRoomCleared => isRoomCleared; + private string selectedSceneCode = ""; + + // 랜덤 선택지 1, 2에 들어갈 씬 코드 + private string choiceSceneCode1 = ""; + private string choiceSceneCode2 = ""; + + public bool IsRoomCleared => isRoomCleared; + public string SelectedSceneCode => selectedSceneCode; + public bool HasSelectedScene => !string.IsNullOrEmpty(selectedSceneCode); - // ������ ���� �¸� �� ȣ�� - // �� �Լ��� ����Ʈ�� �ٷ� ���� �ʰ�, "�� Ŭ���� �Ϸ�" ���¸� ������ public void MarkRoomCleared() { isRoomCleared = true; - Debug.Log("�� Ŭ���� �Ϸ�. ���� �������� ���� ����Ʈ�� �����ϴ�."); + Debug.Log("방 클리어 완료. 이제 선택지에서 다음 방을 고를 수 있습니다."); } - // �������� ���� �� ȣ�� + // GameClear에서 랜덤으로 뽑은 선택지 코드를 여기에 저장 + public void SetDoorChoices(string code1, string code2) + { + choiceSceneCode1 = code1; + choiceSceneCode2 = code2; + + Debug.Log("문 선택지 1 코드: " + choiceSceneCode1); + Debug.Log("문 선택지 2 코드: " + choiceSceneCode2); + } + + // 대화 선택지 1번에서 호출 + public void OpenDoorChoice1() + { + OpenDoor(choiceSceneCode1); + } + + // 대화 선택지 2번에서 호출 + public void OpenDoorChoice2() + { + OpenDoor(choiceSceneCode2); + } + + // 실제 문 열기 + public void OpenDoor(string code) + { + if (string.IsNullOrEmpty(code)) + { + Debug.LogWarning("선택된 씬 코드가 비어있습니다."); + return; + } + + selectedSceneCode = code; + + Debug.Log("선택된 다음 씬 코드: " + selectedSceneCode); + + if (exitGate != null) + { + exitGate.SetNextSceneName(selectedSceneCode); + } + + OpenClearGate(); + } + + // 문 열기 실행 public void OpenClearGate() { - if (!isRoomCleared) + if (requireRoomClearedBeforeOpen && !isRoomCleared) { - Debug.Log("���� �� Ŭ���� ���̶� ����Ʈ�� �� �� �����ϴ�."); + Debug.Log("아직 방 클리어 전이라 게이트를 열 수 없습니다."); + return; + } + + if (!HasSelectedScene) + { + Debug.Log("아직 다음 방을 선택하지 않아서 게이트를 열지 않습니다."); return; } @@ -37,11 +95,11 @@ public void OpenClearGate() if (exitGate != null) { exitGate.OpenGate(); - Debug.Log("�� Ŭ���� ����Ʈ ����"); + Debug.Log("클리어 게이트 열림. 선택된 다음 씬: " + selectedSceneCode); } else { - Debug.LogWarning("Exit Gate�� ������� �ʾҽ��ϴ�."); + Debug.LogWarning("Exit Gate가 연결되지 않았습니다."); } } @@ -49,11 +107,8 @@ public void ResetClearState() { isRoomCleared = false; gateOpened = false; + selectedSceneCode = ""; + choiceSceneCode1 = ""; + choiceSceneCode2 = ""; } - - public void OpenDoor(string code) - { - Debug.Log($"다음씬코드 : {code}"); - } - } \ No newline at end of file diff --git a/Assets/02_Scripts/Managers/change room manager/RoomExitGate.cs b/Assets/02_Scripts/Managers/change room manager/RoomExitGate.cs index 8267e72b..ab35616f 100644 --- a/Assets/02_Scripts/Managers/change room manager/RoomExitGate.cs +++ b/Assets/02_Scripts/Managers/change room manager/RoomExitGate.cs @@ -34,10 +34,13 @@ public class RoomExitGate : MonoBehaviour [SerializeField] private string playerTag = "Player"; [Header("Scene Move")] - [SerializeField] private bool useRandomScene = true; + [SerializeField] private bool useRandomScene = false; [SerializeField] private string fallbackSceneName; [SerializeField] private float sceneMoveDelay = 0.2f; + [Header("Selected Scene")] + [SerializeField] private string selectedSceneName; + [Header("Start Setting")] [SerializeField] private bool hideGateOnStart = true; [SerializeField] private bool hidePortalOnStart = true; @@ -114,6 +117,12 @@ private void PrepareStartState() } } + public void SetNextSceneName(string sceneName) + { + selectedSceneName = sceneName; + Debug.Log("Ʈ : " + selectedSceneName); + } + public void OpenGate() { if (isOpened || isOpening) @@ -277,6 +286,11 @@ private IEnumerator EnterGateRoutine() private string GetNextSceneName() { + if (!string.IsNullOrEmpty(selectedSceneName)) + { + return selectedSceneName; + } + if (useRandomScene && RandomSceneRouteManager.Instance != null) { return RandomSceneRouteManager.Instance.GetNextSceneName(); @@ -322,5 +336,7 @@ public void CloseGateImmediately() { gateVisualRoot.SetActive(false); } + + selectedSceneName = ""; } } \ No newline at end of file diff --git a/Assets/02_Scripts/UI/StarPieceHud.cs b/Assets/02_Scripts/UI/StarPieceHud.cs new file mode 100644 index 00000000..366defa1 --- /dev/null +++ b/Assets/02_Scripts/UI/StarPieceHud.cs @@ -0,0 +1,31 @@ +using TMPro; +using UnityEngine; +using UnityEngine.UI; + +public class StarPieceHud : MonoBehaviour +{ + [SerializeField] private Image[] _imageArray; + [SerializeField] private TMP_Text _countText; + + [SerializeField] private GameObject _StarPieceUIRoot; + + public int GetStarCount => CollectionManager.Instance.GetStarCount; + + public void RefreshUI() + { + _countText.text = $"{GetStarCount} / {_imageArray.Length}"; + + for(int i = 0; i<_imageArray.Length; i++) + { + if(i < GetStarCount) + { + _imageArray[i].gameObject.SetActive(true); + } + } + } + + public void StarPieceHudToggle() + { + _StarPieceUIRoot.SetActive(!_StarPieceUIRoot.activeSelf); + } +} diff --git a/Assets/02_Scripts/UI/StarPieceHud.cs.meta b/Assets/02_Scripts/UI/StarPieceHud.cs.meta new file mode 100644 index 00000000..60bffbd6 --- /dev/null +++ b/Assets/02_Scripts/UI/StarPieceHud.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 1b4836d7a85fcc848b5a25b8a2e51a36 \ No newline at end of file diff --git a/Assets/02_Scripts/Zone.cs b/Assets/02_Scripts/Zone.cs index 904653a0..21c5e09d 100644 --- a/Assets/02_Scripts/Zone.cs +++ b/Assets/02_Scripts/Zone.cs @@ -6,5 +6,6 @@ public enum Zone Ocean, Island, Seaside, - BlackjackGame + BlackjackGame, + BlackBgm, } diff --git a/Assets/04_Models/Blackjack/anim/HookAnimatorController.controller b/Assets/04_Models/Blackjack/anim/HookAnimatorController.controller index 8ed1717b..22a8ad48 100644 --- a/Assets/04_Models/Blackjack/anim/HookAnimatorController.controller +++ b/Assets/04_Models/Blackjack/anim/HookAnimatorController.controller @@ -1,5 +1,32 @@ %YAML 1.1 %TAG !u! tag:unity3d.com,2011: +--- !u!1102 &-8829892400974366486 +AnimatorState: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: haha + m_Speed: 1 + m_CycleOffset: 0 + m_Transitions: + - {fileID: -7144898928548359961} + m_StateMachineBehaviours: [] + m_Position: {x: 50, y: 50, z: 0} + m_IKOnFeet: 0 + m_WriteDefaultValues: 1 + m_Mirror: 0 + m_SpeedParameterActive: 0 + m_MirrorParameterActive: 0 + m_CycleOffsetParameterActive: 0 + m_TimeParameterActive: 0 + m_Motion: {fileID: -203655887218126122, guid: fd3218d654dae414aa86ae411d2266c5, type: 3} + m_Tag: + m_SpeedParameter: + m_MirrorParameter: + m_CycleOffsetParameter: + m_TimeParameter: --- !u!1101 &-8356897612337189899 AnimatorStateTransition: m_ObjectHideFlags: 1 @@ -25,6 +52,28 @@ AnimatorStateTransition: m_InterruptionSource: 0 m_OrderedInterruption: 1 m_CanTransitionToSelf: 1 +--- !u!1101 &-7144898928548359961 +AnimatorStateTransition: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: + m_Conditions: [] + m_DstStateMachine: {fileID: 0} + m_DstState: {fileID: 4760819219485939668} + m_Solo: 0 + m_Mute: 0 + m_IsExit: 0 + serializedVersion: 3 + m_TransitionDuration: 0.99999905 + m_TransitionOffset: 0 + m_ExitTime: 0.90151525 + m_HasExitTime: 1 + m_HasFixedDuration: 1 + m_InterruptionSource: 0 + m_OrderedInterruption: 1 + m_CanTransitionToSelf: 1 --- !u!1101 &-5852507744452669881 AnimatorStateTransition: m_ObjectHideFlags: 1 @@ -50,6 +99,33 @@ AnimatorStateTransition: m_InterruptionSource: 0 m_OrderedInterruption: 1 m_CanTransitionToSelf: 1 +--- !u!1102 &-5630778535548308489 +AnimatorState: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: WAVING + m_Speed: 1 + m_CycleOffset: 0 + m_Transitions: + - {fileID: 7445659691665811515} + m_StateMachineBehaviours: [] + m_Position: {x: 50, y: 50, z: 0} + m_IKOnFeet: 0 + m_WriteDefaultValues: 1 + m_Mirror: 0 + m_SpeedParameterActive: 0 + m_MirrorParameterActive: 0 + m_CycleOffsetParameterActive: 0 + m_TimeParameterActive: 0 + m_Motion: {fileID: -203655887218126122, guid: ca6806f4c66ad464bacd03026cbbdc21, type: 3} + m_Tag: + m_SpeedParameter: + m_MirrorParameter: + m_CycleOffsetParameter: + m_TimeParameter: --- !u!1102 &-4023960777948198572 AnimatorState: serializedVersion: 6 @@ -99,6 +175,28 @@ AnimatorStateTransition: m_InterruptionSource: 0 m_OrderedInterruption: 1 m_CanTransitionToSelf: 1 +--- !u!1101 &-2059444642337868327 +AnimatorStateTransition: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: + m_Conditions: [] + m_DstStateMachine: {fileID: 0} + m_DstState: {fileID: 4760819219485939668} + m_Solo: 0 + m_Mute: 0 + m_IsExit: 0 + serializedVersion: 3 + m_TransitionDuration: 0.25 + m_TransitionOffset: 0 + m_ExitTime: 0.93119264 + m_HasExitTime: 1 + m_HasFixedDuration: 1 + m_InterruptionSource: 0 + m_OrderedInterruption: 1 + m_CanTransitionToSelf: 1 --- !u!1101 &-1204995913918529780 AnimatorStateTransition: m_ObjectHideFlags: 1 @@ -148,6 +246,15 @@ AnimatorStateMachine: - serializedVersion: 1 m_State: {fileID: 9049851607463686061} m_Position: {x: 840, y: 40, z: 0} + - serializedVersion: 1 + m_State: {fileID: -5630778535548308489} + m_Position: {x: -20, y: -30, z: 0} + - serializedVersion: 1 + m_State: {fileID: 8866407398716168888} + m_Position: {x: -20, y: -130, z: 0} + - serializedVersion: 1 + m_State: {fileID: -8829892400974366486} + m_Position: {x: -186.56763, y: 34.210876, z: 0} m_ChildStateMachines: [] m_AnyStateTransitions: - {fileID: -5852507744452669881} @@ -293,6 +400,28 @@ AnimatorTransition: m_Mute: 0 m_IsExit: 0 serializedVersion: 1 +--- !u!1101 &7445659691665811515 +AnimatorStateTransition: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: + m_Conditions: [] + m_DstStateMachine: {fileID: 0} + m_DstState: {fileID: 4760819219485939668} + m_Solo: 0 + m_Mute: 0 + m_IsExit: 0 + serializedVersion: 3 + m_TransitionDuration: 0.3 + m_TransitionOffset: 0 + m_ExitTime: 5 + m_HasExitTime: 1 + m_HasFixedDuration: 1 + m_InterruptionSource: 0 + m_OrderedInterruption: 1 + m_CanTransitionToSelf: 1 --- !u!1101 &7452801053318244084 AnimatorStateTransition: m_ObjectHideFlags: 1 @@ -307,7 +436,7 @@ AnimatorStateTransition: m_Mute: 0 m_IsExit: 0 serializedVersion: 3 - m_TransitionDuration: 0.25 + m_TransitionDuration: 0.1 m_TransitionOffset: 0 m_ExitTime: 0.8897059 m_HasExitTime: 1 @@ -315,6 +444,33 @@ AnimatorStateTransition: m_InterruptionSource: 0 m_OrderedInterruption: 1 m_CanTransitionToSelf: 1 +--- !u!1102 &8866407398716168888 +AnimatorState: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: pointing + m_Speed: 1 + m_CycleOffset: 0 + m_Transitions: + - {fileID: -2059444642337868327} + m_StateMachineBehaviours: [] + m_Position: {x: 50, y: 50, z: 0} + m_IKOnFeet: 0 + m_WriteDefaultValues: 1 + m_Mirror: 0 + m_SpeedParameterActive: 0 + m_MirrorParameterActive: 0 + m_CycleOffsetParameterActive: 0 + m_TimeParameterActive: 0 + m_Motion: {fileID: -203655887218126122, guid: e93a1ebc93844d641a1addb257b141ef, type: 3} + m_Tag: + m_SpeedParameter: + m_MirrorParameter: + m_CycleOffsetParameter: + m_TimeParameter: --- !u!1102 &9048296276227621119 AnimatorState: serializedVersion: 6 diff --git a/Assets/04_Models/Blackjack/anim/hook@Cards.fbx b/Assets/04_Models/Blackjack/anim/hook@Cards.fbx deleted file mode 100644 index 815d1f18..00000000 --- a/Assets/04_Models/Blackjack/anim/hook@Cards.fbx +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:59151ae8458528abfd09e152ac4fb64d02551d6a1c2e91387a652ca17838cd7a -size 1365056 diff --git a/Assets/04_Models/Blackjack/anim/hook@T-Pose@Laughing.fbx b/Assets/04_Models/Blackjack/anim/hook@T-Pose@Laughing.fbx new file mode 100644 index 00000000..b0a00343 --- /dev/null +++ b/Assets/04_Models/Blackjack/anim/hook@T-Pose@Laughing.fbx @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:67954f337c55d80845e2720e0aa93f57444543e4b3a6986f0184b077756bb282 +size 1478944 diff --git a/Assets/04_Models/Blackjack/anim/hook@Cards.fbx.meta b/Assets/04_Models/Blackjack/anim/hook@T-Pose@Laughing.fbx.meta similarity index 78% rename from Assets/04_Models/Blackjack/anim/hook@Cards.fbx.meta rename to Assets/04_Models/Blackjack/anim/hook@T-Pose@Laughing.fbx.meta index 02e02ce5..361ff158 100644 --- a/Assets/04_Models/Blackjack/anim/hook@Cards.fbx.meta +++ b/Assets/04_Models/Blackjack/anim/hook@T-Pose@Laughing.fbx.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 7bbf62f7935de5141885e83476ed69a2 +guid: fd3218d654dae414aa86ae411d2266c5 ModelImporter: serializedVersion: 24200 internalIDToNameTable: [] @@ -41,7 +41,7 @@ ModelImporter: importPhysicalCameras: 1 importVisibility: 1 importBlendShapes: 1 - importCameras: 1 + importCameras: 0 importLights: 1 nodeNameCollisionStrategy: 1 fileIdsGeneration: 2 @@ -500,61 +500,61 @@ ModelImporter: length: 0 modified: 0 skeleton: - - name: hook@Cards(Clone) + - name: hook@T-Pose@Laughing(Clone) parentName: position: {x: 0, y: 0, z: 0} rotation: {x: 0, y: 0, z: 0, w: 1} scale: {x: 1, y: 1, z: 1} - name: 5_material001_1_0_0.001 - parentName: hook@Cards(Clone) + parentName: hook@T-Pose@Laughing(Clone) position: {x: -0, y: 0, z: 0} rotation: {x: 0.7071068, y: 0, z: -0, w: 0.7071067} scale: {x: 0.01, y: 0.01, z: 0.01} - name: 5_material002_1_0_0 - parentName: hook@Cards(Clone) + parentName: hook@T-Pose@Laughing(Clone) position: {x: -0, y: 0, z: 0} rotation: {x: 0.7071068, y: 0, z: -0, w: 0.7071067} scale: {x: 0.01, y: 0.01, z: 0.01} - name: 5_material004_1_0_0 - parentName: hook@Cards(Clone) + parentName: hook@T-Pose@Laughing(Clone) position: {x: -0, y: 0, z: 0} rotation: {x: 0.7071068, y: 0, z: -0, w: 0.7071067} scale: {x: 0.01, y: 0.01, z: 0.01} - name: 5_material006_1_0_0 - parentName: hook@Cards(Clone) + parentName: hook@T-Pose@Laughing(Clone) position: {x: -0.045422647, y: 0, z: 0} rotation: {x: 0.7071068, y: 0, z: -0, w: 0.7071067} scale: {x: 0.01, y: 0.01, z: 0.01} - name: 5_xapp7010out_1_0_0 - parentName: hook@Cards(Clone) + parentName: hook@T-Pose@Laughing(Clone) position: {x: -0, y: 0, z: 0} rotation: {x: 0.7071068, y: 0, z: -0, w: 0.7071067} scale: {x: 0.01, y: 0.01, z: 0.01} - name: mixamorig:Hips - parentName: hook@Cards(Clone) - position: {x: 0.008456179, y: 3.1045055, z: 0.04713432} - rotation: {x: -0.000000022249882, y: 2.4123075e-16, z: -0.0000000017053029, w: 1} - scale: {x: 0.99999994, y: 0.99999994, z: 1} + parentName: hook@T-Pose@Laughing(Clone) + position: {x: -0.0014866644, y: 3.0808198, z: 0.021990215} + rotation: {x: -0.000000022249862, y: -8.342562e-16, z: 0.0000000058975047, w: 1} + scale: {x: 1, y: 1, z: 0.99999994} - name: mixamorig:LeftUpLeg parentName: mixamorig:Hips position: {x: -0.14975488, y: -0.1577414, z: 0.006684875} - rotation: {x: 0.0007716752, y: -0.04275528, z: 0.99892265, w: 0.018029207} - scale: {x: 1.000001, y: 1.0000008, z: 1} + rotation: {x: 0.00077168405, y: -0.042755287, z: 0.99892265, w: 0.018029219} + scale: {x: 1.0000008, y: 1.0000008, z: 0.99999994} - name: mixamorig:LeftLeg parentName: mixamorig:LeftUpLeg position: {x: -0.0000000019451212, y: 1.3585317, z: 0.0000000028413578} - rotation: {x: -0.0005702273, y: -0.000009830484, z: 0.017246297, w: 0.9998511} - scale: {x: 1.0000002, y: 1.0000004, z: 0.99999994} + rotation: {x: -0.00057021284, y: -0.000009795286, z: 0.017246315, w: 0.9998511} + scale: {x: 1.0000001, y: 1.0000002, z: 1} - name: mixamorig:LeftFoot parentName: mixamorig:LeftLeg position: {x: 8.80296e-11, y: 1.1250092, z: 0.0000000017627688} - rotation: {x: 0.49222133, y: 0.018871373, z: -0.010674433, w: 0.8702001} - scale: {x: 0.99999946, y: 1.0000001, z: 0.9999996} + rotation: {x: 0.49222133, y: 0.018871378, z: -0.010674423, w: 0.8702001} + scale: {x: 0.9999997, y: 1, z: 0.9999996} - name: mixamorig:LeftToeBase parentName: mixamorig:LeftFoot position: {x: 0.000000001196656, y: 0.64211065, z: 0.0000000036517485} - rotation: {x: 0.28951234, y: 0.09490796, z: -0.02886179, w: 0.9520201} - scale: {x: 0.99999994, y: 1.0000005, z: 0.9999997} + rotation: {x: 0.28951228, y: 0.09490794, z: -0.028861802, w: 0.95202005} + scale: {x: 0.9999998, y: 1.0000005, z: 0.9999997} - name: mixamorig:LeftToe_End parentName: mixamorig:LeftToeBase position: {x: -9.389093e-10, y: 0.20702621, z: -3.2714068e-10} @@ -563,23 +563,23 @@ ModelImporter: - name: mixamorig:RightUpLeg parentName: mixamorig:Hips position: {x: 0.14975488, y: -0.1577414, z: -0.03548023} - rotation: {x: -0.00047150688, y: -0.026064675, z: 0.99949664, w: -0.018081147} - scale: {x: 1.0000001, y: 1.0000004, z: 1.0000001} + rotation: {x: -0.000471512, y: -0.026064653, z: 0.99949664, w: -0.01808115} + scale: {x: 1.0000004, y: 1.0000006, z: 1.0000002} - name: mixamorig:RightLeg parentName: mixamorig:RightUpLeg position: {x: 0.0000000028921283, y: 1.3554095, z: 4.4380805e-10} - rotation: {x: -0.02925755, y: 0.0005058918, z: -0.017280925, w: 0.99942243} - scale: {x: 1.0000002, y: 1.0000002, z: 0.9999998} + rotation: {x: -0.029257566, y: 0.0005058832, z: -0.017280936, w: 0.99942243} + scale: {x: 0.99999976, y: 0.9999998, z: 1} - name: mixamorig:RightFoot parentName: mixamorig:RightLeg position: {x: 2.0467076e-11, y: 1.1276793, z: -0.000000005314304} - rotation: {x: 0.511915, y: -0.017581979, z: 0.010480368, w: 0.85879225} - scale: {x: 0.99999964, y: 1, z: 0.9999997} + rotation: {x: 0.51191497, y: -0.017581945, z: 0.010480369, w: 0.85879225} + scale: {x: 1.0000001, y: 1.0000004, z: 0.9999999} - name: mixamorig:RightToeBase parentName: mixamorig:RightFoot position: {x: 0.0000000013098411, y: 0.6619576, z: 0.000000029463422} - rotation: {x: 0.2794544, y: -0.10012644, z: 0.029315412, w: 0.954474} - scale: {x: 1.0000004, y: 1.0000001, z: 1.0000001} + rotation: {x: 0.27945447, y: -0.100126445, z: 0.029315403, w: 0.954474} + scale: {x: 1.0000007, y: 1.0000002, z: 1.0000001} - name: mixamorig:RightToe_End parentName: mixamorig:RightToeBase position: {x: 0.0000000010473408, y: 0.2075563, z: 3.925841e-11} @@ -588,28 +588,28 @@ ModelImporter: - name: mixamorig:Spine parentName: mixamorig:Hips position: {x: -0, y: 0.28353056, z: 0.0053001596} - rotation: {x: 0.009345522, y: 1.3944584e-11, z: 0.0000000014920749, w: 0.99995637} - scale: {x: 1, y: 1.0000001, z: 1} + rotation: {x: 0.009345522, y: -1.215055e-10, z: -0.0000000101499396, w: 0.99995637} + scale: {x: 0.99999994, y: 1, z: 1} - name: mixamorig:Spine1 parentName: mixamorig:Spine position: {x: -0, y: 0.330843, z: -1.8830064e-10} - rotation: {x: -0.00000003352761, y: -6.640035e-12, z: -3.5520928e-10, w: 1} - scale: {x: 1, y: 1, z: 1} + rotation: {x: -0.000000027939674, y: 1.1476385e-10, z: 0.0000000047136575, w: 1} + scale: {x: 1.0000001, y: 1, z: 1} - name: mixamorig:Spine2 parentName: mixamorig:Spine1 position: {x: -0, y: 0.3781068, z: -4.864205e-11} - rotation: {x: -0, y: -0.000000004546681, z: 8.4992104e-11, w: 1} - scale: {x: 1, y: 1, z: 1.0000001} + rotation: {x: -9.3132246e-10, y: 2.652434e-10, z: -0.0000000010176586, w: 1} + scale: {x: 0.99999994, y: 1.0000001, z: 1} - name: mixamorig:Neck parentName: mixamorig:Spine2 position: {x: -0, y: 0.4253697, z: 0.000000018036033} - rotation: {x: -0.009345493, y: -0.000000004552588, z: -5.259116e-10, w: 0.99995637} - scale: {x: 1, y: 1, z: 1} + rotation: {x: -0.009345493, y: -4.400856e-10, z: -0.0000000014703275, w: 0.99995637} + scale: {x: 1.0000001, y: 1.0000001, z: 1.0000001} - name: mixamorig:Head parentName: mixamorig:Neck position: {x: -0, y: 0.11319915, z: 0.009868775} - rotation: {x: 0.000000004547447, y: 0.000000004547476, z: -0.0000000011368677, w: 1} - scale: {x: 1.0000001, y: 0.99999994, z: 0.99999976} + rotation: {x: 0.0000000011368879, y: 1.4210794e-10, z: 0.0000000037303494, w: 1} + scale: {x: 1, y: 0.99999976, z: 1} - name: mixamorig:HeadTop_End parentName: mixamorig:Head position: {x: -0, y: 1.9258041, z: 0.16789289} @@ -618,38 +618,38 @@ ModelImporter: - name: mixamorig:RightShoulder parentName: mixamorig:Spine2 position: {x: 0.197805, y: 0.37837464, z: 0.0026349584} - rotation: {x: 0.5623024, y: 0.43052495, z: -0.554576, w: 0.4369323} - scale: {x: 1.0000001, y: 1.0000008, z: 1.0000002} + rotation: {x: 0.5623024, y: 0.43052498, z: -0.554576, w: 0.4369323} + scale: {x: 1.0000006, y: 1.0000008, z: 1.000001} - name: mixamorig:RightArm parentName: mixamorig:RightShoulder position: {x: -1.390573e-10, y: 0.38049152, z: 2.509796e-10} - rotation: {x: -0.08874271, y: 0.00037954742, z: -0.022076992, w: 0.9958098} - scale: {x: 1.0000004, y: 1.0000005, z: 1.0000008} + rotation: {x: -0.08874268, y: 0.00037945798, z: -0.022076989, w: 0.9958098} + scale: {x: 1.0000005, y: 1.0000006, z: 1.0000002} - name: mixamorig:RightForeArm parentName: mixamorig:RightArm position: {x: 1.6904582e-10, y: 0.50041974, z: -0.0000000011775603} - rotation: {x: -0.059749708, y: -0.0002270485, z: 0.0037923332, w: 0.99820614} - scale: {x: 1.0000017, y: 1.0000007, z: 1.0000017} + rotation: {x: -0.05974967, y: -0.00022697158, z: 0.00379231, w: 0.9982062} + scale: {x: 1.000001, y: 1.0000007, z: 1.000001} - name: mixamorig:RightHand parentName: mixamorig:RightForeArm position: {x: -2.4690756e-11, y: 0.937633, z: 5.1227286e-12} - rotation: {x: -0.019384712, y: -0.006780252, z: -0.007702768, w: 0.99975944} - scale: {x: 0.9999998, y: 0.99999994, z: 0.99999946} + rotation: {x: -0.019384725, y: -0.0067802956, z: -0.007702737, w: 0.99975944} + scale: {x: 1.0000005, y: 1.0000007, z: 1.0000001} - name: mixamorig:RightHandMiddle1 parentName: mixamorig:RightHand position: {x: -0.03545806, y: 0.5353644, z: 0.0019264681} - rotation: {x: -0.031438254, y: 0.00027285886, z: 0.008671787, w: -0.999468} - scale: {x: 1.0000001, y: 1, z: 1} + rotation: {x: -0.03143821, y: 0.0002727867, z: 0.008671788, w: -0.9994681} + scale: {x: 1.0000004, y: 1.0000005, z: 1.0000002} - name: mixamorig:RightHandMiddle2 parentName: mixamorig:RightHandMiddle1 position: {x: -0.000028167819, y: 0.08886189, z: 5.845834e-11} - rotation: {x: 0.03733938, y: -0.000000050175004, z: 0.000000004367166, w: -0.9993027} - scale: {x: 1.0000002, y: 1.0000005, z: 1.0000002} + rotation: {x: 0.037339356, y: 0.000000007392373, z: 0.00000002066588, w: -0.9993027} + scale: {x: 0.99999994, y: 0.99999994, z: 1.0000001} - name: mixamorig:RightHandMiddle3 parentName: mixamorig:RightHandMiddle2 position: {x: 0.00020980366, y: 0.09219719, z: -6.5337813e-10} - rotation: {x: -0.03822484, y: 0.000027556252, z: 0.0017217121, w: -0.9992677} - scale: {x: 1.0000004, y: 1.0000006, z: 1.0000004} + rotation: {x: -0.0382277, y: 0.00002750461, z: 0.0017215544, w: -0.9992676} + scale: {x: 1.0000001, y: 1.0000002, z: 1} - name: mixamorig:RightHandMiddle4 parentName: mixamorig:RightHandMiddle3 position: {x: -0.0001816355, y: 0.059238642, z: -8.622328e-10} @@ -658,18 +658,18 @@ ModelImporter: - name: mixamorig:RightHandRing1 parentName: mixamorig:RightHand position: {x: 0.038296476, y: 0.5425451, z: 0.00046452272} - rotation: {x: 0.033387557, y: 0.0006608376, z: 0.019779317, w: 0.9992466} - scale: {x: 1.0000002, y: 1.0000001, z: 1.0000002} + rotation: {x: 0.033387598, y: 0.00066082133, z: 0.019779284, w: 0.9992466} + scale: {x: 1.0000002, y: 1.0000002, z: 1.0000002} - name: mixamorig:RightHandRing2 parentName: mixamorig:RightHandRing1 position: {x: 0.0002110886, y: 0.07879155, z: -1.6370051e-10} - rotation: {x: -0.039530255, y: -0.0000000119325705, z: -0.000000018351784, w: 0.99921846} - scale: {x: 1.0000002, y: 1.0000006, z: 1.0000001} + rotation: {x: -0.039530266, y: 0.00000007770722, z: -0.000000048805298, w: 0.99921846} + scale: {x: 1.0000001, y: 1.0000001, z: 1.0000005} - name: mixamorig:RightHandRing3 parentName: mixamorig:RightHandRing2 position: {x: 0.00029928703, y: 0.07871826, z: 3.2039055e-10} - rotation: {x: 0.032746993, y: -0.00054724346, z: -0.005740865, w: 0.99944705} - scale: {x: 1.0000001, y: 1.0000002, z: 1} + rotation: {x: 0.032747056, y: -0.0005473451, z: -0.005742475, w: 0.9994471} + scale: {x: 1.0000002, y: 1.0000002, z: 1} - name: mixamorig:RightHandRing4 parentName: mixamorig:RightHandRing3 position: {x: -0.00051037536, y: 0.05249024, z: -0.000000002114308} @@ -678,18 +678,18 @@ ModelImporter: - name: mixamorig:RightHandPinky1 parentName: mixamorig:RightHand position: {x: 0.11073744, y: 0.43915913, z: -0.0117313685} - rotation: {x: 0.06304618, y: 0.0006041345, z: 0.009564209, w: 0.9979646} - scale: {x: 1.0000001, y: 0.99999994, z: 1} + rotation: {x: 0.063046165, y: 0.00060416106, z: 0.009564206, w: 0.9979646} + scale: {x: 1.0000002, y: 1.0000002, z: 1.0000002} - name: mixamorig:RightHandPinky2 parentName: mixamorig:RightHandPinky1 position: {x: 0.00006654289, y: 0.10422929, z: -3.818127e-10} - rotation: {x: -0.041240484, y: -0.000010683608, z: 0.00014551706, w: 0.9991493} - scale: {x: 1.0000004, y: 1.0000006, z: 1.0000002} + rotation: {x: -0.041245762, y: -0.0000107575315, z: 0.00014544377, w: 0.9991491} + scale: {x: 1.0000005, y: 1.0000008, z: 1.0000007} - name: mixamorig:RightHandPinky3 parentName: mixamorig:RightHandPinky2 position: {x: 0.00023919014, y: 0.08287318, z: 3.1423041e-12} - rotation: {x: 0.037322856, y: -0.0000841539, z: -0.0026970142, w: 0.9992996} - scale: {x: 1.0000004, y: 1.0000002, z: 1.0000002} + rotation: {x: 0.037323605, y: -0.00008419643, z: -0.002696845, w: 0.9992996} + scale: {x: 1.0000002, y: 1.0000001, z: 1.0000001} - name: mixamorig:RightHandPinky4 parentName: mixamorig:RightHandPinky3 position: {x: -0.00030573303, y: 0.063802734, z: 3.3474293e-10} @@ -698,18 +698,18 @@ ModelImporter: - name: mixamorig:RightHandIndex1 parentName: mixamorig:RightHand position: {x: -0.11357587, y: 0.510066, z: -0.010320363} - rotation: {x: 0.06285603, y: 0.00078592636, z: 0.012478035, w: 0.99794436} - scale: {x: 1, y: 1, z: 1} + rotation: {x: 0.06285611, y: 0.0007859082, z: 0.01247806, w: 0.99794436} + scale: {x: 1.0000002, y: 1.0000005, z: 1.0000004} - name: mixamorig:RightHandIndex2 parentName: mixamorig:RightHandIndex1 position: {x: -0.00026563328, y: 0.09480911, z: 2.1595155e-10} - rotation: {x: -0.04062926, y: 0.000021724669, z: 0.0005240448, w: 0.99917424} - scale: {x: 1.0000004, y: 1.0000007, z: 1.0000002} + rotation: {x: -0.040629525, y: 0.000021839043, z: 0.00052417815, w: 0.99917424} + scale: {x: 1.0000001, y: 1.0000001, z: 1.0000002} - name: mixamorig:RightHandIndex3 parentName: mixamorig:RightHandIndex2 position: {x: 0.00004411348, y: 0.08888399, z: 2.4823066e-10} - rotation: {x: -0.04102321, y: -0.000020471376, z: 0.00029430035, w: 0.99915814} - scale: {x: 1.0000001, y: 1.0000001, z: 1} + rotation: {x: -0.04102332, y: -0.00002056675, z: 0.00029446, w: 0.9991582} + scale: {x: 1.0000002, y: 1.0000005, z: 1.0000001} - name: mixamorig:RightHandIndex4 parentName: mixamorig:RightHandIndex3 position: {x: 0.0002215197, y: 0.06604138, z: -4.664139e-10} @@ -718,18 +718,18 @@ ModelImporter: - name: mixamorig:RightHandThumb1 parentName: mixamorig:RightHand position: {x: -0.087179735, y: 0.16596074, z: 0.04390902} - rotation: {x: 0.060836364, y: -0.017510498, z: 0.25594532, w: 0.9646162} - scale: {x: 1.0000012, y: 1.0000011, z: 1.0000011} + rotation: {x: 0.060836658, y: -0.017510317, z: 0.25594544, w: 0.9646162} + scale: {x: 1.0000008, y: 1.0000006, z: 1.0000006} - name: mixamorig:RightHandThumb2 parentName: mixamorig:RightHandThumb1 position: {x: -0.030290283, y: 0.15102364, z: -0.0000000020675168} - rotation: {x: -0.010117329, y: 0.0018081141, z: 0.09708643, w: 0.99522287} - scale: {x: 1.0000004, y: 1.0000004, z: 1.0000005} + rotation: {x: -0.010120069, y: 0.0018076315, z: 0.0970852, w: 0.995223} + scale: {x: 0.99999994, y: 0.99999994, z: 1.0000001} - name: mixamorig:RightHandThumb3 parentName: mixamorig:RightHandThumb2 position: {x: 0.00892542, y: 0.13261847, z: 8.45539e-10} - rotation: {x: -0.034926284, y: -0.015328473, z: 0.050017122, w: 0.99801975} - scale: {x: 0.9999997, y: 1.0000001, z: 0.99999994} + rotation: {x: -0.034925964, y: -0.01532866, z: 0.05001777, w: 0.99801975} + scale: {x: 1, y: 1.0000005, z: 1.0000006} - name: mixamorig:RightHandThumb4 parentName: mixamorig:RightHandThumb3 position: {x: 0.021364858, y: 0.10800765, z: -6.3400875e-11} @@ -738,38 +738,38 @@ ModelImporter: - name: mixamorig:LeftShoulder parentName: mixamorig:Spine2 position: {x: -0.197805, y: 0.37830898, z: -0.0008766961} - rotation: {x: 0.55724436, y: -0.43470177, z: 0.55981225, w: 0.43257764} - scale: {x: 1.0000008, y: 1.0000008, z: 1.0000006} + rotation: {x: 0.55724436, y: -0.43470177, z: 0.5598123, w: 0.43257764} + scale: {x: 1.0000008, y: 1.0000011, z: 1.0000012} - name: mixamorig:LeftArm parentName: mixamorig:LeftShoulder position: {x: 4.0774494e-13, y: 0.38049147, z: 0.0000000042105346} - rotation: {x: -0.08837006, y: -0.000021815298, z: -0.01709774, w: 0.99594104} - scale: {x: 1.0000001, y: 1.0000004, z: 1.0000007} + rotation: {x: -0.088370115, y: -0.000021860003, z: -0.017097801, w: 0.99594104} + scale: {x: 0.99999946, y: 0.9999998, z: 0.9999998} - name: mixamorig:LeftForeArm parentName: mixamorig:LeftArm position: {x: 2.4208002e-10, y: 0.50039995, z: 0.0000000026046165} - rotation: {x: 0.05961848, y: 0.00013016268, z: -0.0021813076, w: -0.99821883} - scale: {x: 1.0000002, y: 1.000001, z: 1.0000002} + rotation: {x: 0.05961853, y: 0.0001302449, z: -0.0021813326, w: -0.9982189} + scale: {x: 0.9999999, y: 1.000001, z: 0.99999934} - name: mixamorig:LeftHand parentName: mixamorig:LeftForeArm position: {x: 2.9981243e-11, y: 0.93764526, z: 7.549374e-12} - rotation: {x: 0.02591516, y: -0.005489573, z: -0.019795552, w: -0.99945307} - scale: {x: 1.0000014, y: 1.0000012, z: 1.0000011} + rotation: {x: 0.025915045, y: -0.005489648, z: -0.019795628, w: -0.99945307} + scale: {x: 1.0000006, y: 1.0000011, z: 1.0000014} - name: mixamorig:LeftHandRing1 parentName: mixamorig:LeftHand position: {x: -0.036952168, y: 0.47512022, z: -0.004046206} - rotation: {x: 0.071453124, y: -0.0015868843, z: -0.02214481, w: 0.9971969} - scale: {x: 0.99999994, y: 1, z: 1.0000001} + rotation: {x: 0.07145308, y: -0.0015869439, z: -0.022144824, w: 0.99719685} + scale: {x: 0.99999994, y: 0.99999994, z: 1.0000002} - name: mixamorig:LeftHandRing2 parentName: mixamorig:LeftHandRing1 position: {x: 0.000065558655, y: 0.08429992, z: -6.538113e-10} - rotation: {x: -0.04043396, y: 0.000015881371, z: -0.00053236325, w: 0.99918216} - scale: {x: 1.0000004, y: 1.0000005, z: 1.0000006} + rotation: {x: -0.04043103, y: 0.000015924212, z: -0.00053221144, w: 0.9991823} + scale: {x: 1.0000001, y: 0.99999994, z: 1.0000005} - name: mixamorig:LeftHandRing3 parentName: mixamorig:LeftHandRing2 position: {x: -0.00016788799, y: 0.078385524, z: 1.34591e-10} - rotation: {x: 0.04004634, y: -0.000008216232, z: 0.00082362676, w: 0.99919754} - scale: {x: 0.99999994, y: 0.9999998, z: 0.9999998} + rotation: {x: 0.040049262, y: -0.000008178698, z: 0.00082318904, w: 0.9991974} + scale: {x: 1.0000002, y: 1, z: 1.0000001} - name: mixamorig:LeftHandRing4 parentName: mixamorig:LeftHandRing3 position: {x: 0.000102329206, y: 0.063196994, z: -8.19756e-10} @@ -778,18 +778,18 @@ ModelImporter: - name: mixamorig:LeftHandPinky1 parentName: mixamorig:LeftHand position: {x: -0.10820173, y: 0.38745376, z: -0.0047338177} - rotation: {x: 0.0421667, y: -0.0007741368, z: -0.018338306, w: 0.998942} - scale: {x: 1.0000001, y: 1.0000001, z: 1} + rotation: {x: 0.042166732, y: -0.0007741568, z: -0.018338364, w: 0.998942} + scale: {x: 1, y: 0.9999997, z: 1.0000002} - name: mixamorig:LeftHandPinky2 parentName: mixamorig:LeftHandPinky1 position: {x: -0.0000261434, y: 0.100719325, z: -4.695249e-10} - rotation: {x: -0.011289827, y: 0.000000035332047, z: 0.00000012530107, w: 0.9999363} - scale: {x: 1.0000005, y: 1.0000006, z: 1.0000006} + rotation: {x: -0.0112900045, y: 0.000000021769665, z: 0.000000107911546, w: 0.9999363} + scale: {x: 1.0000001, y: 1, z: 1.0000004} - name: mixamorig:LeftHandPinky3 parentName: mixamorig:LeftHandPinky2 position: {x: -0.00006658864, y: 0.08059741, z: 1.894989e-11} - rotation: {x: 0.037761074, y: -0.00000005072612, z: -0.0000001621027, w: 0.9992868} - scale: {x: 1.0000002, y: 1.0000002, z: 1.0000002} + rotation: {x: 0.03776123, y: 0.0000000025057216, z: -0.000000009199613, w: 0.99928683} + scale: {x: 1.0000002, y: 1.0000004, z: 1} - name: mixamorig:LeftHandPinky4 parentName: mixamorig:LeftHandPinky3 position: {x: 0.00009273199, y: 0.06622892, z: 1.2337181e-10} @@ -798,18 +798,18 @@ ModelImporter: - name: mixamorig:LeftHandMiddle1 parentName: mixamorig:LeftHand position: {x: 0.032980945, y: 0.470292, z: -0.0063683675} - rotation: {x: 0.07271342, y: -0.004652556, z: -0.055211768, w: 0.99581265} - scale: {x: 1, y: 0.99999994, z: 1} + rotation: {x: 0.07271354, y: -0.00465257, z: -0.055211864, w: 0.99581265} + scale: {x: 0.9999998, y: 0.9999997, z: 1.0000001} - name: mixamorig:LeftHandMiddle2 parentName: mixamorig:LeftHandMiddle1 position: {x: 0.00012702444, y: 0.0942031, z: -4.8196114e-10} - rotation: {x: -0.0394112, y: 0.000043660377, z: -0.001233606, w: 0.99922234} - scale: {x: 1, y: 1, z: 1.0000002} + rotation: {x: -0.039416615, y: 0.000043482487, z: -0.0012336923, w: 0.99922216} + scale: {x: 1.0000004, y: 1.0000005, z: 1.0000005} - name: mixamorig:LeftHandMiddle3 parentName: mixamorig:LeftHandMiddle2 position: {x: -0.00030756628, y: 0.09301708, z: -2.1265237e-10} - rotation: {x: 0.03853212, y: -0.000011739619, z: 0.0019333175, w: 0.99925554} - scale: {x: 1, y: 1, z: 0.99999994} + rotation: {x: 0.038538244, y: -0.000011748703, z: 0.001933153, w: 0.99925524} + scale: {x: 1, y: 1.0000001, z: 1.0000001} - name: mixamorig:LeftHandMiddle4 parentName: mixamorig:LeftHandMiddle3 position: {x: 0.00018054183, y: 0.0615309, z: 1.4185503e-10} @@ -818,18 +818,18 @@ ModelImporter: - name: mixamorig:LeftHandIndex1 parentName: mixamorig:LeftHand position: {x: 0.11217295, y: 0.4219034, z: -0.0033676198} - rotation: {x: 0.03469586, y: -0.00058575533, z: -0.01686835, w: 0.9992554} - scale: {x: 1.0000002, y: 1, z: 1.0000002} + rotation: {x: 0.03469576, y: -0.00058576185, z: -0.016868362, w: 0.9992554} + scale: {x: 1.0000002, y: 0.9999998, z: 1.0000002} - name: mixamorig:LeftHandIndex2 parentName: mixamorig:LeftHandIndex1 position: {x: 0.00001455361, y: 0.09980766, z: 8.3969096e-11} - rotation: {x: -0.008565849, y: 0.000000057450947, z: -0.000000054014876, w: 0.9999633} - scale: {x: 1.0000002, y: 1.0000004, z: 1.0000002} + rotation: {x: -0.008565862, y: 0.00000005151377, z: 0.00000006757726, w: 0.99996334} + scale: {x: 1.0000002, y: 1.0000002, z: 1.0000004} - name: mixamorig:LeftHandIndex3 parentName: mixamorig:LeftHandIndex2 position: {x: -0.00002582612, y: 0.09726429, z: -1.4503598e-11} - rotation: {x: 0.009955878, y: -0.000000056780777, z: -0.000000015368135, w: 0.99995047} - scale: {x: 1, y: 1, z: 1.0000001} + rotation: {x: 0.009955894, y: -0.0000000044286734, z: -0.00000007089782, w: 0.9999505} + scale: {x: 1.0000002, y: 1.0000005, z: 1.0000004} - name: mixamorig:LeftHandIndex4 parentName: mixamorig:LeftHandIndex3 position: {x: 0.000011272517, y: 0.07725892, z: -5.8456635e-11} @@ -838,18 +838,18 @@ ModelImporter: - name: mixamorig:LeftHandThumb1 parentName: mixamorig:LeftHand position: {x: 0.08703662, y: 0.13105781, z: 0.04719588} - rotation: {x: 0.08019132, y: 0.020848112, z: -0.23762384, w: 0.967817} - scale: {x: 1, y: 1.0000001, z: 1.0000002} + rotation: {x: 0.08019103, y: 0.020848332, z: -0.23762387, w: 0.96781695} + scale: {x: 0.99999994, y: 1, z: 1.0000001} - name: mixamorig:LeftHandThumb2 parentName: mixamorig:LeftHandThumb1 position: {x: 0.034099486, y: 0.12690076, z: 6.9632733e-10} - rotation: {x: -0.0131703345, y: -0.0049436577, z: -0.15494101, w: 0.9878236} - scale: {x: 1.0000004, y: 1.0000002, z: 1.0000001} + rotation: {x: -0.0131700765, y: -0.004943691, z: -0.15494154, w: 0.9878235} + scale: {x: 1, y: 0.99999994, z: 1} - name: mixamorig:LeftHandThumb3 parentName: mixamorig:LeftHandThumb2 position: {x: -0.014597654, y: 0.13159408, z: -2.4132987e-10} - rotation: {x: 0.030831255, y: -0.0010114287, z: -0.0063992986, w: 0.9995036} - scale: {x: 1.0000002, y: 1.0000005, z: 1.0000004} + rotation: {x: 0.030828908, y: -0.0010117121, z: -0.006400398, w: 0.9995037} + scale: {x: 0.9999998, y: 0.9999997, z: 0.99999994} - name: mixamorig:LeftHandThumb4 parentName: mixamorig:LeftHandThumb3 position: {x: -0.019501843, y: 0.10796818, z: 0.00000000133181} diff --git a/Assets/04_Models/Blackjack/anim/hook@point-Pose@Pointing.fbx b/Assets/04_Models/Blackjack/anim/hook@point-Pose@Pointing.fbx new file mode 100644 index 00000000..9efa1277 --- /dev/null +++ b/Assets/04_Models/Blackjack/anim/hook@point-Pose@Pointing.fbx @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:351df955d09d989e225aa7daa2dac710d3067ab9ac9822e1563ba05c7f182f5d +size 1025680 diff --git a/Assets/04_Models/Blackjack/anim/hook@point-Pose@Pointing.fbx.meta b/Assets/04_Models/Blackjack/anim/hook@point-Pose@Pointing.fbx.meta new file mode 100644 index 00000000..e3b6f8d1 --- /dev/null +++ b/Assets/04_Models/Blackjack/anim/hook@point-Pose@Pointing.fbx.meta @@ -0,0 +1,110 @@ +fileFormatVersion: 2 +guid: e93a1ebc93844d641a1addb257b141ef +ModelImporter: + serializedVersion: 24200 + internalIDToNameTable: [] + externalObjects: {} + materials: + materialImportMode: 2 + materialName: 0 + materialSearch: 1 + materialLocation: 1 + animations: + legacyGenerateAnimations: 4 + bakeSimulation: 0 + resampleCurves: 1 + optimizeGameObjects: 0 + removeConstantScaleCurves: 0 + motionNodeName: + animationImportErrors: + animationImportWarnings: + animationRetargetingWarnings: + animationDoRetargetingWarnings: 0 + importAnimatedCustomProperties: 0 + importConstraints: 0 + animationCompression: 3 + animationRotationError: 0.5 + animationPositionError: 0.5 + animationScaleError: 0.5 + animationWrapMode: 0 + extraExposedTransformPaths: [] + extraUserProperties: [] + clipAnimations: [] + isReadable: 0 + meshes: + lODScreenPercentages: [] + globalScale: 1 + meshCompression: 0 + addColliders: 0 + useSRGBMaterialColor: 1 + sortHierarchyByName: 1 + importPhysicalCameras: 1 + importVisibility: 1 + importBlendShapes: 1 + importCameras: 0 + importLights: 1 + nodeNameCollisionStrategy: 1 + fileIdsGeneration: 2 + swapUVChannels: 0 + generateSecondaryUV: 0 + useFileUnits: 1 + keepQuads: 0 + weldVertices: 1 + bakeAxisConversion: 0 + preserveHierarchy: 0 + skinWeightsMode: 0 + maxBonesPerVertex: 4 + minBoneWeight: 0.001 + optimizeBones: 1 + generateMeshLods: 0 + meshLodGenerationFlags: 0 + maximumMeshLod: -1 + meshOptimizationFlags: -1 + indexFormat: 0 + secondaryUVAngleDistortion: 8 + secondaryUVAreaDistortion: 15.000001 + secondaryUVHardAngle: 88 + secondaryUVMarginMethod: 1 + secondaryUVMinLightmapResolution: 40 + secondaryUVMinObjectScale: 1 + secondaryUVPackMargin: 4 + useFileScale: 1 + strictVertexDataChecks: 0 + tangentSpace: + normalSmoothAngle: 60 + normalImportMode: 0 + tangentImportMode: 3 + normalCalculationMode: 4 + legacyComputeAllNormalsFromSmoothingGroupsWhenMeshHasBlendShapes: 0 + blendShapeNormalImportMode: 1 + normalSmoothingSource: 0 + referencedClips: [] + importAnimation: 1 + humanDescription: + serializedVersion: 3 + human: [] + skeleton: [] + armTwist: 0.5 + foreArmTwist: 0.5 + upperLegTwist: 0.5 + legTwist: 0.5 + armStretch: 0.05 + legStretch: 0.05 + feetSpacing: 0 + globalScale: 1 + rootMotionBoneName: + hasTranslationDoF: 0 + hasExtraRoot: 1 + skeletonHasParents: 1 + lastHumanDescriptionAvatarSource: {instanceID: 0} + autoGenerateAvatarMappingIfUnspecified: 1 + animationType: 3 + humanoidOversampling: 1 + avatarSetup: 1 + addHumanoidExtraRootOnlyWhenUsingAvatar: 1 + importBlendShapeDeformPercent: 1 + remapMaterialsIfMaterialImportModeIsNone: 0 + additionalBone: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/04_Models/Cave/Cave2/liana.mat b/Assets/04_Models/Cave/Cave2/liana.mat index f6ee6deb..c9b9c230 100644 --- a/Assets/04_Models/Cave/Cave2/liana.mat +++ b/Assets/04_Models/Cave/Cave2/liana.mat @@ -26,10 +26,9 @@ Material: m_ModifiedSerializedProperties: 0 m_ValidKeywords: - _ALPHATEST_ON - - _EMISSION - _SURFACE_TYPE_TRANSPARENT m_InvalidKeywords: [] - m_LightmapFlags: 2 + m_LightmapFlags: 4 m_EnableInstancingVariants: 0 m_DoubleSidedGI: 1 m_CustomRenderQueue: 3000 @@ -125,7 +124,7 @@ Material: - _Parallax: 0.02 - _QueueOffset: 0 - _ReceiveShadows: 1 - - _Smoothness: 0.504 + - _Smoothness: 0.4472136 - _SmoothnessTextureChannel: 0 - _SpecularHighlights: 1 - _SrcBlend: 5 @@ -138,7 +137,7 @@ Material: m_Colors: - _BaseColor: {r: 1, g: 1, b: 1, a: 1} - _Color: {r: 1, g: 1, b: 1, a: 1} - - _EmissionColor: {r: 1.2335505, g: 0.12219132, b: 0.9894497, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} - _SpecColor: {r: 0.19999996, g: 0.19999996, b: 0.19999996, a: 1} m_BuildTextureStacks: [] m_AllowLocking: 1 diff --git a/Assets/04_Models/Objects/Star/Prefabs/StarPiece.prefab b/Assets/04_Models/Objects/Star/Prefabs/StarPiece.prefab deleted file mode 100644 index b0bfd1c7..00000000 --- a/Assets/04_Models/Objects/Star/Prefabs/StarPiece.prefab +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:96cfa22174695d8c7ee0cfc7d529f7a875e8abaa616f00b9e711f7ee307dbaa2 -size 5647 diff --git a/Assets/04_Models/Objects/Star/Prefabs/star_piece.prefab b/Assets/04_Models/Objects/Star/Prefabs/star_piece.prefab new file mode 100644 index 00000000..ca51de88 --- /dev/null +++ b/Assets/04_Models/Objects/Star/Prefabs/star_piece.prefab @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5b6f66e8d81352c902f1f360bd9ea5c2f3e3ba5a6f55a4c55a6dbe67add5a233 +size 5930 diff --git a/Assets/04_Models/Objects/Star/Prefabs/StarPiece.prefab.meta b/Assets/04_Models/Objects/Star/Prefabs/star_piece.prefab.meta similarity index 74% rename from Assets/04_Models/Objects/Star/Prefabs/StarPiece.prefab.meta rename to Assets/04_Models/Objects/Star/Prefabs/star_piece.prefab.meta index 552d155d..af6d73ea 100644 --- a/Assets/04_Models/Objects/Star/Prefabs/StarPiece.prefab.meta +++ b/Assets/04_Models/Objects/Star/Prefabs/star_piece.prefab.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: a0d191b2a9fd35a4c853beafc12ccd57 +guid: b1c15982e88ac314080aa85e24337300 PrefabImporter: externalObjects: {} userData: diff --git a/Assets/05_Textures/UI/StarPieceIUIBase.png b/Assets/05_Textures/UI/StarPieceIUIBase.png new file mode 100644 index 00000000..57d86d0b --- /dev/null +++ b/Assets/05_Textures/UI/StarPieceIUIBase.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:33f17d00af494028556470fb78d7e147cda777c0f2d1c737f9e9c9458a27a737 +size 1833 diff --git a/Assets/05_Textures/UI/StarPieceIUIBase.png.meta b/Assets/05_Textures/UI/StarPieceIUIBase.png.meta new file mode 100644 index 00000000..5d8714d6 --- /dev/null +++ b/Assets/05_Textures/UI/StarPieceIUIBase.png.meta @@ -0,0 +1,156 @@ +fileFormatVersion: 2 +guid: 32208240115105347883a410f0986dee +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 0 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 4 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: WebGL + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: WindowsStoreApps + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/05_Textures/UI/StarPieceUI.png b/Assets/05_Textures/UI/StarPieceUI.png new file mode 100644 index 00000000..ccce5502 --- /dev/null +++ b/Assets/05_Textures/UI/StarPieceUI.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ecd5d525cd38ab9fed777728875bbb9e95db0841f6cd4223501bc09bf491a71f +size 4526 diff --git a/Assets/05_Textures/UI/StarPieceUI.png.meta b/Assets/05_Textures/UI/StarPieceUI.png.meta new file mode 100644 index 00000000..8589e840 --- /dev/null +++ b/Assets/05_Textures/UI/StarPieceUI.png.meta @@ -0,0 +1,156 @@ +fileFormatVersion: 2 +guid: 06e60c13c92573148b9392acbc1c2d06 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 0 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 4 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: WebGL + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: WindowsStoreApps + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/07_Data/Communication/DialogGraph/BlackJackRoom/BlackJack_Area1.wdg b/Assets/07_Data/Communication/DialogGraph/BlackJackRoom/BlackJack_Area1.wdg index 87068c31..b3215619 100644 --- a/Assets/07_Data/Communication/DialogGraph/BlackJackRoom/BlackJack_Area1.wdg +++ b/Assets/07_Data/Communication/DialogGraph/BlackJackRoom/BlackJack_Area1.wdg @@ -19,6 +19,22 @@ MonoBehaviour: RefIds: - rid: -2 type: {class: , ns: , asm: } + - rid: 1895995096895848451 + type: {class: 'Constant`1[[System.String, mscorlib]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor} + data: + m_Value: + - rid: 1895995096895848452 + type: {class: 'Constant`1[[System.Boolean, mscorlib]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor} + data: + m_Value: 0 + - rid: 1895995096895848453 + type: {class: 'Constant`1[[System.String, mscorlib]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor} + data: + m_Value: + - rid: 1895995096895848454 + type: {class: 'Constant`1[[System.Boolean, mscorlib]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor} + data: + m_Value: 0 - rid: 6595524353106116630 type: {class: GraphModelImp, ns: Unity.GraphToolkit.Editor.Implementation, asm: Unity.GraphToolkit.Editor} data: @@ -48,7 +64,7 @@ MonoBehaviour: x: 222 y: 84 width: 923 - height: 341 + height: 386 m_GraphElementMetaData: - m_Guid: m_Value0: 14845512388065122572 @@ -183,8 +199,8 @@ MonoBehaviour: - rid: 6595524353106116642 - rid: 6595524353106116643 - rid: 6595524353106116644 - - rid: 8414246349295583529 - - rid: 8414246349295583530 + - rid: 1895995096895848451 + - rid: 1895995096895848452 m_InputPortInfos: expandedPortsById: m_KeyList: [] @@ -244,11 +260,13 @@ MonoBehaviour: 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: aaaaaaaaaaaaaaaaa + Value: "\uD558\uD558\uD558.. \uC190\uB2D8\uC774 \uC654\uAD70.\n\uC870\uAC01\uC744 + \uCC3E\uC544 \uC628 \uAC74\uAC00?\n\uACE0\uB798\uC758 \uAE30\uC5B5 \uC870\uAC01... + \uAF64 \uADC0\uD55C \uBB3C\uAC74\uC774\uC9C0." - rid: 6595524353106116640 type: {class: 'Constant`1[[GestureData, Assembly-CSharp]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor} data: - m_Value: {fileID: 0} + m_Value: {fileID: 11400000, guid: 8dacf6b0d6f4bfe4b8c63827dbb3ed60, type: 2} - rid: 6595524353106116641 type: {class: 'Constant`1[[ExpressionData, Assembly-CSharp]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor} data: @@ -305,8 +323,8 @@ MonoBehaviour: - rid: 6595524353106116653 - rid: 6595524353106116654 - rid: 6595524353106116655 - - rid: 8414246349295583531 - - rid: 8414246349295583532 + - rid: 1895995096895848453 + - rid: 1895995096895848454 m_InputPortInfos: expandedPortsById: m_KeyList: [] @@ -366,7 +384,8 @@ MonoBehaviour: 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: bbbbbbbbbbbbbb + Value: "\uC6D0\uD55C\uB2E4\uBA74 \uC2B9\uBD80\uB85C \uAC00\uC838\uAC00\uAC8C. + \r\n\uB0B4 \uBC30\uC5D0\uC11C\uB294 \uCE74\uB4DC\uAC00 \uACE7 \uBC95\uC774\uB2C8\uAE4C." - rid: 6595524353106116651 type: {class: 'Constant`1[[GestureData, Assembly-CSharp]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor} data: @@ -390,19 +409,3 @@ MonoBehaviour: - rid: 6595524353106116656 type: {class: DialogLineNode, ns: WhaleAdventure.Dialog.GraphTool.Editor, asm: Assembly-CSharp-Editor} data: - - rid: 8414246349295583529 - type: {class: 'Constant`1[[System.String, mscorlib]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor} - data: - m_Value: - - rid: 8414246349295583530 - type: {class: 'Constant`1[[System.Boolean, mscorlib]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor} - data: - m_Value: 0 - - rid: 8414246349295583531 - type: {class: 'Constant`1[[System.String, mscorlib]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor} - data: - m_Value: - - rid: 8414246349295583532 - type: {class: 'Constant`1[[System.Boolean, mscorlib]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor} - data: - m_Value: 0 diff --git a/Assets/07_Data/Communication/DialogGraph/BlackJackRoom/BlackJack_Area2.wdg b/Assets/07_Data/Communication/DialogGraph/BlackJackRoom/BlackJack_Area2.wdg new file mode 100644 index 00000000..98b3c9c9 --- /dev/null +++ b/Assets/07_Data/Communication/DialogGraph/BlackJackRoom/BlackJack_Area2.wdg @@ -0,0 +1,412 @@ +%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: BlackJack_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: 1895995096895848477 + type: {class: 'Constant`1[[System.String, mscorlib]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor} + data: + m_Value: + - rid: 1895995096895848478 + type: {class: 'Constant`1[[System.Boolean, mscorlib]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor} + data: + m_Value: 0 + - rid: 1895995096895848479 + type: {class: 'Constant`1[[System.String, mscorlib]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor} + data: + m_Value: + - rid: 1895995096895848480 + type: {class: 'Constant`1[[System.Boolean, mscorlib]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor} + data: + m_Value: 0 + - 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: BlackJack_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: 930 + height: 386 + 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 + - __option_EventKey + - WaitForInput + m_ValueList: + - rid: 6595524353106116637 + - rid: 6595524353106116638 + - rid: 6595524353106116639 + - rid: 6595524353106116640 + - rid: 6595524353106116641 + - rid: 6595524353106116642 + - rid: 6595524353106116643 + - rid: 6595524353106116644 + - rid: 1895995096895848477 + - rid: 1895995096895848478 + 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: 1d6b39c817bbede42872d2fbf6b7f1a3, 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: "\uD558\uD558\uD558! \uC81C\uBC95\uC774\uAD70 \uAF2C\uB9C8.\n\uC624\uB298\uC740 + \uB124 \uC2B9\uB9AC\uB85C \uD574\uB450\uC9C0.\n\uAE30\uC5B5\uC758 \uC870\uAC01\uC740 + \uAC00\uC838\uAC00\uB77C" + - rid: 6595524353106116640 + type: {class: 'Constant`1[[GestureData, Assembly-CSharp]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor} + data: + m_Value: {fileID: 11400000, guid: 48b954a5fa973c6449259f8055982d02, type: 2} + - 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 + - __option_EventKey + - WaitForInput + m_ValueList: + - rid: 6595524353106116648 + - rid: 6595524353106116649 + - rid: 6595524353106116650 + - rid: 6595524353106116651 + - rid: 6595524353106116652 + - rid: 6595524353106116653 + - rid: 6595524353106116654 + - rid: 6595524353106116655 + - rid: 1895995096895848479 + - rid: 1895995096895848480 + 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: 1d6b39c817bbede42872d2fbf6b7f1a3, 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: "\uC798 \uAC00\uB77C, \uAF2C\uB9C8! \uBC14\uB2E4\uB294 \uB113\uACE0, + \uC6B4\uBA85\uC740 \uB298 \uC7A5\uB09C\uC744 \uCE58\uC9C0.\n\uB2E4\uC74C\uC5D0 + \uB9CC\uB098\uBA74\u2026 \uADF8\uB550 \uB0B4\uAC00 \uC774\uAE38 \uCC28\uB840\uB2E4!" + - rid: 6595524353106116651 + type: {class: 'Constant`1[[GestureData, Assembly-CSharp]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor} + data: + m_Value: {fileID: 11400000, guid: d72ad5b1d4d636643be5011661dd6b2b, type: 2} + - 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: diff --git a/Assets/07_Data/Communication/DialogGraph/BlackJackRoom/BlackJack_Area2.wdg.meta b/Assets/07_Data/Communication/DialogGraph/BlackJackRoom/BlackJack_Area2.wdg.meta new file mode 100644 index 00000000..59cffc8b --- /dev/null +++ b/Assets/07_Data/Communication/DialogGraph/BlackJackRoom/BlackJack_Area2.wdg.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 51620fadb88f464418a6f15400878534 +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 11500000, guid: 2ae5ca89bbed445479d9023586f0c041, type: 3} diff --git a/Assets/07_Data/Communication/DialogGraph/BlackJackRoom/Fairy_black_Area 1.wdg b/Assets/07_Data/Communication/DialogGraph/BlackJackRoom/Fairy_black_Area 1.wdg new file mode 100644 index 00000000..60e2ccc3 --- /dev/null +++ b/Assets/07_Data/Communication/DialogGraph/BlackJackRoom/Fairy_black_Area 1.wdg @@ -0,0 +1,411 @@ +%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_black_Area 1 + 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_black_Area 1 + 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 + - WaitForInput + - __option_EventKey + m_ValueList: + - rid: 6595524353106116637 + - rid: 6595524353106116638 + - rid: 6595524353106116639 + - rid: 6595524353106116640 + - rid: 6595524353106116641 + - rid: 6595524353106116642 + - rid: 6595524353106116643 + - rid: 6595524353106116644 + - rid: 6595524374970761386 + - rid: 6595524374970761398 + 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: "\uD53C\uB178\uD0A4\uC624, \uC800\uAE38 \uBD10. \uC800\uAE30\uC11C + \uAE30\uC5B5\uC758 \uC870\uAC01 \uAE30\uC6B4\uC774 \uB290\uAEF4\uC838." + - 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 + - WaitForInput + - __option_EventKey + m_ValueList: + - rid: 6595524353106116648 + - rid: 6595524353106116649 + - rid: 6595524353106116650 + - rid: 6595524353106116651 + - rid: 6595524353106116652 + - rid: 6595524353106116653 + - rid: 6595524353106116654 + - rid: 6595524353106116655 + - rid: 6595524374970761387 + - rid: 6595524374970761399 + 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: "\uD558\uC9C0\uB9CC \uC870\uC2EC\uD574. \n\uC800\uACF3\uC5D0\uB294 + \uBB34\uC2DC\uBB34\uC2DC\uD55C \uD574\uC801 \uC120\uC7A5\uC774 \uC0B4\uACE0 + \uC788\uC5B4.\r\n" + - 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: + - rid: 6595524374970761386 + type: {class: 'Constant`1[[System.Boolean, mscorlib]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor} + data: + m_Value: 0 + - rid: 6595524374970761387 + type: {class: 'Constant`1[[System.Boolean, mscorlib]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor} + data: + m_Value: 0 + - rid: 6595524374970761398 + type: {class: 'Constant`1[[System.String, mscorlib]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor} + data: + m_Value: + - rid: 6595524374970761399 + type: {class: 'Constant`1[[System.String, mscorlib]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor} + data: + m_Value: diff --git a/Assets/07_Data/Communication/DialogGraph/BlackJackRoom/Fairy_black_Area 1.wdg.meta b/Assets/07_Data/Communication/DialogGraph/BlackJackRoom/Fairy_black_Area 1.wdg.meta new file mode 100644 index 00000000..a6efbe71 --- /dev/null +++ b/Assets/07_Data/Communication/DialogGraph/BlackJackRoom/Fairy_black_Area 1.wdg.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 8699ad84c09938846919e213d50847ec +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 11500000, guid: 2ae5ca89bbed445479d9023586f0c041, type: 3} diff --git a/Assets/07_Data/Communication/DialogGraph/BlackJackRoom/Fairy_black_Area 2.wdg b/Assets/07_Data/Communication/DialogGraph/BlackJackRoom/Fairy_black_Area 2.wdg new file mode 100644 index 00000000..0d385ad1 --- /dev/null +++ b/Assets/07_Data/Communication/DialogGraph/BlackJackRoom/Fairy_black_Area 2.wdg @@ -0,0 +1,263 @@ +%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_black_Area 2 + 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_black_Area 2 + m_GraphNodeModels: + - rid: 6595524353106116633 + - rid: 6595524353106116635 + m_GraphWireModels: + - rid: 6595524353106116636 + m_GraphStickyNoteModels: [] + m_GraphPlacematModels: [] + m_GraphVariableModels: [] + m_GraphPortalModels: [] + m_SectionModels: + - rid: 6595524353106116631 + m_LocalSubgraphs: [] + m_LastKnownBounds: + serializedVersion: 2 + x: 222 + y: 86 + width: 548 + height: 384 + 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_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 + - WaitForInput + - __option_EventKey + m_ValueList: + - rid: 6595524353106116637 + - rid: 6595524353106116638 + - rid: 6595524353106116639 + - rid: 6595524353106116640 + - rid: 6595524353106116641 + - rid: 6595524353106116642 + - rid: 6595524353106116643 + - rid: 6595524353106116644 + - rid: 6595524374970761386 + - rid: 6595524374970761398 + 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: "\uBE14\uB799\uC7AD\uC740 \uCE74\uB4DC \uC22B\uC790\uC758 \uD569\uC744 + 21\uC5D0 \uAC00\uAE5D\uAC8C \uB9CC\uB4DC\uB294 \uAC8C\uC784\uC774\uC57C.\n\uCE74\uB4DC\uB97C + \uB354 \uBC1B\uC73C\uB824\uBA74 Hit. \uBA48\uCD94\uB824\uBA74 Stand.\n\uD558\uC9C0\uB9CC + 21\uC744 \uB118\uC73C\uBA74 \uBC14\uB85C \uC9C0\uB2C8\uAE4C \uC870\uC2EC\uD574." + - 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: 6595524374970761386 + type: {class: 'Constant`1[[System.Boolean, mscorlib]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor} + data: + m_Value: 0 + - rid: 6595524374970761398 + type: {class: 'Constant`1[[System.String, mscorlib]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor} + data: + m_Value: diff --git a/Assets/07_Data/Communication/DialogGraph/BlackJackRoom/Fairy_black_Area 2.wdg.meta b/Assets/07_Data/Communication/DialogGraph/BlackJackRoom/Fairy_black_Area 2.wdg.meta new file mode 100644 index 00000000..92961be3 --- /dev/null +++ b/Assets/07_Data/Communication/DialogGraph/BlackJackRoom/Fairy_black_Area 2.wdg.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 88096cebb59bb1546b6a434d6064a6ef +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 11500000, guid: 2ae5ca89bbed445479d9023586f0c041, type: 3} diff --git a/Assets/07_Data/Communication/DialogGraph/BlackJackRoom/Fairy_black_Area 3.wdg b/Assets/07_Data/Communication/DialogGraph/BlackJackRoom/Fairy_black_Area 3.wdg new file mode 100644 index 00000000..e90a7e59 --- /dev/null +++ b/Assets/07_Data/Communication/DialogGraph/BlackJackRoom/Fairy_black_Area 3.wdg @@ -0,0 +1,590 @@ +%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_black_Area 3 + 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: 1895995099136655516 + type: {class: UserNodeModelImp, ns: Unity.GraphToolkit.Editor.Implementation, asm: Unity.GraphToolkit.Editor} + data: + m_Guid: + m_Value0: 15678398808286716234 + m_Value1: 4037900496211869282 + m_HashGuid: + serializedVersion: 2 + Hash: 4a61d6fea5dc94d962fe148b1b810938 + m_Version: 2 + m_Position: {x: 584.18536, y: 102.18135} + m_Title: DialogLineNode + m_Tooltip: + m_NodePreviewModel: + rid: -2 + m_State: 0 + m_InputConstantsById: + m_KeyList: + - __option_ChoiceCount + - Speaker + - TalkText + - Gesture + - Expression + - Voice + - LineDuration + - LookAtPlayer + - WaitForInput + - __option_EventKey + - ChoiceQuestion + - Choice0Text + - Choice0Code + - Choice1Text + - Choice1Code + m_ValueList: + - rid: 1895995099136655517 + - rid: 1895995099136655518 + - rid: 1895995099136655519 + - rid: 1895995099136655520 + - rid: 1895995099136655521 + - rid: 1895995099136655522 + - rid: 1895995099136655523 + - rid: 1895995099136655524 + - rid: 1895995099136655525 + - rid: 1895995099136655526 + - rid: 1895995099136655529 + - rid: 1895995099136655530 + - rid: 1895995099136655531 + - rid: 1895995099136655532 + - rid: 1895995099136655533 + 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: 1895995099136655527 + - rid: 1895995099136655517 + type: {class: 'Constant`1[[System.Int32, mscorlib]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor} + data: + m_Value: 2 + - rid: 1895995099136655518 + 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: 1895995099136655519 + 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: "\uD574\uB0C8\uC5B4, \uD53C\uB178\uD0A4\uC624! \uAE30\uC5B5\uC758 + \uC870\uAC01\uC744 \uCC3E\uC558\uC5B4. " + - rid: 1895995099136655520 + type: {class: 'Constant`1[[GestureData, Assembly-CSharp]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor} + data: + m_Value: {fileID: 0} + - rid: 1895995099136655521 + type: {class: 'Constant`1[[ExpressionData, Assembly-CSharp]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor} + data: + m_Value: {fileID: 0} + - rid: 1895995099136655522 + type: {class: 'Constant`1[[VoiceClip, Assembly-CSharp]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor} + data: + m_Value: {fileID: 0} + - rid: 1895995099136655523 + type: {class: 'Constant`1[[System.Single, mscorlib]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor} + data: + m_Value: 5 + - rid: 1895995099136655524 + type: {class: 'Constant`1[[System.Boolean, mscorlib]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor} + data: + m_Value: 1 + - rid: 1895995099136655525 + type: {class: 'Constant`1[[System.Boolean, mscorlib]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor} + data: + m_Value: 0 + - rid: 1895995099136655526 + type: {class: 'Constant`1[[System.String, mscorlib]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor} + data: + m_Value: + - rid: 1895995099136655527 + type: {class: DialogLineNode, ns: WhaleAdventure.Dialog.GraphTool.Editor, asm: Assembly-CSharp-Editor} + data: + - rid: 1895995099136655529 + 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: "\uC790, \uB2E4\uC74C\uC740 \uC5B4\uB514\uB85C \uB5A0\uB098\uBCFC\uAE4C?" + - rid: 1895995099136655530 + 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: '{SpaceSceneName1}' + - rid: 1895995099136655531 + type: {class: 'Constant`1[[System.String, mscorlib]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor} + data: + m_Value: 1 + - rid: 1895995099136655532 + 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: '{SpaceSceneName2}' + - rid: 1895995099136655533 + type: {class: 'Constant`1[[System.String, mscorlib]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor} + data: + m_Value: 2 + - rid: 1895995099136655534 + type: {class: UserNodeModelImp, ns: Unity.GraphToolkit.Editor.Implementation, asm: Unity.GraphToolkit.Editor} + data: + m_Guid: + m_Value0: 4583103371002982187 + m_Value1: 3882769440319492732 + m_HashGuid: + serializedVersion: 2 + Hash: 2b2f87cd3b749a3f7c52fcf23b5ee235 + m_Version: 2 + m_Position: {x: 1143.5463, y: -65.62884} + m_Title: + m_Tooltip: + m_NodePreviewModel: + rid: -2 + m_State: 0 + m_InputConstantsById: + m_KeyList: + - __option_ChoiceCount + - __option_EventKey + - Speaker + - TalkText + - Gesture + - Expression + - Voice + - LineDuration + - LookAtPlayer + - WaitForInput + m_ValueList: + - rid: 1895995099136655536 + - rid: 1895995099136655537 + - rid: 1895995099136655538 + - rid: 1895995099136655539 + - rid: 1895995099136655540 + - rid: 1895995099136655541 + - rid: 1895995099136655542 + - rid: 1895995099136655543 + - rid: 1895995099136655544 + - rid: 1895995099136655545 + 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: 1895995099136655546 + - rid: 1895995099136655535 + type: {class: WireModel, ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor} + data: + m_Guid: + m_Value0: 16614847896876311790 + m_Value1: 7236718557701903585 + m_HashGuid: + serializedVersion: 2 + Hash: ee64750a22cc93e6e1944cbb2ffd6d64 + m_Version: 2 + m_FromPortReference: + m_NodeModelGuid: + m_Value0: 15678398808286716234 + m_Value1: 4037900496211869282 + m_NodeModelHashGuid: + serializedVersion: 2 + Hash: 4a61d6fea5dc94d962fe148b1b810938 + m_UniqueId: Choice0Out + m_PortDirection: 2 + m_PortOrientation: 0 + m_Title: "Choice 1 \u2192" + m_ToPortReference: + m_NodeModelGuid: + m_Value0: 4583103371002982187 + m_Value1: 3882769440319492732 + m_NodeModelHashGuid: + serializedVersion: 2 + Hash: 2b2f87cd3b749a3f7c52fcf23b5ee235 + m_UniqueId: In + m_PortDirection: 1 + m_PortOrientation: 0 + m_Title: + - rid: 1895995099136655536 + type: {class: 'Constant`1[[System.Int32, mscorlib]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor} + data: + m_Value: 0 + - rid: 1895995099136655537 + type: {class: 'Constant`1[[System.String, mscorlib]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor} + data: + m_Value: OPEN_DOOR_CHOICE_1 + - rid: 1895995099136655538 + type: {class: 'Constant`1[[CharacterData, Assembly-CSharp]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor} + data: + m_Value: {fileID: 0} + - rid: 1895995099136655539 + 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: + - rid: 1895995099136655540 + type: {class: 'Constant`1[[GestureData, Assembly-CSharp]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor} + data: + m_Value: {fileID: 0} + - rid: 1895995099136655541 + type: {class: 'Constant`1[[ExpressionData, Assembly-CSharp]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor} + data: + m_Value: {fileID: 0} + - rid: 1895995099136655542 + type: {class: 'Constant`1[[VoiceClip, Assembly-CSharp]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor} + data: + m_Value: {fileID: 0} + - rid: 1895995099136655543 + type: {class: 'Constant`1[[System.Single, mscorlib]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor} + data: + m_Value: 0 + - rid: 1895995099136655544 + type: {class: 'Constant`1[[System.Boolean, mscorlib]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor} + data: + m_Value: 0 + - rid: 1895995099136655545 + type: {class: 'Constant`1[[System.Boolean, mscorlib]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor} + data: + m_Value: 0 + - rid: 1895995099136655546 + type: {class: DialogLineNode, ns: WhaleAdventure.Dialog.GraphTool.Editor, asm: Assembly-CSharp-Editor} + data: + - rid: 1895995099136655558 + type: {class: UserNodeModelImp, ns: Unity.GraphToolkit.Editor.Implementation, asm: Unity.GraphToolkit.Editor} + data: + m_Guid: + m_Value0: 15022263384663121968 + m_Value1: 10531221337141447973 + m_HashGuid: + serializedVersion: 2 + Hash: 30e033fdf4cc79d0258d5463026a2692 + m_Version: 2 + m_Position: {x: 1144.462, y: 368.07837} + m_Title: DialogLineNode + m_Tooltip: + m_NodePreviewModel: + rid: -2 + m_State: 0 + m_InputConstantsById: + m_KeyList: + - __option_ChoiceCount + - __option_EventKey + - Speaker + - TalkText + - Gesture + - Expression + - Voice + - LineDuration + - LookAtPlayer + - WaitForInput + m_ValueList: + - rid: 1895995099136655559 + - rid: 1895995099136655560 + - rid: 1895995099136655561 + - rid: 1895995099136655562 + - rid: 1895995099136655563 + - rid: 1895995099136655564 + - rid: 1895995099136655565 + - rid: 1895995099136655566 + - rid: 1895995099136655567 + - rid: 1895995099136655568 + 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: 1895995099136655569 + - rid: 1895995099136655559 + type: {class: 'Constant`1[[System.Int32, mscorlib]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor} + data: + m_Value: 0 + - rid: 1895995099136655560 + type: {class: 'Constant`1[[System.String, mscorlib]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor} + data: + m_Value: OPEN_DOOR_CHOICE_2 + - rid: 1895995099136655561 + type: {class: 'Constant`1[[CharacterData, Assembly-CSharp]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor} + data: + m_Value: {fileID: 0} + - rid: 1895995099136655562 + 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: + - rid: 1895995099136655563 + type: {class: 'Constant`1[[GestureData, Assembly-CSharp]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor} + data: + m_Value: {fileID: 0} + - rid: 1895995099136655564 + type: {class: 'Constant`1[[ExpressionData, Assembly-CSharp]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor} + data: + m_Value: {fileID: 0} + - rid: 1895995099136655565 + type: {class: 'Constant`1[[VoiceClip, Assembly-CSharp]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor} + data: + m_Value: {fileID: 0} + - rid: 1895995099136655566 + type: {class: 'Constant`1[[System.Single, mscorlib]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor} + data: + m_Value: 0 + - rid: 1895995099136655567 + type: {class: 'Constant`1[[System.Boolean, mscorlib]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor} + data: + m_Value: 0 + - rid: 1895995099136655568 + type: {class: 'Constant`1[[System.Boolean, mscorlib]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor} + data: + m_Value: 0 + - rid: 1895995099136655569 + type: {class: DialogLineNode, ns: WhaleAdventure.Dialog.GraphTool.Editor, asm: Assembly-CSharp-Editor} + data: + - rid: 1895995099136655570 + type: {class: WireModel, ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor} + data: + m_Guid: + m_Value0: 10904376947181199368 + m_Value1: 6758928460744920009 + m_HashGuid: + serializedVersion: 2 + Hash: 08a0b1410f215497c98bfaec9f89cc5d + m_Version: 2 + m_FromPortReference: + m_NodeModelGuid: + m_Value0: 15678398808286716234 + m_Value1: 4037900496211869282 + m_NodeModelHashGuid: + serializedVersion: 2 + Hash: 4a61d6fea5dc94d962fe148b1b810938 + m_UniqueId: Choice1Out + m_PortDirection: 2 + m_PortOrientation: 0 + m_Title: "Choice 2 \u2192" + m_ToPortReference: + m_NodeModelGuid: + m_Value0: 15022263384663121968 + m_Value1: 10531221337141447973 + m_NodeModelHashGuid: + serializedVersion: 2 + Hash: 30e033fdf4cc79d0258d5463026a2692 + m_UniqueId: In + m_PortDirection: 1 + m_PortOrientation: 0 + m_Title: + - rid: 1895995099136655571 + type: {class: WireModel, ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor} + data: + m_Guid: + m_Value0: 9482018733489953895 + m_Value1: 15022194252478220887 + m_HashGuid: + serializedVersion: 2 + Hash: 679c44dbcce59683570ae1e5148e79d0 + 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: 15678398808286716234 + m_Value1: 4037900496211869282 + m_NodeModelHashGuid: + serializedVersion: 2 + Hash: 4a61d6fea5dc94d962fe148b1b810938 + m_UniqueId: In + m_PortDirection: 1 + m_PortOrientation: 0 + m_Title: + - 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_black_Area 3 + m_GraphNodeModels: + - rid: 6595524353106116633 + - rid: 1895995099136655516 + - rid: 1895995099136655534 + - rid: 1895995099136655558 + m_GraphWireModels: + - rid: 1895995099136655535 + - rid: 1895995099136655570 + - rid: 1895995099136655571 + m_GraphStickyNoteModels: [] + m_GraphPlacematModels: [] + m_GraphVariableModels: [] + m_GraphPortalModels: [] + m_SectionModels: + - rid: 6595524353106116631 + m_LocalSubgraphs: [] + m_LastKnownBounds: + serializedVersion: 2 + x: 222 + y: -66 + width: 1256 + height: 822 + 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: 15678398808286716234 + m_Value1: 4037900496211869282 + m_HashGuid: + serializedVersion: 2 + Hash: 4a61d6fea5dc94d962fe148b1b810938 + m_Category: 0 + m_Index: 1 + - m_Guid: + m_Value0: 4583103371002982187 + m_Value1: 3882769440319492732 + m_HashGuid: + serializedVersion: 2 + Hash: 2b2f87cd3b749a3f7c52fcf23b5ee235 + m_Category: 0 + m_Index: 2 + - m_Guid: + m_Value0: 16614847896876311790 + m_Value1: 7236718557701903585 + m_HashGuid: + serializedVersion: 2 + Hash: ee64750a22cc93e6e1944cbb2ffd6d64 + m_Category: 2 + m_Index: 0 + - m_Guid: + m_Value0: 15022263384663121968 + m_Value1: 10531221337141447973 + m_HashGuid: + serializedVersion: 2 + Hash: 30e033fdf4cc79d0258d5463026a2692 + m_Category: 0 + m_Index: 3 + - m_Guid: + m_Value0: 10904376947181199368 + m_Value1: 6758928460744920009 + m_HashGuid: + serializedVersion: 2 + Hash: 08a0b1410f215497c98bfaec9f89cc5d + m_Category: 2 + m_Index: 1 + - m_Guid: + m_Value0: 9482018733489953895 + m_Value1: 15022194252478220887 + m_HashGuid: + serializedVersion: 2 + Hash: 679c44dbcce59683570ae1e5148e79d0 + m_Category: 2 + m_Index: 2 + 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: diff --git a/Assets/07_Data/Communication/DialogGraph/BlackJackRoom/Fairy_black_Area 3.wdg.meta b/Assets/07_Data/Communication/DialogGraph/BlackJackRoom/Fairy_black_Area 3.wdg.meta new file mode 100644 index 00000000..c05ed967 --- /dev/null +++ b/Assets/07_Data/Communication/DialogGraph/BlackJackRoom/Fairy_black_Area 3.wdg.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: fa4f48ead2f51f5428082def3f01a767 +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 11500000, guid: 2ae5ca89bbed445479d9023586f0c041, type: 3} diff --git a/Assets/07_Data/Communication/DialogGraph/BlackJackRoom/WAVING.asset b/Assets/07_Data/Communication/DialogGraph/BlackJackRoom/WAVING.asset new file mode 100644 index 00000000..dbb8da7a --- /dev/null +++ b/Assets/07_Data/Communication/DialogGraph/BlackJackRoom/WAVING.asset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2946179864ea3f7533bc3ee9dfbe6a1f7c203f08966cfbe167636ed67002043e +size 579 diff --git a/Assets/07_Data/Communication/DialogGraph/BlackJackRoom/WAVING.asset.meta b/Assets/07_Data/Communication/DialogGraph/BlackJackRoom/WAVING.asset.meta new file mode 100644 index 00000000..103a727d --- /dev/null +++ b/Assets/07_Data/Communication/DialogGraph/BlackJackRoom/WAVING.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: d72ad5b1d4d636643be5011661dd6b2b +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/07_Data/Communication/DialogGraph/BlackJackRoom/haha.asset b/Assets/07_Data/Communication/DialogGraph/BlackJackRoom/haha.asset new file mode 100644 index 00000000..7db27f89 --- /dev/null +++ b/Assets/07_Data/Communication/DialogGraph/BlackJackRoom/haha.asset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:701a5a169567992c6d4c342c7640474cb675f36d238a4411b6146c4789a47db4 +size 575 diff --git a/Assets/07_Data/Communication/DialogGraph/BlackJackRoom/haha.asset.meta b/Assets/07_Data/Communication/DialogGraph/BlackJackRoom/haha.asset.meta new file mode 100644 index 00000000..160d811c --- /dev/null +++ b/Assets/07_Data/Communication/DialogGraph/BlackJackRoom/haha.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 8dacf6b0d6f4bfe4b8c63827dbb3ed60 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/07_Data/Communication/DialogGraph/BlackJackRoom/pointing.asset b/Assets/07_Data/Communication/DialogGraph/BlackJackRoom/pointing.asset new file mode 100644 index 00000000..b3668592 --- /dev/null +++ b/Assets/07_Data/Communication/DialogGraph/BlackJackRoom/pointing.asset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:19d030bdb80a07d90846c5cbf25494273e9567103e154855511469b5252d7889 +size 583 diff --git a/Assets/07_Data/Communication/DialogGraph/BlackJackRoom/pointing.asset.meta b/Assets/07_Data/Communication/DialogGraph/BlackJackRoom/pointing.asset.meta new file mode 100644 index 00000000..b64697df --- /dev/null +++ b/Assets/07_Data/Communication/DialogGraph/BlackJackRoom/pointing.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 48b954a5fa973c6449259f8055982d02 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/11_Audio/Source/VFX.meta b/Assets/11_Audio/Source/SFX.meta similarity index 100% rename from Assets/11_Audio/Source/VFX.meta rename to Assets/11_Audio/Source/SFX.meta diff --git a/Assets/11_Audio/Source/VFX/Blip.wav b/Assets/11_Audio/Source/SFX/Blip.wav similarity index 100% rename from Assets/11_Audio/Source/VFX/Blip.wav rename to Assets/11_Audio/Source/SFX/Blip.wav diff --git a/Assets/11_Audio/Source/VFX/Blip.wav.meta b/Assets/11_Audio/Source/SFX/Blip.wav.meta similarity index 100% rename from Assets/11_Audio/Source/VFX/Blip.wav.meta rename to Assets/11_Audio/Source/SFX/Blip.wav.meta diff --git a/Assets/11_Audio/Source/SFX/PickupStar.wav b/Assets/11_Audio/Source/SFX/PickupStar.wav new file mode 100644 index 00000000..21f07d50 --- /dev/null +++ b/Assets/11_Audio/Source/SFX/PickupStar.wav @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d6b08ee1cca26feba7d2db7c10752df21da127771e07804a127cb819b0aa34e0 +size 27726 diff --git a/Assets/11_Audio/Source/SFX/PickupStar.wav.meta b/Assets/11_Audio/Source/SFX/PickupStar.wav.meta new file mode 100644 index 00000000..87af829e --- /dev/null +++ b/Assets/11_Audio/Source/SFX/PickupStar.wav.meta @@ -0,0 +1,23 @@ +fileFormatVersion: 2 +guid: 0716d271725fed94aad4c2028810ab5f +AudioImporter: + externalObjects: {} + serializedVersion: 8 + defaultSettings: + serializedVersion: 2 + loadType: 0 + sampleRateSetting: 0 + sampleRateOverride: 44100 + compressionFormat: 1 + quality: 1 + conversionMode: 0 + preloadAudioData: 0 + platformSettingOverrides: {} + forceToMono: 0 + normalize: 1 + loadInBackground: 0 + ambisonic: 0 + 3D: 1 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/11_Audio/Source/VFX/StartBlip.wav b/Assets/11_Audio/Source/SFX/StartBlip.wav similarity index 100% rename from Assets/11_Audio/Source/VFX/StartBlip.wav rename to Assets/11_Audio/Source/SFX/StartBlip.wav diff --git a/Assets/11_Audio/Source/VFX/StartBlip.wav.meta b/Assets/11_Audio/Source/SFX/StartBlip.wav.meta similarity index 100% rename from Assets/11_Audio/Source/VFX/StartBlip.wav.meta rename to Assets/11_Audio/Source/SFX/StartBlip.wav.meta diff --git a/Assets/My project/Inventory/Prefabs/InventoryMiniUI.prefab.meta b/Assets/My project/Inventory/Prefabs/InventoryMiniUI.prefab.meta index 4ff5fb16..02c69322 100644 --- a/Assets/My project/Inventory/Prefabs/InventoryMiniUI.prefab.meta +++ b/Assets/My project/Inventory/Prefabs/InventoryMiniUI.prefab.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: b48b2192c45050d4592c9211d7817e28 +guid: f0db9ef8810ed2e4fad874ce8a39d817 PrefabImporter: externalObjects: {} userData: diff --git a/Assets/My project/Inventory/Scripts/InventoryItemType.cs b/Assets/My project/Inventory/Scripts/InventoryItemType.cs deleted file mode 100644 index 9a0b4778..00000000 --- a/Assets/My project/Inventory/Scripts/InventoryItemType.cs +++ /dev/null @@ -1,15 +0,0 @@ -using UnityEngine; - -/// -/// 인벤토리에서 관리할 아이템 종류입니다. -/// 문자열 대신 enum을 사용하면 오타로 인한 버그를 줄일 수 있습니다. -/// -public enum InventoryItemType -{ - Fish, - OldCompass, - Trash, - Bottle, - MemoryPiece, - Coin -} diff --git a/Assets/My project/Inventory/Scripts/InventoryItemType.cs.meta b/Assets/My project/Inventory/Scripts/InventoryItemType.cs.meta deleted file mode 100644 index 709ea638..00000000 --- a/Assets/My project/Inventory/Scripts/InventoryItemType.cs.meta +++ /dev/null @@ -1,2 +0,0 @@ -fileFormatVersion: 2 -guid: 9fc654a578c829244936abec2cf40091 \ No newline at end of file diff --git a/Assets/My project/Inventory/Scripts/InventoryManager.cs b/Assets/My project/Inventory/Scripts/InventoryManager.cs index 892b1a8e..dc05b305 100644 --- a/Assets/My project/Inventory/Scripts/InventoryManager.cs +++ b/Assets/My project/Inventory/Scripts/InventoryManager.cs @@ -3,6 +3,33 @@ using UnityEngine; using UnityEngine.Events; +/// +/// 인벤토리에서 관리할 아이템 종류입니다. +/// 아이템을 추가하려면 여기에 enum 값을 추가하고, InventoryManager의 itemDefinitions에도 데이터를 추가하세요. +/// +public enum InventoryItemType +{ + Fish, + OldCompass, + Trash, + Bottle, + MemoryPiece +} + +/// +/// 인벤토리 UI 필터/정렬에 사용할 간단한 카테고리입니다. +/// +public enum InventoryItemCategory +{ + All, + Consumable, + Quest, + Collectible, + KeyItem, + Material, + Other +} + [Serializable] public class InventoryItemStack { @@ -11,22 +38,130 @@ public class InventoryItemStack } [Serializable] -public class InventoryItemChangedEvent : UnityEvent +public class InventoryItemDefinition { + [Header("Identity")] + public InventoryItemType itemType; + public string displayName; + [TextArea(2, 5)] public string description; + [TextArea(1, 3)] public string goalHint; + + [Header("Visuals")] + public Sprite icon; + public Sprite slotBackground; + public bool importantItem; + + [Header("Rules")] + public InventoryItemCategory category = InventoryItemCategory.Other; + [Tooltip("0 이하이면 InventoryManager의 기본 최대 소지 수량을 사용합니다.")] + public int maxCount = 99; + public bool usable = false; + public bool consumeOnUse = true; + public bool requireUseConfirmation = false; + public string useLabel = "사용"; + public string useSuccessMessage; + public string useFailMessage; + + [Header("Audio")] + public AudioClip acquisitionClip; + public AudioClip useClip; + + [Header("Slot Display Override")] + public bool overrideSlotDisplaySettings = false; + public bool hideWhenZero = false; + public bool dimWhenZero = true; + [Range(0f, 1f)] public float zeroAlpha = 0.35f; + [Range(0f, 1f)] public float ownedAlpha = 1f; + + public string SafeDisplayName => string.IsNullOrWhiteSpace(displayName) ? itemType.ToString() : displayName; } +[Serializable] +public class InventoryLogEntry +{ + public InventoryItemType itemType; + public int amount; + public string action; + public string displayName; + public string timeText; + + public InventoryLogEntry() { } + + public InventoryLogEntry(InventoryItemType itemType, int amount, string action, string displayName) + { + this.itemType = itemType; + this.amount = amount; + this.action = action; + this.displayName = displayName; + timeText = DateTime.Now.ToString("HH:mm:ss"); + } + + public override string ToString() + { + string amountText = amount > 0 ? $" x{amount}" : string.Empty; + return $"[{timeText}] {displayName}{amountText} {action}"; + } +} + +[Serializable] public class InventoryItemChangedEvent : UnityEvent { } +[Serializable] public class InventoryItemAmountEvent : UnityEvent { } +[Serializable] public class InventoryStringEvent : UnityEvent { } +[Serializable] public class InventoryProgressEvent : UnityEvent { } + /// /// 실제 아이템 개수를 관리하는 중심 스크립트입니다. -/// UI를 직접 수정하지 않고, 아이템 개수 변경 이벤트만 알려줍니다. +/// 기능: 싱글톤, 저장/불러오기, 최대 소지 수량, 사용, 부족 안내, 획득 로그, 기억의 조각 진행도 이벤트. /// [DisallowMultipleComponent] public class InventoryManager : MonoBehaviour { + public static InventoryManager Instance { get; private set; } + + [Header("Singleton")] + [SerializeField] private bool useSingleton = true; + [SerializeField] private bool dontDestroyOnLoad = true; + [SerializeField] private bool destroyDuplicateManagers = true; + [Header("Initial Items")] [SerializeField] private List initialItems = new List(); + [Header("Item Definitions")] + [SerializeField] private List itemDefinitions = new List() + { + new InventoryItemDefinition { itemType = InventoryItemType.Fish, displayName = "생선", description = "고양이 합창단이 좋아합니다.", goalHint = "고양이에게 줄 수 있습니다.", category = InventoryItemCategory.Consumable, maxCount = 99, usable = true, consumeOnUse = true, useSuccessMessage = "생선을 사용했습니다." }, + new InventoryItemDefinition { itemType = InventoryItemType.OldCompass, displayName = "낡은 나침반", description = "미로에서 길을 찾는 데 도움이 됩니다.", goalHint = "미로에서 힌트를 볼 때 필요합니다.", category = InventoryItemCategory.KeyItem, maxCount = 1, usable = true, consumeOnUse = false, importantItem = true, useSuccessMessage = "나침반이 방향을 가리킵니다." }, + new InventoryItemDefinition { itemType = InventoryItemType.Trash, displayName = "쓰레기", description = "낚시터를 정화하는 데 필요합니다.", goalHint = "정화 장치에 넣을 수 있습니다.", category = InventoryItemCategory.Material, maxCount = 99, usable = true, consumeOnUse = true, useSuccessMessage = "쓰레기를 사용했습니다." }, + new InventoryItemDefinition { itemType = InventoryItemType.Bottle, displayName = "마법병", description = "바다 속에서 발견한 수상한 병입니다.", goalHint = "특정 이벤트에서 사용할 수 있습니다.", category = InventoryItemCategory.KeyItem, maxCount = 1, usable = true, consumeOnUse = false, importantItem = true, requireUseConfirmation = true, useSuccessMessage = "마법병을 사용했습니다." }, + new InventoryItemDefinition { itemType = InventoryItemType.MemoryPiece, displayName = "기억의 조각", description = "제페토를 구출하기 위한 중요한 조각입니다.", goalHint = "모든 조각을 모으면 중요한 이벤트가 열립니다.", category = InventoryItemCategory.Quest, maxCount = 5, usable = false, consumeOnUse = false, importantItem = true } + }; + + [Header("Limits")] + [Tooltip("0 이하이면 기본 최대 수량 제한을 사용하지 않습니다. 아이템 정의의 maxCount가 있으면 그것이 우선됩니다.")] + [SerializeField] private int defaultMaxCount = 999; + + [Header("Memory Piece Progress")] + [SerializeField] private InventoryItemType memoryPieceItemType = InventoryItemType.MemoryPiece; + [Min(1)] [SerializeField] private int memoryPieceTargetCount = 5; + + [Header("Save / Load")] + [SerializeField] private bool loadOnAwake = true; + [SerializeField] private bool saveOnChange = true; + [Tooltip("Persistent Pickup/Reward 완료 상태는 아이템 수량 자동 저장을 꺼도 저장하는 것을 권장합니다.")] + [SerializeField] private bool forceSavePersistentState = true; + [SerializeField] private string saveKey = "Inventory_SaveData"; + + [Header("Recent Log")] + [SerializeField] private bool keepRecentLogs = true; + [SerializeField] private int maxRecentLogCount = 5; + [Header("Events")] public InventoryItemChangedEvent onItemCountChanged; + public InventoryItemAmountEvent onItemAdded; + public InventoryItemAmountEvent onItemRemoved; + public InventoryItemChangedEvent onItemUsed; + public InventoryStringEvent onMessageRequested; + public InventoryProgressEvent onMemoryPieceProgressChanged; + public UnityEvent onMemoryPieceCompleted; public UnityEvent onInventoryChanged; [Header("UI")] @@ -36,18 +171,79 @@ public class InventoryManager : MonoBehaviour [SerializeField] private bool showDebugLog = true; private readonly Dictionary itemCounts = new Dictionary(); + private readonly HashSet consumedPersistentKeys = new HashSet(); + private readonly List recentLogs = new List(); public event Action ItemCountChanged; + public event Action ItemAdded; + public event Action ItemRemoved; + public event Action ItemUsed; public event Action InventoryChanged; + public event Action MessageRequested; + public event Action LogAdded; + public event Action MemoryPieceProgressChanged; + public event Action MemoryPieceCompleted; + + private bool memoryPieceCompletedNotified; + + public int MemoryPieceTargetCount => memoryPieceTargetCount; + public InventoryItemType MemoryPieceItemType => memoryPieceItemType; private void Awake() { + if (useSingleton) + { + if (Instance != null && Instance != this) + { + if (showDebugLog) + Debug.LogWarning($"[InventoryManager] 중복 InventoryManager 발견: {name}"); + + if (destroyDuplicateManagers) + { + Destroy(gameObject); + return; + } + } + else + { + Instance = this; + + if (dontDestroyOnLoad) + DontDestroyOnLoad(gameObject); + } + } + + EnsureItemDefinitions(); InitializeFromInspector(); + + if (loadOnAwake) + LoadInventory(false); } private void Start() { NotifyAllItemsChanged(); + NotifyMemoryPieceProgress(); + } + + private void EnsureItemDefinitions() + { + if (itemDefinitions == null) + itemDefinitions = new List(); + + foreach (InventoryItemType itemType in Enum.GetValues(typeof(InventoryItemType))) + { + if (GetDefinitionInternal(itemType) == null) + { + itemDefinitions.Add(new InventoryItemDefinition + { + itemType = itemType, + displayName = itemType.ToString(), + maxCount = defaultMaxCount, + category = InventoryItemCategory.Other + }); + } + } } private void InitializeFromInspector() @@ -63,7 +259,7 @@ private void InitializeFromInspector() if (stack == null) continue; - itemCounts[stack.itemType] = Mathf.Max(0, stack.count); + itemCounts[stack.itemType] = ClampCount(stack.itemType, stack.count); } } @@ -74,14 +270,43 @@ public void AddItem(InventoryItemType itemType) public void AddItem(InventoryItemType itemType, int amount) { - if (amount <= 0) - return; + AddItemAndGetAddedAmount(itemType, amount); + } - int newCount = GetItemCount(itemType) + amount; - SetItemCount(itemType, newCount); + /// + /// 실제로 추가된 개수를 반환합니다. 최대 소지 수량에 막히면 요청량보다 적을 수 있습니다. + /// + public int AddItemAndGetAddedAmount(InventoryItemType itemType, int amount) + { + if (amount <= 0) + return 0; + + int previousCount = GetItemCount(itemType); + int newCount = ClampCount(itemType, previousCount + amount); + int addedAmount = Mathf.Max(0, newCount - previousCount); + + if (addedAmount <= 0) + { + RequestMessage($"{GetDisplayName(itemType)}은(는) 더 이상 가질 수 없습니다."); + + if (showDebugLog) + Debug.Log($"[InventoryManager] {itemType} 최대 소지 수량 도달: {previousCount}"); + + return 0; + } + + itemCounts[itemType] = newCount; + NotifyItemChanged(itemType, newCount); + NotifyItemAdded(itemType, addedAmount, newCount); + AddLog(itemType, addedAmount, "획득"); + + if (saveOnChange) + SaveInventory(); if (showDebugLog) - Debug.Log($"[InventoryManager] {itemType} +{amount} => {newCount}"); + Debug.Log($"[InventoryManager] {itemType} +{addedAmount} => {newCount}"); + + return addedAmount; } public bool RemoveItem(InventoryItemType itemType) @@ -98,19 +323,84 @@ public bool RemoveItem(InventoryItemType itemType, int amount) if (current < amount) { + RequestMessage(GetInsufficientMessage(itemType, amount)); + if (showDebugLog) Debug.LogWarning($"[InventoryManager] {itemType} 부족: 현재 {current}, 필요 {amount}"); return false; } - SetItemCount(itemType, current - amount); + int newCount = current - amount; + itemCounts[itemType] = newCount; + NotifyItemChanged(itemType, newCount); + NotifyItemRemoved(itemType, amount, newCount); + AddLog(itemType, amount, "소모"); + + if (saveOnChange) + SaveInventory(); + + return true; + } + + public bool UseItem(InventoryItemType itemType) + { + return UseItem(itemType, 1); + } + + public bool UseItem(InventoryItemType itemType, int amount) + { + InventoryItemDefinition definition = GetDefinition(itemType); + bool consume = definition == null || definition.consumeOnUse; + return TryUseItem(itemType, amount, consume, true, true); + } + + /// + /// 아이템을 사용합니다. 실제 게임 효과는 성공 이벤트나 외부 스크립트에서 처리하세요. + /// consume=false이면 보유 여부만 확인하고 개수는 줄이지 않습니다. + /// showMessages=false이면 부족/성공 안내를 표시하지 않습니다. + /// + public bool TryUseItem(InventoryItemType itemType, int amount, bool consume, bool showMessages = true, bool addUseLog = true) + { + amount = Mathf.Max(1, amount); + + if (!HasItem(itemType, amount)) + { + if (showMessages) + RequestMessage(GetInsufficientMessage(itemType, amount)); + + return false; + } + + if (consume && !RemoveItem(itemType, amount)) + return false; + + ItemUsed?.Invoke(itemType, GetItemCount(itemType)); + onItemUsed?.Invoke(itemType, GetItemCount(itemType)); + + // consume=true인 경우 RemoveItem에서 이미 "소모" 로그가 남습니다. + // consume=false인 빠른 사용(예: 나침반 확인)은 별도 "사용" 로그를 남깁니다. + if (addUseLog && !consume) + AddLog(itemType, amount, "사용"); + + InventoryItemDefinition definition = GetDefinition(itemType); + if (showMessages) + { + string message = definition != null && !string.IsNullOrWhiteSpace(definition.useSuccessMessage) + ? definition.useSuccessMessage + : $"{GetDisplayName(itemType)}을(를) 사용했습니다."; + RequestMessage(message); + } + + if (saveOnChange) + SaveInventory(); + return true; } public void SetItemCount(InventoryItemType itemType, int count) { - int clampedCount = Mathf.Max(0, count); + int clampedCount = ClampCount(itemType, count); int previousCount = GetItemCount(itemType); if (previousCount == clampedCount) @@ -118,6 +408,9 @@ public void SetItemCount(InventoryItemType itemType, int count) itemCounts[itemType] = clampedCount; NotifyItemChanged(itemType, clampedCount); + + if (saveOnChange) + SaveInventory(); } public int GetItemCount(InventoryItemType itemType) @@ -138,17 +431,331 @@ public bool HasItem(InventoryItemType itemType, int requiredAmount) return GetItemCount(itemType) >= Mathf.Max(1, requiredAmount); } + public int GetMaxCount(InventoryItemType itemType) + { + InventoryItemDefinition definition = GetDefinition(itemType); + + if (definition != null && definition.maxCount > 0) + return definition.maxCount; + + return Mathf.Max(0, defaultMaxCount); + } + + /// + /// 현재 소지 수량과 최대 소지 수량을 기준으로 실제로 더 넣을 수 있는 개수를 반환합니다. + /// maxCount가 0 이하이면 제한 없음으로 취급합니다. + /// + public int GetAddableAmount(InventoryItemType itemType, int requestedAmount) + { + requestedAmount = Mathf.Max(0, requestedAmount); + if (requestedAmount <= 0) + return 0; + + int maxCount = GetMaxCount(itemType); + if (maxCount <= 0) + return requestedAmount; + + int current = GetItemCount(itemType); + return Mathf.Clamp(maxCount - current, 0, requestedAmount); + } + + public bool CanAddItem(InventoryItemType itemType, int amount = 1, bool requireFullAmount = false) + { + amount = Mathf.Max(1, amount); + int addableAmount = GetAddableAmount(itemType, amount); + return requireFullAmount ? addableAmount >= amount : addableAmount > 0; + } + + public InventoryItemDefinition GetDefinition(InventoryItemType itemType) + { + InventoryItemDefinition definition = GetDefinitionInternal(itemType); + return definition; + } + + private InventoryItemDefinition GetDefinitionInternal(InventoryItemType itemType) + { + if (itemDefinitions == null) + return null; + + for (int i = 0; i < itemDefinitions.Count; i++) + { + if (itemDefinitions[i] != null && itemDefinitions[i].itemType == itemType) + return itemDefinitions[i]; + } + + return null; + } + + public string GetDisplayName(InventoryItemType itemType) + { + InventoryItemDefinition definition = GetDefinition(itemType); + return definition != null && !string.IsNullOrWhiteSpace(definition.displayName) + ? definition.displayName + : itemType.ToString(); + } + + public string GetDescription(InventoryItemType itemType) + { + InventoryItemDefinition definition = GetDefinition(itemType); + return definition != null ? definition.description : string.Empty; + } + + public string GetGoalHint(InventoryItemType itemType) + { + InventoryItemDefinition definition = GetDefinition(itemType); + return definition != null ? definition.goalHint : string.Empty; + } + + public Sprite GetIcon(InventoryItemType itemType) + { + InventoryItemDefinition definition = GetDefinition(itemType); + return definition != null ? definition.icon : null; + } + + public Sprite GetSlotBackground(InventoryItemType itemType) + { + InventoryItemDefinition definition = GetDefinition(itemType); + return definition != null ? definition.slotBackground : null; + } + + public AudioClip GetAcquisitionClip(InventoryItemType itemType) + { + InventoryItemDefinition definition = GetDefinition(itemType); + return definition != null ? definition.acquisitionClip : null; + } + + public AudioClip GetUseClip(InventoryItemType itemType) + { + InventoryItemDefinition definition = GetDefinition(itemType); + return definition != null ? definition.useClip : null; + } + + public bool IsImportantItem(InventoryItemType itemType) + { + InventoryItemDefinition definition = GetDefinition(itemType); + return definition != null && definition.importantItem; + } + + public InventoryItemCategory GetCategory(InventoryItemType itemType) + { + InventoryItemDefinition definition = GetDefinition(itemType); + return definition != null ? definition.category : InventoryItemCategory.Other; + } + + public bool IsUsable(InventoryItemType itemType) + { + InventoryItemDefinition definition = GetDefinition(itemType); + return definition != null && definition.usable; + } + + public bool RequiresUseConfirmation(InventoryItemType itemType) + { + InventoryItemDefinition definition = GetDefinition(itemType); + return definition != null && definition.requireUseConfirmation; + } + + public string GetInsufficientMessage(InventoryItemType itemType, int requiredAmount) + { + int current = GetItemCount(itemType); + return $"{GetDisplayName(itemType)}이(가) 부족합니다. 필요: {Mathf.Max(1, requiredAmount)}개 / 현재: {current}개"; + } + + public IReadOnlyList GetRecentLogs() + { + return new List(recentLogs); + } + + public IReadOnlyDictionary GetAllItemCounts() + { + return new Dictionary(itemCounts); + } + public void ClearInventory() { foreach (InventoryItemType itemType in Enum.GetValues(typeof(InventoryItemType))) itemCounts[itemType] = 0; NotifyAllItemsChanged(); + NotifyMemoryPieceProgress(); + + if (saveOnChange) + SaveInventory(); } - public IReadOnlyDictionary GetAllItemCounts() + public void ResetToInitialItems() { - return itemCounts; + InitializeFromInspector(); + NotifyAllItemsChanged(); + NotifyMemoryPieceProgress(); + + if (saveOnChange) + SaveInventory(); + } + + public bool IsPersistentKeyConsumed(string key) + { + if (string.IsNullOrWhiteSpace(key)) + return false; + + return consumedPersistentKeys.Contains(key); + } + + public void MarkPersistentKeyConsumed(string key) + { + if (string.IsNullOrWhiteSpace(key)) + return; + + if (consumedPersistentKeys.Add(key) && (saveOnChange || forceSavePersistentState)) + SaveInventory(); + } + + public void ResetPersistentKey(string key) + { + if (string.IsNullOrWhiteSpace(key)) + return; + + if (consumedPersistentKeys.Remove(key) && (saveOnChange || forceSavePersistentState)) + SaveInventory(); + } + + public void RequestMessage(string message) + { + if (string.IsNullOrWhiteSpace(message)) + return; + + MessageRequested?.Invoke(message); + onMessageRequested?.Invoke(message); + + if (showDebugLog) + Debug.Log($"[InventoryManager] Message: {message}"); + } + + private void AddLog(InventoryItemType itemType, int amount, string action) + { + if (!keepRecentLogs) + return; + + InventoryLogEntry entry = new InventoryLogEntry(itemType, amount, action, GetDisplayName(itemType)); + recentLogs.Insert(0, entry); + + while (recentLogs.Count > Mathf.Max(1, maxRecentLogCount)) + recentLogs.RemoveAt(recentLogs.Count - 1); + + LogAdded?.Invoke(entry); + } + + public void SaveInventory() + { + InventorySaveData saveData = new InventorySaveData(); + + foreach (KeyValuePair pair in itemCounts) + { + saveData.items.Add(new InventorySavedItemCount + { + itemTypeName = pair.Key.ToString(), + count = Mathf.Max(0, pair.Value) + }); + } + + foreach (string key in consumedPersistentKeys) + saveData.consumedPersistentKeys.Add(key); + + string json = JsonUtility.ToJson(saveData); + PlayerPrefs.SetString(saveKey, json); + PlayerPrefs.Save(); + + if (showDebugLog) + Debug.Log("[InventoryManager] 인벤토리 저장 완료"); + } + + public bool LoadInventory() + { + return LoadInventory(true); + } + + private bool LoadInventory(bool notify) + { + if (!PlayerPrefs.HasKey(saveKey)) + return false; + + string json = PlayerPrefs.GetString(saveKey, string.Empty); + if (string.IsNullOrWhiteSpace(json)) + return false; + + InventorySaveData saveData; + + try + { + saveData = JsonUtility.FromJson(json); + } + catch (Exception exception) + { + Debug.LogWarning($"[InventoryManager] 저장 데이터 읽기 실패: {exception.Message}"); + return false; + } + + InitializeFromInspector(); + consumedPersistentKeys.Clear(); + + if (saveData != null) + { + for (int i = 0; i < saveData.items.Count; i++) + { + InventorySavedItemCount savedItem = saveData.items[i]; + if (savedItem == null || string.IsNullOrWhiteSpace(savedItem.itemTypeName)) + continue; + + if (Enum.TryParse(savedItem.itemTypeName, out InventoryItemType itemType)) + itemCounts[itemType] = ClampCount(itemType, savedItem.count); + } + + for (int i = 0; i < saveData.consumedPersistentKeys.Count; i++) + { + string key = saveData.consumedPersistentKeys[i]; + if (!string.IsNullOrWhiteSpace(key)) + consumedPersistentKeys.Add(key); + } + } + + if (notify) + { + NotifyAllItemsChanged(); + NotifyMemoryPieceProgress(); + } + + if (showDebugLog) + Debug.Log("[InventoryManager] 인벤토리 불러오기 완료"); + + return true; + } + + public void DeleteSavedInventory() + { + PlayerPrefs.DeleteKey(saveKey); + PlayerPrefs.Save(); + + consumedPersistentKeys.Clear(); + recentLogs.Clear(); + memoryPieceCompletedNotified = false; + + // ResetToInitialItems()를 호출하면 saveOnChange가 true일 때 삭제 직후 다시 저장 파일을 만들 수 있으므로 + // 여기서는 직접 초기화와 알림만 수행합니다. + InitializeFromInspector(); + NotifyAllItemsChanged(); + NotifyMemoryPieceProgress(); + + RequestMessage("인벤토리 저장 데이터를 삭제했습니다."); + } + + private int ClampCount(InventoryItemType itemType, int count) + { + int safeCount = Mathf.Max(0, count); + int maxCount = GetMaxCount(itemType); + + if (maxCount > 0) + safeCount = Mathf.Min(safeCount, maxCount); + + return safeCount; } private void NotifyItemChanged(InventoryItemType itemType, int count) @@ -158,6 +765,21 @@ private void NotifyItemChanged(InventoryItemType itemType, int count) onItemCountChanged?.Invoke(itemType, count); onInventoryChanged?.Invoke(); + + if (itemType == memoryPieceItemType) + NotifyMemoryPieceProgress(); + } + + private void NotifyItemAdded(InventoryItemType itemType, int addedAmount, int totalCount) + { + ItemAdded?.Invoke(itemType, addedAmount, totalCount); + onItemAdded?.Invoke(itemType, addedAmount, totalCount); + } + + private void NotifyItemRemoved(InventoryItemType itemType, int removedAmount, int totalCount) + { + ItemRemoved?.Invoke(itemType, removedAmount, totalCount); + onItemRemoved?.Invoke(itemType, removedAmount, totalCount); } private void NotifyAllItemsChanged() @@ -172,6 +794,37 @@ private void NotifyAllItemsChanged() onInventoryChanged?.Invoke(); } + private void NotifyMemoryPieceProgress() + { + int current = GetItemCount(memoryPieceItemType); + int target = Mathf.Max(1, memoryPieceTargetCount); + + MemoryPieceProgressChanged?.Invoke(current, target); + onMemoryPieceProgressChanged?.Invoke(current, target); + + if (current < target) + { + memoryPieceCompletedNotified = false; + return; + } + + if (!memoryPieceCompletedNotified) + { + memoryPieceCompletedNotified = true; + MemoryPieceCompleted?.Invoke(); + onMemoryPieceCompleted?.Invoke(); + } + } + + // 개발용 버튼/UnityEvent 연결용 메서드입니다. + public void DebugAddFish() => AddItem(InventoryItemType.Fish, 1); + public void DebugAddCompass() => AddItem(InventoryItemType.OldCompass, 1); + public void DebugAddTrash() => AddItem(InventoryItemType.Trash, 1); + public void DebugAddBottle() => AddItem(InventoryItemType.Bottle, 1); + public void DebugAddMemoryPiece() => AddItem(InventoryItemType.MemoryPiece, 1); + public void DebugClearInventory() => ClearInventory(); + public void DebugDeleteSave() => DeleteSavedInventory(); + public void InventoryUIToggle() { _inventoryUI.gameObject.SetActive(!_inventoryUI.gameObject.activeSelf); @@ -180,14 +833,49 @@ public void InventoryUIToggle() #if UNITY_EDITOR private void OnValidate() { - if (initialItems == null) - return; + if (defaultMaxCount < 0) + defaultMaxCount = 0; - for (int i = 0; i < initialItems.Count; i++) + if (memoryPieceTargetCount < 1) + memoryPieceTargetCount = 1; + + if (maxRecentLogCount < 1) + maxRecentLogCount = 1; + + if (string.IsNullOrWhiteSpace(saveKey)) + saveKey = "Inventory_SaveData"; + + if (initialItems != null) { - if (initialItems[i] != null) - initialItems[i].count = Mathf.Max(0, initialItems[i].count); + for (int i = 0; i < initialItems.Count; i++) + { + if (initialItems[i] != null) + initialItems[i].count = Mathf.Max(0, initialItems[i].count); + } + } + + if (itemDefinitions != null) + { + for (int i = 0; i < itemDefinitions.Count; i++) + { + if (itemDefinitions[i] != null) + itemDefinitions[i].maxCount = Mathf.Max(0, itemDefinitions[i].maxCount); + } } } #endif + + [Serializable] + private class InventorySaveData + { + public List items = new List(); + public List consumedPersistentKeys = new List(); + } + + [Serializable] + private class InventorySavedItemCount + { + public string itemTypeName; + public int count; + } } diff --git a/Assets/My project/Inventory/Scripts/InventorySlotUI.cs b/Assets/My project/Inventory/Scripts/InventorySlotUI.cs index fbbd8b76..a8644876 100644 --- a/Assets/My project/Inventory/Scripts/InventorySlotUI.cs +++ b/Assets/My project/Inventory/Scripts/InventorySlotUI.cs @@ -4,12 +4,19 @@ using UnityEngine.EventSystems; using UnityEngine.UI; +public enum InventorySlotClickMode +{ + None, + ShowDetail, + RequestUse +} + /// /// 인벤토리 슬롯 하나를 담당하는 UI 스크립트입니다. -/// FishSlot, CompassSlot, TrashSlot, BottleSlot 등에 각각 붙입니다. +/// VR 포인터 Hover/Select, NEW 배지, 0개 흐림 표시, 중요 아이템 강조, 상세보기/사용 클릭을 지원합니다. /// [DisallowMultipleComponent] -public class InventorySlotUI : MonoBehaviour, IPointerEnterHandler, IPointerExitHandler, ISelectHandler, IDeselectHandler +public class InventorySlotUI : MonoBehaviour, IPointerEnterHandler, IPointerExitHandler, IPointerClickHandler, ISelectHandler, IDeselectHandler, ISubmitHandler { [Header("Item")] [SerializeField] private InventoryItemType itemType; @@ -20,30 +27,75 @@ public class InventorySlotUI : MonoBehaviour, IPointerEnterHandler, IPointerExit [SerializeField] private TMP_Text countText; [SerializeField] private GameObject newBadge; [SerializeField] private CanvasGroup canvasGroup; + [SerializeField] private GameObject importantGlowObject; + [SerializeField] private GameObject filteredOutOverlay; - [Header("Tooltip")] + [Header("Tooltip / Parent UI")] [SerializeField] private InventoryTooltipUI tooltipUI; + [SerializeField] private InventoryUI inventoryUI; + + [Header("Click")] + [SerializeField] private InventorySlotClickMode clickMode = InventorySlotClickMode.ShowDetail; [Header("Settings")] + [Tooltip("VR에서는 false 권장. 슬롯이 사라지면 Ray 조작 위치가 바뀌어 불편할 수 있습니다.")] [SerializeField] private bool hideWhenZero = false; [SerializeField] private bool dimWhenZero = true; [SerializeField] private float zeroAlpha = 0.35f; [SerializeField] private float ownedAlpha = 1f; + [SerializeField] private float filteredAlpha = 0.15f; + [SerializeField] private bool showCountWhenZero = true; + [SerializeField] private bool showMaxCount = false; [SerializeField] private float newBadgeShowTime = 1.2f; + [Header("Hover Effect")] + [SerializeField] private bool useHoverScale = true; + [SerializeField] private float hoverScale = 1.08f; + [SerializeField] private bool bringToFrontOnHover = true; + private int currentCount; + private int currentMaxCount; + private bool filteredOut; private Coroutine newBadgeRoutine; + private Vector3 originalScale; + private InventoryItemDefinition definition; public InventoryItemType ItemType => itemType; public int CurrentCount => currentCount; + public InventoryItemCategory Category => definition != null ? definition.category : InventoryItemCategory.Other; private void Awake() { + originalScale = transform.localScale; + if (canvasGroup == null) canvasGroup = GetComponent(); + if (slotBackground == null) + slotBackground = GetComponent(); + + if (inventoryUI == null) + inventoryUI = GetComponentInParent(); + + if (tooltipUI == null) + tooltipUI = GetComponentInParent(); + if (newBadge != null) newBadge.SetActive(false); + + UpdateVisualState(); + } + + private void OnDisable() + { + HideNewBadge(); + HideTooltip(); + ResetHoverVisual(); + } + + public void SetInventoryUI(InventoryUI ui) + { + inventoryUI = ui; } public void SetItemType(InventoryItemType newItemType) @@ -51,10 +103,52 @@ public void SetItemType(InventoryItemType newItemType) itemType = newItemType; } + public void SetDefinition(InventoryItemDefinition newDefinition) + { + definition = newDefinition; + + if (definition == null) + { + UpdateVisualState(); + return; + } + + if (itemIcon != null) + { + itemIcon.sprite = definition.icon; + itemIcon.enabled = definition.icon != null; + } + + if (slotBackground != null && definition.slotBackground != null) + { + slotBackground.sprite = definition.slotBackground; + slotBackground.enabled = true; + } + + if (definition.overrideSlotDisplaySettings) + { + hideWhenZero = definition.hideWhenZero; + dimWhenZero = definition.dimWhenZero; + zeroAlpha = definition.zeroAlpha; + ownedAlpha = definition.ownedAlpha; + } + + if (importantGlowObject != null) + importantGlowObject.SetActive(definition.importantItem); + + UpdateVisualState(); + } + public void SetCount(int count, bool showNewBadge) + { + SetCount(count, showNewBadge, currentMaxCount); + } + + public void SetCount(int count, bool showNewBadge, int maxCount) { int previousCount = currentCount; currentCount = Mathf.Max(0, count); + currentMaxCount = Mathf.Max(0, maxCount); UpdateVisualState(); @@ -80,6 +174,23 @@ public void SetSlotBackground(Sprite sprite) slotBackground.enabled = sprite != null; } + public void SetFilteredOut(bool value) + { + filteredOut = value; + + if (filteredOutOverlay != null) + filteredOutOverlay.SetActive(value); + + UpdateVisualState(); + } + + public void SetHoverSettings(bool useScale, float scale, bool bringToFront) + { + useHoverScale = useScale; + hoverScale = Mathf.Max(1f, scale); + bringToFrontOnHover = bringToFront; + } + public void ShowNewBadge() { if (newBadge == null) @@ -106,7 +217,7 @@ public void HideNewBadge() private IEnumerator NewBadgeRoutine() { newBadge.SetActive(true); - yield return new WaitForSeconds(newBadgeShowTime); + yield return new WaitForSecondsRealtime(newBadgeShowTime); newBadge.SetActive(false); newBadgeRoutine = null; } @@ -116,39 +227,108 @@ private void UpdateVisualState() bool hasItem = currentCount > 0; if (countText != null) - countText.text = $"x{currentCount}"; + { + if (!showCountWhenZero && currentCount <= 0) + countText.text = string.Empty; + else if (showMaxCount && currentMaxCount > 0) + countText.text = $"x{currentCount}/{currentMaxCount}"; + else + countText.text = $"x{currentCount}"; + } if (hideWhenZero) gameObject.SetActive(hasItem); if (canvasGroup != null && dimWhenZero) - canvasGroup.alpha = hasItem ? ownedAlpha : zeroAlpha; + { + float targetAlpha = hasItem ? ownedAlpha : zeroAlpha; + if (filteredOut) + targetAlpha = Mathf.Min(targetAlpha, filteredAlpha); + + canvasGroup.alpha = targetAlpha; + canvasGroup.interactable = !filteredOut; + canvasGroup.blocksRaycasts = !filteredOut; + } } public void OnPointerEnter(PointerEventData eventData) { + ApplyHoverVisual(); ShowTooltip(); } public void OnPointerExit(PointerEventData eventData) { + ResetHoverVisual(); HideTooltip(); } + public void OnPointerClick(PointerEventData eventData) + { + ActivateSlot(); + } + public void OnSelect(BaseEventData eventData) { + ApplyHoverVisual(); ShowTooltip(); } public void OnDeselect(BaseEventData eventData) { + ResetHoverVisual(); HideTooltip(); } + public void OnSubmit(BaseEventData eventData) + { + ActivateSlot(); + } + + private void ActivateSlot() + { + if (filteredOut) + return; + + if (inventoryUI == null) + inventoryUI = GetComponentInParent(); + + if (inventoryUI == null) + return; + + switch (clickMode) + { + case InventorySlotClickMode.ShowDetail: + inventoryUI.ShowItemDetail(itemType); + break; + case InventorySlotClickMode.RequestUse: + inventoryUI.RequestUseItem(itemType, 1); + break; + } + } + + private void ApplyHoverVisual() + { + if (bringToFrontOnHover) + transform.SetAsLastSibling(); + + if (useHoverScale) + transform.localScale = originalScale * hoverScale; + } + + private void ResetHoverVisual() + { + if (useHoverScale) + transform.localScale = originalScale; + } + public void ShowTooltip() { + if (tooltipUI == null) + tooltipUI = GetComponentInParent(); + if (tooltipUI != null) - tooltipUI.ShowTooltip(itemType, currentCount); + tooltipUI.ShowTooltip(itemType, currentCount, currentMaxCount); } public void HideTooltip() diff --git a/Assets/My project/Inventory/Scripts/InventoryTooltipUI.cs b/Assets/My project/Inventory/Scripts/InventoryTooltipUI.cs index ef8f7dce..79c749ba 100644 --- a/Assets/My project/Inventory/Scripts/InventoryTooltipUI.cs +++ b/Assets/My project/Inventory/Scripts/InventoryTooltipUI.cs @@ -1,19 +1,10 @@ -using System; using System.Collections.Generic; using TMPro; using UnityEngine; -[Serializable] -public class InventoryTooltipEntry -{ - public InventoryItemType itemType; - public string displayName; - [TextArea(2, 4)] public string description; -} - /// /// 아이템 슬롯에 마우스/VR 포인터가 올라갔을 때 간단한 설명을 표시합니다. -/// InventorySlotUI에서 ShowTooltip, HideTooltip을 호출합니다. +/// InventoryManager의 ItemDefinition 데이터를 우선 사용합니다. /// [DisallowMultipleComponent] public class InventoryTooltipUI : MonoBehaviour @@ -23,39 +14,68 @@ public class InventoryTooltipUI : MonoBehaviour [SerializeField] private TMP_Text titleText; [SerializeField] private TMP_Text descriptionText; [SerializeField] private TMP_Text countText; + [SerializeField] private TMP_Text goalHintText; + [SerializeField] private TMP_Text useHintText; - [Header("Entries")] - [SerializeField] private List entries = new List() - { - new InventoryTooltipEntry { itemType = InventoryItemType.Fish, displayName = "생선", description = "고양이 합창단이 좋아합니다." }, - new InventoryTooltipEntry { itemType = InventoryItemType.OldCompass, displayName = "낡은 나침반", description = "미로에서 길을 찾는 데 도움이 됩니다." }, - new InventoryTooltipEntry { itemType = InventoryItemType.Trash, displayName = "쓰레기", description = "낚시터를 정화하는 데 필요합니다." }, - new InventoryTooltipEntry { itemType = InventoryItemType.Bottle, displayName = "마법병", description = "바다 속에서 발견한 수상한 병입니다." }, - new InventoryTooltipEntry { itemType = InventoryItemType.MemoryPiece, displayName = "기억의 조각", description = "제페토를 구출하기 위한 중요한 조각입니다." } - }; + [Header("Reference")] + [SerializeField] private InventoryManager inventoryManager; + [SerializeField] private bool autoFindManager = true; private void Awake() { + ResolveManager(); HideTooltip(); } public void ShowTooltip(InventoryItemType itemType, int count) { - InventoryTooltipEntry entry = FindEntry(itemType); + int maxCount = ResolveManager() != null ? inventoryManager.GetMaxCount(itemType) : 0; + ShowTooltip(itemType, count, maxCount); + } + + public void ShowTooltip(InventoryItemType itemType, int count, int maxCount) + { + ResolveManager(); + + string displayName = itemType.ToString(); + string description = string.Empty; + string goalHint = string.Empty; + string useHint = string.Empty; + + InventoryItemDefinition definition = inventoryManager != null ? inventoryManager.GetDefinition(itemType) : null; + if (definition != null) + { + displayName = definition.SafeDisplayName; + description = definition.description; + goalHint = definition.goalHint; + + if (definition.usable) + useHint = string.IsNullOrWhiteSpace(definition.useLabel) ? "사용 가능" : definition.useLabel; + } if (tooltipPanel != null) tooltipPanel.SetActive(true); if (titleText != null) - titleText.text = entry != null && !string.IsNullOrWhiteSpace(entry.displayName) - ? entry.displayName - : itemType.ToString(); + titleText.text = displayName; if (descriptionText != null) - descriptionText.text = entry != null ? entry.description : string.Empty; + descriptionText.text = description; if (countText != null) - countText.text = $"보유: x{Mathf.Max(0, count)}"; + countText.text = maxCount > 0 ? $"보유: x{Mathf.Max(0, count)} / {maxCount}" : $"보유: x{Mathf.Max(0, count)}"; + + if (goalHintText != null) + { + goalHintText.text = goalHint; + goalHintText.gameObject.SetActive(!string.IsNullOrWhiteSpace(goalHint)); + } + + if (useHintText != null) + { + useHintText.text = useHint; + useHintText.gameObject.SetActive(!string.IsNullOrWhiteSpace(useHint)); + } } public void HideTooltip() @@ -64,14 +84,16 @@ public void HideTooltip() tooltipPanel.SetActive(false); } - private InventoryTooltipEntry FindEntry(InventoryItemType itemType) + private InventoryManager ResolveManager() { - for (int i = 0; i < entries.Count; i++) - { - if (entries[i] != null && entries[i].itemType == itemType) - return entries[i]; - } + if (inventoryManager != null) + return inventoryManager; - return null; + if (InventoryManager.Instance != null) + inventoryManager = InventoryManager.Instance; + else if (autoFindManager) + inventoryManager = FindFirstObjectByType(); + + return inventoryManager; } } diff --git a/Assets/My project/Inventory/Scripts/InventoryUI.cs b/Assets/My project/Inventory/Scripts/InventoryUI.cs index 62767035..9855fc9a 100644 --- a/Assets/My project/Inventory/Scripts/InventoryUI.cs +++ b/Assets/My project/Inventory/Scripts/InventoryUI.cs @@ -1,31 +1,158 @@ +using System.Collections; +using System.Collections.Generic; +using TMPro; using UnityEngine; +using UnityEngine.EventSystems; +using UnityEngine.UI; /// /// 전체 인벤토리 UI를 갱신하는 스크립트입니다. -/// InventoryManager의 변경 이벤트를 받아 각 InventorySlotUI에 전달합니다. +/// 기능: 패널 열기/닫기, 슬롯 갱신, 획득 팝업, 부족 안내 메시지, 확인창, 상세보기, 획득 로그, 기억의 조각 진행도, 간단한 손목/타겟 추적. +/// InventoryUI가 붙은 오브젝트는 항상 켜두고, 실제 보이는 inventoryPanel만 켜고 끄는 구조를 권장합니다. /// [DisallowMultipleComponent] public class InventoryUI : MonoBehaviour { [Header("References")] [SerializeField] private InventoryManager inventoryManager; + [Tooltip("실제로 보이거나 숨겨질 자식 패널입니다. InventoryUI가 붙은 자기 자신을 넣지 않는 것을 권장합니다.")] [SerializeField] private GameObject inventoryPanel; [SerializeField] private InventorySlotUI[] slots; - [Header("Settings")] + [Header("Panel Settings")] [SerializeField] private bool autoFindManager = true; + [SerializeField] private bool autoFindPanelChild = true; + [SerializeField] private string autoPanelChildName = "InventoryPanel"; + [SerializeField] private bool visibleOnStart = false; [SerializeField] private bool refreshOnEnable = true; [SerializeField] private bool showNewBadgeOnIncrease = true; + [SerializeField] private bool preventDisablingSelf = true; + + [Header("Filter")] + [SerializeField] private InventoryItemCategory currentFilter = InventoryItemCategory.All; + [SerializeField] private bool hideSlotsOutsideFilter = false; + + [Header("Acquisition Popup")] + [SerializeField] private GameObject acquisitionPopupPanel; + [SerializeField] private CanvasGroup acquisitionPopupCanvasGroup; + [SerializeField] private Image acquisitionIconImage; + [SerializeField] private TMP_Text acquisitionText; + [SerializeField] private float acquisitionPopupTime = 1.4f; + [SerializeField] private string acquisitionFormat = "{0} x{1} 획득!"; + + [Header("Message Popup")] + [SerializeField] private GameObject messagePanel; + [SerializeField] private CanvasGroup messageCanvasGroup; + [SerializeField] private TMP_Text messageText; + [SerializeField] private float messageShowTime = 1.5f; + + [Header("Confirmation UI")] + [SerializeField] private GameObject confirmationPanel; + [SerializeField] private TMP_Text confirmationTitleText; + [SerializeField] private TMP_Text confirmationBodyText; + [SerializeField] private Button confirmationYesButton; + [SerializeField] private Button confirmationNoButton; + + [Header("Detail UI")] + [SerializeField] private GameObject detailPanel; + [SerializeField] private Image detailIconImage; + [SerializeField] private TMP_Text detailTitleText; + [SerializeField] private TMP_Text detailDescriptionText; + [SerializeField] private TMP_Text detailCountText; + [SerializeField] private TMP_Text detailGoalText; + [SerializeField] private Button detailUseButton; + + [Header("Recent Log UI")] + [SerializeField] private TMP_Text[] recentLogTexts; + + [Header("Memory Piece UI")] + [SerializeField] private TMP_Text memoryProgressText; + [SerializeField] private Slider memoryProgressSlider; + [SerializeField] private string memoryProgressFormat = "기억의 조각 {0} / {1}"; + + [Header("Audio")] + [SerializeField] private AudioSource uiAudioSource; + [SerializeField] private AudioClip defaultAcquisitionClip; + [SerializeField] private AudioClip defaultUseClip; + [SerializeField] private AudioClip defaultErrorClip; + + [Header("Optional Follow Target / Wrist UI")] + [SerializeField] private bool followTarget = false; + [SerializeField] private Transform targetToFollow; + [SerializeField] private Vector3 localPositionOffset = new Vector3(0f, 0.08f, 0.12f); + [SerializeField] private Vector3 localEulerOffset = Vector3.zero; + [SerializeField] private bool faceMainCamera = false; + + [Header("Editor Test Toggle")] + [SerializeField] private bool enableKeyboardToggleForTesting = false; + [SerializeField] private KeyCode keyboardToggleKey = KeyCode.I; private bool subscribed; + private Coroutine acquisitionRoutine; + private Coroutine messageRoutine; + private InventoryItemType pendingUseItemType; + private int pendingUseAmount = 1; + private bool hasPendingUse; + private InventoryItemType currentDetailItemType; + private bool hasDetailItem; private void Awake() { - if (inventoryPanel == null) - inventoryPanel = gameObject; + if (inventoryManager == null && InventoryManager.Instance != null) + inventoryManager = InventoryManager.Instance; if (inventoryManager == null && autoFindManager) inventoryManager = FindFirstObjectByType(); + + if (inventoryPanel == null && autoFindPanelChild) + { + Transform panelTransform = transform.Find(autoPanelChildName); + if (panelTransform != null) + inventoryPanel = panelTransform.gameObject; + } + + if (uiAudioSource == null) + uiAudioSource = GetComponent(); + + if (acquisitionPopupPanel != null) + acquisitionPopupPanel.SetActive(false); + + if (messagePanel != null) + messagePanel.SetActive(false); + + if (confirmationPanel != null) + confirmationPanel.SetActive(false); + + if (detailPanel != null) + detailPanel.SetActive(false); + + if (confirmationYesButton != null) + { + confirmationYesButton.onClick.RemoveListener(ConfirmPendingUse); + confirmationYesButton.onClick.AddListener(ConfirmPendingUse); + } + + if (confirmationNoButton != null) + { + confirmationNoButton.onClick.RemoveListener(CancelPendingUse); + confirmationNoButton.onClick.AddListener(CancelPendingUse); + } + + if (detailUseButton != null) + { + detailUseButton.onClick.RemoveListener(UseCurrentDetailItem); + detailUseButton.onClick.AddListener(UseCurrentDetailItem); + } + + ApplyItemDataToSlots(); + } + + private void Start() + { + SetVisible(visibleOnStart); + RefreshAllSlots(); + RefreshRecentLogs(); + RefreshMemoryProgress(); } private void OnEnable() @@ -41,18 +168,54 @@ private void OnDisable() Unsubscribe(); } + private void Update() + { + if (enableKeyboardToggleForTesting && Input.GetKeyDown(keyboardToggleKey)) + ToggleVisible(); + } + + private void LateUpdate() + { + if (!followTarget || targetToFollow == null) + return; + + transform.position = targetToFollow.TransformPoint(localPositionOffset); + transform.rotation = targetToFollow.rotation * Quaternion.Euler(localEulerOffset); + + if (faceMainCamera && Camera.main != null) + { + Vector3 direction = transform.position - Camera.main.transform.position; + if (direction.sqrMagnitude > 0.0001f) + transform.rotation = Quaternion.LookRotation(direction.normalized, Vector3.up); + } + } + public void SetVisible(bool visible) { - if (inventoryPanel != null) - inventoryPanel.SetActive(visible); + if (inventoryPanel == null) + return; + + if (preventDisablingSelf && inventoryPanel == gameObject) + { + Debug.LogWarning("[InventoryUI] InventoryPanel에 자기 자신이 들어가 있습니다. InventoryRoot는 항상 켜두고 자식 InventoryPanel만 연결하세요.", this); + return; + } + + inventoryPanel.SetActive(visible); + + if (visible) + RefreshAllSlots(); } public void ToggleVisible() { if (inventoryPanel != null) - inventoryPanel.SetActive(!inventoryPanel.activeSelf); + SetVisible(!inventoryPanel.activeSelf); } + public void ShowInventory() => SetVisible(true); + public void HideInventory() => SetVisible(false); + public void SetManager(InventoryManager manager) { if (inventoryManager == manager) @@ -61,9 +224,22 @@ public void SetManager(InventoryManager manager) Unsubscribe(); inventoryManager = manager; Subscribe(); + ApplyItemDataToSlots(); RefreshAllSlots(); } + public void SetFilterAll() => SetFilter(InventoryItemCategory.All); + public void SetFilterConsumable() => SetFilter(InventoryItemCategory.Consumable); + public void SetFilterQuest() => SetFilter(InventoryItemCategory.Quest); + public void SetFilterKeyItem() => SetFilter(InventoryItemCategory.KeyItem); + public void SetFilterMaterial() => SetFilter(InventoryItemCategory.Material); + + public void SetFilter(InventoryItemCategory category) + { + currentFilter = category; + ApplyFilterToSlots(); + } + public void RefreshAllSlots() { if (inventoryManager == null || slots == null) @@ -75,9 +251,16 @@ public void RefreshAllSlots() if (slot == null) continue; + InventoryItemDefinition definition = inventoryManager.GetDefinition(slot.ItemType); + slot.SetInventoryUI(this); + slot.SetDefinition(definition); + int count = inventoryManager.GetItemCount(slot.ItemType); - slot.SetCount(count, false); + int maxCount = inventoryManager.GetMaxCount(slot.ItemType); + slot.SetCount(count, false, maxCount); } + + ApplyFilterToSlots(); } private void RefreshSlot(InventoryItemType itemType, int count) @@ -85,13 +268,53 @@ private void RefreshSlot(InventoryItemType itemType, int count) if (slots == null) return; + int maxCount = inventoryManager != null ? inventoryManager.GetMaxCount(itemType) : 0; + for (int i = 0; i < slots.Length; i++) { InventorySlotUI slot = slots[i]; if (slot == null || slot.ItemType != itemType) continue; - slot.SetCount(count, showNewBadgeOnIncrease); + slot.SetCount(count, showNewBadgeOnIncrease, maxCount); + } + + if (hasDetailItem && currentDetailItemType == itemType) + ShowItemDetail(itemType); + } + + private void ApplyItemDataToSlots() + { + if (inventoryManager == null || slots == null) + return; + + for (int i = 0; i < slots.Length; i++) + { + InventorySlotUI slot = slots[i]; + if (slot == null) + continue; + + slot.SetInventoryUI(this); + slot.SetDefinition(inventoryManager.GetDefinition(slot.ItemType)); + } + } + + private void ApplyFilterToSlots() + { + if (slots == null) + return; + + for (int i = 0; i < slots.Length; i++) + { + InventorySlotUI slot = slots[i]; + if (slot == null) + continue; + + bool visible = currentFilter == InventoryItemCategory.All || slot.Category == currentFilter; + if (hideSlotsOutsideFilter) + slot.gameObject.SetActive(visible); + else + slot.SetFilteredOut(!visible); } } @@ -101,6 +324,11 @@ private void Subscribe() return; inventoryManager.ItemCountChanged += RefreshSlot; + inventoryManager.ItemAdded += HandleItemAdded; + inventoryManager.ItemUsed += HandleItemUsed; + inventoryManager.MessageRequested += ShowMessage; + inventoryManager.LogAdded += HandleLogAdded; + inventoryManager.MemoryPieceProgressChanged += HandleMemoryPieceProgressChanged; subscribed = true; } @@ -110,6 +338,306 @@ private void Unsubscribe() return; inventoryManager.ItemCountChanged -= RefreshSlot; + inventoryManager.ItemAdded -= HandleItemAdded; + inventoryManager.ItemUsed -= HandleItemUsed; + inventoryManager.MessageRequested -= ShowMessage; + inventoryManager.LogAdded -= HandleLogAdded; + inventoryManager.MemoryPieceProgressChanged -= HandleMemoryPieceProgressChanged; subscribed = false; } + + private void HandleItemAdded(InventoryItemType itemType, int addedAmount, int totalCount) + { + ShowAcquisitionPopup(itemType, addedAmount); + } + + private void HandleItemUsed(InventoryItemType itemType, int count) + { + AudioClip clip = inventoryManager != null ? inventoryManager.GetUseClip(itemType) : null; + PlayUIClip(clip != null ? clip : defaultUseClip); + } + + private void HandleLogAdded(InventoryLogEntry entry) + { + RefreshRecentLogs(); + } + + private void HandleMemoryPieceProgressChanged(int current, int target) + { + RefreshMemoryProgress(current, target); + } + + public void ShowAcquisitionPopup(InventoryItemType itemType, int amount) + { + if (inventoryManager == null) + return; + + string displayName = inventoryManager.GetDisplayName(itemType); + Sprite icon = inventoryManager.GetIcon(itemType); + + if (acquisitionIconImage != null) + { + acquisitionIconImage.sprite = icon; + acquisitionIconImage.enabled = icon != null; + } + + if (acquisitionText != null) + acquisitionText.text = string.Format(acquisitionFormat, displayName, Mathf.Max(1, amount)); + + AudioClip clip = inventoryManager.GetAcquisitionClip(itemType); + PlayUIClip(clip != null ? clip : defaultAcquisitionClip); + + if (acquisitionRoutine != null) + StopCoroutine(acquisitionRoutine); + + acquisitionRoutine = StartCoroutine(ShowPanelRoutine(acquisitionPopupPanel, acquisitionPopupCanvasGroup, acquisitionPopupTime)); + } + + public void ShowMessage(string message) + { + if (string.IsNullOrWhiteSpace(message)) + return; + + if (messageText != null) + messageText.text = message; + + if (messageRoutine != null) + StopCoroutine(messageRoutine); + + messageRoutine = StartCoroutine(ShowPanelRoutine(messagePanel, messageCanvasGroup, messageShowTime)); + } + + private IEnumerator ShowPanelRoutine(GameObject panel, CanvasGroup canvasGroup, float showTime) + { + if (panel == null) + yield break; + + panel.SetActive(true); + + if (canvasGroup != null) + canvasGroup.alpha = 1f; + + yield return new WaitForSecondsRealtime(Mathf.Max(0.05f, showTime)); + + if (canvasGroup != null) + canvasGroup.alpha = 0f; + + panel.SetActive(false); + } + + public void RequestUseItem(InventoryItemType itemType) + { + RequestUseItem(itemType, 1); + } + + public void RequestUseItem(InventoryItemType itemType, int amount) + { + if (inventoryManager == null) + return; + + if (!inventoryManager.IsUsable(itemType)) + { + ShowMessage($"{inventoryManager.GetDisplayName(itemType)}은(는) 지금 사용할 수 없습니다."); + PlayUIClip(defaultErrorClip); + return; + } + + if (!inventoryManager.HasItem(itemType, amount)) + { + ShowMessage(inventoryManager.GetInsufficientMessage(itemType, amount)); + PlayUIClip(defaultErrorClip); + return; + } + + if (inventoryManager.RequiresUseConfirmation(itemType)) + { + pendingUseItemType = itemType; + pendingUseAmount = Mathf.Max(1, amount); + ShowConfirmation(itemType, amount); + } + else + { + bool result = inventoryManager.UseItem(itemType, amount); + if (!result) + PlayUIClip(defaultErrorClip); + } + } + + private void ShowConfirmation(InventoryItemType itemType, int amount) + { + pendingUseItemType = itemType; + pendingUseAmount = Mathf.Max(1, amount); + hasPendingUse = true; + + if (confirmationPanel == null) + { + ConfirmPendingUse(); + return; + } + + string displayName = inventoryManager != null ? inventoryManager.GetDisplayName(itemType) : itemType.ToString(); + + if (confirmationTitleText != null) + confirmationTitleText.text = "아이템 사용"; + + if (confirmationBodyText != null) + confirmationBodyText.text = $"{displayName}을(를) 사용하시겠습니까?"; + + confirmationPanel.SetActive(true); + } + + public void ConfirmPendingUse() + { + if (confirmationPanel != null) + confirmationPanel.SetActive(false); + + if (!hasPendingUse) + return; + + InventoryItemType itemType = pendingUseItemType; + int amount = Mathf.Max(1, pendingUseAmount); + hasPendingUse = false; + + if (inventoryManager != null) + { + bool result = inventoryManager.UseItem(itemType, amount); + if (!result) + PlayUIClip(defaultErrorClip); + } + } + + public void CancelPendingUse() + { + hasPendingUse = false; + + if (confirmationPanel != null) + confirmationPanel.SetActive(false); + } + + public void ShowItemDetail(InventoryItemType itemType) + { + hasDetailItem = true; + currentDetailItemType = itemType; + + if (inventoryManager == null || detailPanel == null) + return; + + InventoryItemDefinition definition = inventoryManager.GetDefinition(itemType); + int count = inventoryManager.GetItemCount(itemType); + int maxCount = inventoryManager.GetMaxCount(itemType); + Sprite icon = inventoryManager.GetIcon(itemType); + + if (detailIconImage != null) + { + detailIconImage.sprite = icon; + detailIconImage.enabled = icon != null; + } + + if (detailTitleText != null) + detailTitleText.text = inventoryManager.GetDisplayName(itemType); + + if (detailDescriptionText != null) + detailDescriptionText.text = inventoryManager.GetDescription(itemType); + + if (detailCountText != null) + detailCountText.text = maxCount > 0 ? $"보유: x{count} / {maxCount}" : $"보유: x{count}"; + + if (detailGoalText != null) + detailGoalText.text = inventoryManager.GetGoalHint(itemType); + + if (detailUseButton != null) + { + bool usable = definition != null && definition.usable && count > 0; + detailUseButton.gameObject.SetActive(definition != null && definition.usable); + detailUseButton.interactable = usable; + } + + detailPanel.SetActive(true); + } + + public void HideItemDetail() + { + hasDetailItem = false; + if (detailPanel != null) + detailPanel.SetActive(false); + } + + public void UseCurrentDetailItem() + { + if (!hasDetailItem) + return; + + RequestUseItem(currentDetailItemType, 1); + } + + private void RefreshRecentLogs() + { + if (recentLogTexts == null || recentLogTexts.Length == 0 || inventoryManager == null) + return; + + IReadOnlyList logs = inventoryManager.GetRecentLogs(); + + for (int i = 0; i < recentLogTexts.Length; i++) + { + if (recentLogTexts[i] == null) + continue; + + recentLogTexts[i].text = i < logs.Count && logs[i] != null ? logs[i].ToString() : string.Empty; + } + } + + private void RefreshMemoryProgress() + { + if (inventoryManager == null) + return; + + RefreshMemoryProgress(inventoryManager.GetItemCount(inventoryManager.MemoryPieceItemType), inventoryManager.MemoryPieceTargetCount); + } + + private void RefreshMemoryProgress(int current, int target) + { + target = Mathf.Max(1, target); + current = Mathf.Clamp(current, 0, target); + + if (memoryProgressText != null) + memoryProgressText.text = string.Format(memoryProgressFormat, current, target); + + if (memoryProgressSlider != null) + { + memoryProgressSlider.minValue = 0f; + memoryProgressSlider.maxValue = target; + memoryProgressSlider.value = current; + } + } + + private void PlayUIClip(AudioClip clip) + { + if (clip == null) + return; + + if (uiAudioSource != null) + uiAudioSource.PlayOneShot(clip); + else + AudioSource.PlayClipAtPoint(clip, transform.position); + } + + public void CheckVRUISetup() + { + Canvas canvas = GetComponentInParent(); + if (canvas == null) + { + Debug.LogWarning("[InventoryUI] Canvas가 없습니다.", this); + return; + } + + if (canvas.renderMode != RenderMode.WorldSpace) + Debug.LogWarning("[InventoryUI] VR UI에서는 Canvas Render Mode를 World Space로 권장합니다.", canvas); + + if (EventSystem.current == null) + Debug.LogWarning("[InventoryUI] EventSystem이 없습니다. VR 포인터 UI가 동작하지 않을 수 있습니다.", this); + + GraphicRaycaster graphicRaycaster = canvas.GetComponent(); + if (graphicRaycaster == null) + Debug.LogWarning("[InventoryUI] Canvas에 GraphicRaycaster 또는 Tracked Device Graphic Raycaster가 필요합니다.", canvas); + } } diff --git a/Assets/My project/Inventory/Scripts/InventoryUILayoutController.cs b/Assets/My project/Inventory/Scripts/InventoryUILayoutController.cs new file mode 100644 index 00000000..8d660641 --- /dev/null +++ b/Assets/My project/Inventory/Scripts/InventoryUILayoutController.cs @@ -0,0 +1,2242 @@ +using System; +using System.Collections.Generic; +using TMPro; +using UnityEngine; +using UnityEngine.UI; + +#if UNITY_EDITOR +using UnityEditor; +#endif + +public enum InventoryRootUIMode +{ + TestMode, + PlayMode, + BuildMode, + HiddenMode, + LayoutOnly +} + +public enum InventoryUIAnchorPreset +{ + Custom, + MiddleCenter, + TopLeft, + TopCenter, + TopRight, + MiddleLeft, + MiddleRight, + BottomLeft, + BottomCenter, + BottomRight, + StretchAll +} + +[Serializable] +public class InventoryControlledRectTarget +{ + [Header("Target")] + public string name; + public RectTransform rectTransform; + public GameObject activeTarget; + + [Header("Rect Layout")] + public bool applyRect = true; + public InventoryUIAnchorPreset anchorPreset = InventoryUIAnchorPreset.MiddleCenter; + public Vector2 customAnchorMin = new Vector2(0.5f, 0.5f); + public Vector2 customAnchorMax = new Vector2(0.5f, 0.5f); + public Vector2 customPivot = new Vector2(0.5f, 0.5f); + public Vector2 size = new Vector2(100f, 100f); + public Vector2 anchoredPosition = Vector2.zero; + + [Header("Transform")] + public bool resetScaleToOne = true; + public bool applyLocalScale = false; + public Vector3 localScale = Vector3.one; + public bool applyLocalRotation = false; + public Vector3 localEulerAngles = Vector3.zero; + public bool applySiblingIndex = false; + public int siblingIndex = 0; + + [Header("Active By Mode")] + public bool controlActiveState = false; + public bool activeInTestMode = true; + public bool activeInPlayMode = true; + public bool activeInBuildMode = true; + public bool activeInHiddenMode = false; + + [Header("CanvasGroup")] + public bool applyCanvasGroup = false; + public bool addCanvasGroupIfMissing = true; + [Range(0f, 1f)] public float canvasAlpha = 1f; + public bool canvasInteractable = false; + public bool canvasBlocksRaycasts = false; + + [Header("Raycast")] + public bool applySelfImageRaycast = false; + public bool selfImageRaycastTarget = false; + public bool applyChildImageRaycasts = false; + public bool childImageRaycastTarget = false; + public bool preserveButtonImageRaycasts = true; + public bool applyChildTextRaycasts = false; + public bool childTextRaycastTarget = false; +} + +[Serializable] +public class InventoryControlledTextTarget +{ + [Header("Target")] + public string name; + public TMP_Text text; + + [Header("Rect Layout")] + public bool applyRect = false; + public InventoryUIAnchorPreset anchorPreset = InventoryUIAnchorPreset.MiddleCenter; + public Vector2 customAnchorMin = new Vector2(0.5f, 0.5f); + public Vector2 customAnchorMax = new Vector2(0.5f, 0.5f); + public Vector2 customPivot = new Vector2(0.5f, 0.5f); + public Vector2 size = new Vector2(100f, 30f); + public Vector2 anchoredPosition = Vector2.zero; + + [Header("Text Settings")] + public bool applyFontSize = false; + public float fontSize = 20f; + public bool applyAlignment = false; + public TextAlignmentOptions alignment = TextAlignmentOptions.Center; + public bool applyColor = false; + public Color color = Color.white; + public bool applyRaycastTarget = true; + public bool raycastTarget = false; + public bool resetScaleToOne = true; + + [Header("Outline / Shadow")] + public bool applyOutline = false; + public bool addOutlineIfMissing = true; + public Color outlineColor = new Color(0f, 0.75f, 1f, 0.8f); + public Vector2 outlineEffectDistance = new Vector2(1f, -1f); + public bool outlineUseGraphicAlpha = true; + public bool applyShadow = false; + public bool addShadowIfMissing = true; + public Color shadowColor = new Color(0f, 0f, 0f, 0.65f); + public Vector2 shadowEffectDistance = new Vector2(2f, -2f); + public bool shadowUseGraphicAlpha = true; +} + +[Serializable] +public class InventoryControlledImageTarget +{ + [Header("Target")] + public string name; + public Image image; + + [Header("Rect Layout")] + public bool applyRect = false; + public InventoryUIAnchorPreset anchorPreset = InventoryUIAnchorPreset.MiddleCenter; + public Vector2 customAnchorMin = new Vector2(0.5f, 0.5f); + public Vector2 customAnchorMax = new Vector2(0.5f, 0.5f); + public Vector2 customPivot = new Vector2(0.5f, 0.5f); + public Vector2 size = new Vector2(64f, 64f); + public Vector2 anchoredPosition = Vector2.zero; + + [Header("Image Settings")] + public bool applyColor = false; + public Color color = Color.white; + public bool applySprite = false; + public Sprite sprite; + public bool applyRaycastTarget = true; + public bool raycastTarget = false; + public bool resetScaleToOne = true; + + [Header("Outline / Shadow")] + public bool applyOutline = false; + public bool addOutlineIfMissing = true; + public Color outlineColor = new Color(0f, 0.75f, 1f, 0.8f); + public Vector2 outlineEffectDistance = new Vector2(1f, -1f); + public bool outlineUseGraphicAlpha = true; + public bool applyShadow = false; + public bool addShadowIfMissing = true; + public Color shadowColor = new Color(0f, 0f, 0f, 0.55f); + public Vector2 shadowEffectDistance = new Vector2(2f, -2f); + public bool shadowUseGraphicAlpha = true; +} + +[Serializable] +public class InventoryControlledButtonTarget +{ + [Header("Target")] + public string name; + public Button button; + + [Header("Rect Layout")] + public bool applyRect = false; + public InventoryUIAnchorPreset anchorPreset = InventoryUIAnchorPreset.MiddleCenter; + public Vector2 customAnchorMin = new Vector2(0.5f, 0.5f); + public Vector2 customAnchorMax = new Vector2(0.5f, 0.5f); + public Vector2 customPivot = new Vector2(0.5f, 0.5f); + public Vector2 size = new Vector2(100f, 35f); + public Vector2 anchoredPosition = Vector2.zero; + + [Header("Button Settings")] + public bool applyInteractable = false; + public bool interactable = true; + public bool applyImageRaycastTarget = true; + public bool imageRaycastTarget = true; + public bool disableChildTextRaycasts = true; + public bool resetScaleToOne = true; + + [Header("Button Colors")] + public bool applyButtonColors = false; + public Color normalColor = new Color(0.07f, 0.18f, 0.30f, 0.90f); + public Color highlightedColor = new Color(0.12f, 0.42f, 0.70f, 1f); + public Color pressedColor = new Color(0.04f, 0.12f, 0.20f, 1f); + public Color selectedColor = new Color(0.15f, 0.50f, 0.85f, 1f); + public Color disabledColor = new Color(0.20f, 0.20f, 0.20f, 0.45f); + public float colorMultiplier = 1f; + public float fadeDuration = 0.1f; + + [Header("Outline / Shadow")] + public bool applyOutline = false; + public bool addOutlineIfMissing = true; + public Color outlineColor = new Color(0f, 0.75f, 1f, 0.8f); + public Vector2 outlineEffectDistance = new Vector2(1f, -1f); + public bool outlineUseGraphicAlpha = true; + public bool applyShadow = false; + public bool addShadowIfMissing = true; + public Color shadowColor = new Color(0f, 0f, 0f, 0.55f); + public Vector2 shadowEffectDistance = new Vector2(2f, -2f); + public bool shadowUseGraphicAlpha = true; +} + +[Serializable] +public class InventoryLayoutPadding +{ + public int left; + public int right; + public int top; + public int bottom; + + public InventoryLayoutPadding() { } + + public InventoryLayoutPadding(int left, int right, int top, int bottom) + { + this.left = left; + this.right = right; + this.top = top; + this.bottom = bottom; + } + + public RectOffset ToRectOffset() + { + return new RectOffset(left, right, top, bottom); + } +} + +[Serializable] +public class InventoryControlledGridLayoutTarget +{ + [Header("Target")] + public string name; + public GridLayoutGroup grid; + + [Header("Grid Settings")] + public bool applyGrid = true; + public Vector2 cellSize = new Vector2(100f, 100f); + public Vector2 spacing = Vector2.zero; + public TextAnchor childAlignment = TextAnchor.MiddleCenter; + public GridLayoutGroup.Constraint constraint = GridLayoutGroup.Constraint.FixedColumnCount; + public int constraintCount = 5; + public InventoryLayoutPadding padding; +} + +/// +/// InventoryRoot 아래 UI를 한 곳에서 정리하는 컨트롤러입니다. +/// - 기본 인벤토리 패널들의 위치/크기/배치를 제어합니다. +/// - Inspector에 직접 연결한 Rect/Text/Image/Button/Grid 대상도 제어합니다. +/// - 없는 CanvasGroup, Image, GridLayoutGroup, AudioSource 등을 자동으로 붙일 수 있습니다. +/// - Text 내용 자체는 바꾸지 않습니다. 내용 변경은 InventoryUI가 담당하게 두는 것을 권장합니다. +/// +[ExecuteAlways] +[DisallowMultipleComponent] +public class InventoryUILayoutController : MonoBehaviour +{ + [Header("Root / Canvas")] + [SerializeField] private bool configureRootCanvas = true; + [SerializeField] private Vector2 rootCanvasSize = new Vector2(800f, 500f); + [SerializeField] private bool applyRootWorldScale = false; + [SerializeField] private Vector3 rootWorldScale = new Vector3(0.0015f, 0.0015f, 0.0015f); + [SerializeField] private bool addGraphicRaycasterIfMissing = true; + [SerializeField] private bool addTrackedDeviceGraphicRaycasterIfAvailable = true; + + [Header("Known UI References")] + [SerializeField] private RectTransform inventoryPanel; + [SerializeField] private RectTransform titleText; + [SerializeField] private RectTransform closeButton; + [SerializeField] private RectTransform categoryButtons; + [SerializeField] private RectTransform memoryProgressArea; + [SerializeField] private RectTransform slotContainer; + [SerializeField] private RectTransform recentLogArea; + [SerializeField] private RectTransform debugPanel; + [SerializeField] private RectTransform quickUseButtons; + + [Header("Popup / Floating Panels")] + [SerializeField] private RectTransform tooltipPanel; + [SerializeField] private RectTransform acquisitionPopupPanel; + [SerializeField] private RectTransform messagePanel; + [SerializeField] private RectTransform confirmationPanel; + [SerializeField] private RectTransform detailPanel; + + [Header("Inventory Scripts")] + [SerializeField] private InventoryUI inventoryUI; + [SerializeField] private InventorySlotUI[] slots; + + [Header("Auto Find Names")] + [SerializeField] private string inventoryPanelName = "InventoryPanel"; + [SerializeField] private string titleTextName = "TitleText"; + [SerializeField] private string closeButtonName = "CloseButton"; + [SerializeField] private string categoryButtonsName = "CategoryButtons"; + [SerializeField] private string memoryProgressAreaName = "MemoryProgressArea"; + [SerializeField] private string slotContainerName = "SlotContainer"; + [SerializeField] private string recentLogAreaName = "RecentLogArea"; + [SerializeField] private string debugPanelName = "DebugPanel"; + [SerializeField] private string quickUseButtonsName = "QuickUseButtons"; + [SerializeField] private string tooltipPanelName = "TooltipPanel"; + [SerializeField] private string acquisitionPopupPanelName = "AcquisitionPopupPanel"; + [SerializeField] private string messagePanelName = "MessagePanel"; + [SerializeField] private string confirmationPanelName = "ConfirmationPanel"; + [SerializeField] private string detailPanelName = "DetailPanel"; + + [Header("Apply Settings")] + [SerializeField] private bool autoFindReferences = true; + [SerializeField] private bool autoAddMissingComponents = true; + [SerializeField] private bool applyKnownLayout = true; + [SerializeField] private bool applyCustomControlledTargets = true; + [SerializeField] private bool resetChildScaleToOne = true; + [SerializeField] private bool applyLayoutOnAwake = true; + [SerializeField] private bool applyModeOnAwake = true; + [Tooltip("InventoryUI.Start()의 visibleOnStart 처리 이후에 모드를 한 번 더 적용해 패널 ON/OFF 충돌을 줄입니다.")] + [SerializeField] private bool applyModeAfterOneFrame = true; + [SerializeField] private bool applyInEditor = true; + [SerializeField] private InventoryRootUIMode initialMode = InventoryRootUIMode.TestMode; + + [Header("Known Panel Layout")] + [SerializeField] private Vector2 inventoryPanelSize = new Vector2(760f, 460f); + [SerializeField] private Vector2 inventoryPanelPos = Vector2.zero; + [SerializeField] private Vector2 titleTextSize = new Vector2(360f, 50f); + [SerializeField] private Vector2 titleTextPos = new Vector2(0f, -18f); + [SerializeField] private Vector2 closeButtonSize = new Vector2(70f, 38f); + [SerializeField] private Vector2 closeButtonPos = new Vector2(-18f, -18f); + [SerializeField] private Vector2 categoryButtonsSize = new Vector2(620f, 45f); + [SerializeField] private Vector2 categoryButtonsPos = new Vector2(0f, -75f); + [SerializeField] private Vector2 memoryProgressAreaSize = new Vector2(620f, 55f); + [SerializeField] private Vector2 memoryProgressAreaPos = new Vector2(0f, -125f); + [SerializeField] private Vector2 slotContainerSize = new Vector2(500f, 145f); + [SerializeField] private Vector2 slotContainerPos = new Vector2(-80f, 20f); + [SerializeField] private Vector2 recentLogSize = new Vector2(340f, 110f); + [SerializeField] private Vector2 recentLogPos = new Vector2(25f, 25f); + [SerializeField] private Vector2 debugPanelSize = new Vector2(300f, 110f); + [SerializeField] private Vector2 debugPanelPos = new Vector2(-25f, 25f); + [SerializeField] private Vector2 quickUseButtonsSize = new Vector2(130f, 160f); + [SerializeField] private Vector2 quickUseButtonsPos = new Vector2(-20f, -35f); + + [Header("Known Popup / Detail Layout")] + [SerializeField] private Vector2 tooltipPanelSize = new Vector2(520f, 120f); + [SerializeField] private Vector2 tooltipPanelPos = new Vector2(0f, -15f); + [SerializeField] private Vector2 acquisitionPopupSize = new Vector2(360f, 70f); + [SerializeField] private Vector2 acquisitionPopupPos = new Vector2(0f, 40f); + [SerializeField] private Vector2 messagePanelSize = new Vector2(460f, 60f); + [SerializeField] private Vector2 messagePanelPos = new Vector2(0f, -85f); + [SerializeField] private Vector2 confirmationPanelSize = new Vector2(420f, 220f); + [SerializeField] private Vector2 confirmationPanelPos = Vector2.zero; + [SerializeField] private Vector2 detailPanelSize = new Vector2(260f, 340f); + [SerializeField] private Vector2 detailPanelPos = new Vector2(-25f, 0f); + + [Header("Known LayoutGroup Defaults")] + [SerializeField] private Vector2 slotCellSize = new Vector2(85f, 120f); + [SerializeField] private Vector2 slotSpacing = new Vector2(8f, 0f); + [SerializeField] private int slotColumnCount = 5; + [SerializeField] private Vector2 debugButtonCellSize = new Vector2(85f, 28f); + [SerializeField] private Vector2 debugButtonSpacing = new Vector2(5f, 5f); + [SerializeField] private int debugButtonColumnCount = 3; + [SerializeField] private Vector2 quickUseButtonCellSize = new Vector2(115f, 26f); + [SerializeField] private Vector2 quickUseButtonSpacing = new Vector2(0f, 5f); + + [Header("Known Slot Child Layout")] + [SerializeField] private bool arrangeSlotChildren = true; + [SerializeField] private Vector2 slotIconSize = new Vector2(64f, 64f); + [SerializeField] private Vector2 slotIconPos = new Vector2(0f, 18f); + [SerializeField] private Vector2 slotCountTextSize = new Vector2(100f, 28f); + [SerializeField] private Vector2 slotCountTextPos = new Vector2(0f, 8f); + [SerializeField] private Vector2 slotNewBadgeSize = new Vector2(52f, 24f); + [SerializeField] private Vector2 slotNewBadgePos = new Vector2(-4f, -4f); + + [Header("Mode Active States")] + [SerializeField] private bool testShowInventoryPanel = true; + [SerializeField] private bool testShowDebugPanel = true; + [SerializeField] private bool testShowRecentLogArea = true; + [SerializeField] private bool testShowCategoryButtons = true; + [SerializeField] private bool testShowMemoryProgressArea = true; + [SerializeField] private bool testShowQuickUseButtons = false; + + [SerializeField] private bool playShowInventoryPanel = false; + [SerializeField] private bool playShowDebugPanel = false; + [SerializeField] private bool playShowRecentLogArea = true; + [SerializeField] private bool playShowCategoryButtons = true; + [SerializeField] private bool playShowMemoryProgressArea = true; + [SerializeField] private bool playShowQuickUseButtons = false; + + [SerializeField] private bool buildShowInventoryPanel = false; + [SerializeField] private bool buildShowDebugPanel = false; + [SerializeField] private bool buildShowRecentLogArea = true; + [SerializeField] private bool buildShowCategoryButtons = true; + [SerializeField] private bool buildShowMemoryProgressArea = true; + [SerializeField] private bool buildShowQuickUseButtons = false; + + [Header("Custom Inspector-Controlled Targets")] + [Tooltip("패널, 영역, 빈 오브젝트 등 RectTransform 기준으로 제어할 대상입니다.")] + [SerializeField] private List controlledRects = new List(); + [Tooltip("패널 자식 TMP_Text의 위치, 크기, 폰트 크기, 정렬, Raycast를 제어합니다. Text 내용은 바꾸지 않습니다.")] + [SerializeField] private List controlledTexts = new List(); + [Tooltip("패널 자식 Image의 위치, 크기, 색상, Raycast를 제어합니다. Sprite는 Apply Sprite를 켰을 때만 바꿉니다.")] + [SerializeField] private List controlledImages = new List(); + [Tooltip("패널 자식 Button의 위치, 크기, Interactable, Raycast를 제어합니다.")] + [SerializeField] private List controlledButtons = new List(); + [Tooltip("SlotContainer, DebugPanel 같은 GridLayoutGroup의 Cell Size, Spacing, Count를 제어합니다.")] + [SerializeField] private List controlledGridLayouts = new List(); + + [Header("Basic Visual Theme")] + [SerializeField] private bool applyBasicVisualTheme = true; + [SerializeField] private bool styleKnownPanels = true; + [SerializeField] private bool styleKnownButtons = true; + [SerializeField] private bool styleKnownTexts = true; + [SerializeField] private bool styleKnownSlots = true; + [SerializeField] private bool addOutlineToKnownGraphics = true; + [SerializeField] private bool addShadowToKnownTexts = true; + + [Header("Theme Colors - Ocean VR")] + [SerializeField] private Color mainPanelColor = new Color(0.03f, 0.08f, 0.15f, 0.88f); + [SerializeField] private Color subPanelColor = new Color(0.04f, 0.14f, 0.24f, 0.82f); + [SerializeField] private Color popupPanelColor = new Color(0.02f, 0.10f, 0.18f, 0.92f); + [SerializeField] private Color slotColor = new Color(0.05f, 0.16f, 0.26f, 0.90f); + [SerializeField] private Color slotImportantGlowColor = new Color(1.0f, 0.72f, 0.20f, 0.38f); + [SerializeField] private Color filteredOverlayColor = new Color(0f, 0f, 0f, 0.55f); + [SerializeField] private Color newBadgeColor = new Color(1.0f, 0.82f, 0.12f, 0.95f); + [SerializeField] private Color mainTextColor = new Color(0.95f, 0.92f, 0.82f, 1f); + [SerializeField] private Color accentTextColor = new Color(1.0f, 0.78f, 0.35f, 1f); + [SerializeField] private Color mutedTextColor = new Color(0.70f, 0.86f, 0.95f, 1f); + [SerializeField] private Color outlineColor = new Color(0.18f, 0.76f, 1f, 0.65f); + [SerializeField] private Color goldOutlineColor = new Color(1.0f, 0.72f, 0.20f, 0.80f); + [SerializeField] private Color shadowColor = new Color(0f, 0f, 0f, 0.62f); + + [Header("Theme Button Colors")] + [SerializeField] private Color buttonNormalColor = new Color(0.06f, 0.20f, 0.33f, 0.95f); + [SerializeField] private Color buttonHighlightedColor = new Color(0.12f, 0.44f, 0.74f, 1f); + [SerializeField] private Color buttonPressedColor = new Color(0.03f, 0.12f, 0.22f, 1f); + [SerializeField] private Color buttonSelectedColor = new Color(0.16f, 0.50f, 0.82f, 1f); + [SerializeField] private Color buttonDisabledColor = new Color(0.20f, 0.22f, 0.24f, 0.45f); + [SerializeField] private Color debugButtonColor = new Color(0.07f, 0.22f, 0.32f, 0.95f); + [SerializeField] private Color dangerButtonColor = new Color(0.45f, 0.10f, 0.12f, 0.95f); + + [Header("Popup Groups")] + [SerializeField] private GameObject[] extraPopupPanelsToHide; + + [Header("Raycast / Component Fix")] + [SerializeField] private bool fixRaycastTargets = true; + [SerializeField] private bool fixCanvasGroups = true; + [SerializeField] private bool disableTextRaycasts = true; + [SerializeField] private bool disableNonInteractiveImageRaycasts = true; + [SerializeField] private bool setSliderInteractableFalse = true; + [SerializeField] private bool setSlotHoverSafeValues = true; + [SerializeField] private bool slotUseHoverScale = true; + [SerializeField] private float slotHoverScale = 1.03f; + [SerializeField] private bool slotBringToFrontOnHover = false; + + private bool isApplying; + + private void Reset() + { + AutoFindReferences(); + } + + private void Awake() + { + if (!Application.isPlaying) + return; + + if (autoFindReferences) + AutoFindReferences(); + + if (autoAddMissingComponents) + AutoSetupMissingComponents(); + + if (applyLayoutOnAwake) + ApplyFullInventoryRootLayout(); + + if (applyModeOnAwake) + ApplyInitialMode(); + } + + private System.Collections.IEnumerator Start() + { + if (!Application.isPlaying || !applyModeAfterOneFrame) + yield break; + + // InventoryUI.Start()의 visibleOnStart 적용이 끝난 뒤 모드를 다시 적용합니다. + yield return null; + ApplyInitialMode(); + } + +#if UNITY_EDITOR + private void OnValidate() + { + if (!applyInEditor) + return; + + EditorApplication.delayCall -= DelayedApplyInEditor; + EditorApplication.delayCall += DelayedApplyInEditor; + } + + private void DelayedApplyInEditor() + { + if (this == null || isApplying) + return; + + ApplyFullInventoryRootLayout(); + } +#endif + + [ContextMenu("Inventory UI/Apply Full Inventory Root Layout")] + public void ApplyFullInventoryRootLayout() + { + if (isApplying) + return; + + isApplying = true; + + if (autoFindReferences) + AutoFindReferences(); + + if (autoAddMissingComponents) + AutoSetupMissingComponents(); + + if (configureRootCanvas) + ConfigureRootCanvas(); + + if (applyKnownLayout) + ApplyKnownLayout(); + + if (arrangeSlotChildren) + ArrangeSlotChildren(); + + if (applyCustomControlledTargets) + ApplyCustomTargets(); + + if (applyBasicVisualTheme) + ApplyBasicVisualTheme(); + + if (fixRaycastTargets) + FixAllRaycastTargets(); + + isApplying = false; + } + + [ContextMenu("Inventory UI/Apply Custom Inspector Targets Only")] + public void ApplyCustomTargets() + { + ApplyControlledRectTargets(); + ApplyControlledTextTargets(); + ApplyControlledImageTargets(); + ApplyControlledButtonTargets(); + ApplyControlledGridLayoutTargets(); + } + + [ContextMenu("Inventory UI/Auto Find References")] + public void AutoFindReferences() + { + inventoryPanel = FindRectIfNull(inventoryPanel, inventoryPanelName); + titleText = FindRectIfNull(titleText, titleTextName); + closeButton = FindRectIfNull(closeButton, closeButtonName); + categoryButtons = FindRectIfNull(categoryButtons, categoryButtonsName); + memoryProgressArea = FindRectIfNull(memoryProgressArea, memoryProgressAreaName); + slotContainer = FindRectIfNull(slotContainer, slotContainerName); + recentLogArea = FindRectIfNull(recentLogArea, recentLogAreaName); + debugPanel = FindRectIfNull(debugPanel, debugPanelName); + quickUseButtons = FindRectIfNull(quickUseButtons, quickUseButtonsName); + tooltipPanel = FindRectIfNull(tooltipPanel, tooltipPanelName); + acquisitionPopupPanel = FindRectIfNull(acquisitionPopupPanel, acquisitionPopupPanelName); + messagePanel = FindRectIfNull(messagePanel, messagePanelName); + confirmationPanel = FindRectIfNull(confirmationPanel, confirmationPanelName); + detailPanel = FindRectIfNull(detailPanel, detailPanelName); + + if (inventoryUI == null) + inventoryUI = GetComponent(); + + if (slots == null || slots.Length == 0) + slots = GetComponentsInChildren(true); + } + + [ContextMenu("Inventory UI/Auto Setup Missing Components")] + public void AutoSetupMissingComponents() + { + Canvas canvas = GetOrAdd(gameObject); + canvas.renderMode = RenderMode.WorldSpace; + + GetOrAdd(gameObject); + + if (addGraphicRaycasterIfMissing) + GetOrAdd(gameObject); + + if (addTrackedDeviceGraphicRaycasterIfAvailable) + TryAddComponentByTypeName(gameObject, "UnityEngine.XR.Interaction.Toolkit.UI.TrackedDeviceGraphicRaycaster"); + + GetOrAdd(gameObject).playOnAwake = false; + + AddCanvasGroupIfNeeded(tooltipPanel, false, false); + AddCanvasGroupIfNeeded(acquisitionPopupPanel, false, false); + AddCanvasGroupIfNeeded(messagePanel, false, false); + AddCanvasGroupIfNeeded(confirmationPanel, true, true); + AddCanvasGroupIfNeeded(detailPanel, true, true); + + if (slotContainer != null) + GetOrAdd(slotContainer.gameObject); + + if (debugPanel != null) + GetOrAdd(debugPanel.gameObject); + + if (quickUseButtons != null && quickUseButtons.GetComponent() == null) + quickUseButtons.gameObject.AddComponent(); + } + + [ContextMenu("Inventory UI/Add Default Known Targets To Inspector Lists")] + public void AddDefaultKnownTargetsToInspectorLists() + { + AutoFindReferences(); + + AddControlledRect("InventoryPanel", inventoryPanel, null, InventoryUIAnchorPreset.MiddleCenter, inventoryPanelSize, inventoryPanelPos, false, true, true, true, false); + AddControlledRect("TitleText", titleText, null, InventoryUIAnchorPreset.TopCenter, titleTextSize, titleTextPos, false, true, true, true, false); + AddControlledRect("CloseButton", closeButton, null, InventoryUIAnchorPreset.TopRight, closeButtonSize, closeButtonPos, false, true, true, true, false); + AddControlledRect("CategoryButtons", categoryButtons, null, InventoryUIAnchorPreset.TopCenter, categoryButtonsSize, categoryButtonsPos, true, testShowCategoryButtons, playShowCategoryButtons, buildShowCategoryButtons, false); + AddControlledRect("MemoryProgressArea", memoryProgressArea, null, InventoryUIAnchorPreset.TopCenter, memoryProgressAreaSize, memoryProgressAreaPos, true, testShowMemoryProgressArea, playShowMemoryProgressArea, buildShowMemoryProgressArea, false); + AddControlledRect("SlotContainer", slotContainer, null, InventoryUIAnchorPreset.MiddleCenter, slotContainerSize, slotContainerPos, false, true, true, true, false); + AddControlledRect("RecentLogArea", recentLogArea, null, InventoryUIAnchorPreset.BottomLeft, recentLogSize, recentLogPos, true, testShowRecentLogArea, playShowRecentLogArea, buildShowRecentLogArea, false); + AddControlledRect("DebugPanel", debugPanel, null, InventoryUIAnchorPreset.BottomRight, debugPanelSize, debugPanelPos, true, testShowDebugPanel, playShowDebugPanel, buildShowDebugPanel, false); + AddControlledRect("QuickUseButtons", quickUseButtons, null, InventoryUIAnchorPreset.MiddleRight, quickUseButtonsSize, quickUseButtonsPos, true, testShowQuickUseButtons, playShowQuickUseButtons, buildShowQuickUseButtons, false); + AddControlledRect("TooltipPanel", tooltipPanel, null, InventoryUIAnchorPreset.BottomCenter, tooltipPanelSize, tooltipPanelPos, true, false, false, false, false); + AddControlledRect("AcquisitionPopupPanel", acquisitionPopupPanel, null, InventoryUIAnchorPreset.TopCenter, acquisitionPopupSize, acquisitionPopupPos, true, false, false, false, false); + AddControlledRect("MessagePanel", messagePanel, null, InventoryUIAnchorPreset.BottomCenter, messagePanelSize, messagePanelPos, true, false, false, false, false); + AddControlledRect("ConfirmationPanel", confirmationPanel, null, InventoryUIAnchorPreset.MiddleCenter, confirmationPanelSize, confirmationPanelPos, true, false, false, false, false); + AddControlledRect("DetailPanel", detailPanel, null, InventoryUIAnchorPreset.MiddleRight, detailPanelSize, detailPanelPos, true, false, false, false, false); + + AddGrid("SlotContainer Grid", slotContainer != null ? slotContainer.GetComponent() : null, slotCellSize, slotSpacing, GridLayoutGroup.Constraint.FixedColumnCount, slotColumnCount); + AddGrid("DebugPanel Grid", debugPanel != null ? debugPanel.GetComponent() : null, debugButtonCellSize, debugButtonSpacing, GridLayoutGroup.Constraint.FixedColumnCount, debugButtonColumnCount); + + AddChildrenOfPanelsToInspectorLists(); + } + + [ContextMenu("Inventory UI/Add Current Panel Children Texts Images Buttons")] + public void AddChildrenOfPanelsToInspectorLists() + { + RectTransform[] panels = new[] { inventoryPanel, tooltipPanel, acquisitionPopupPanel, messagePanel, confirmationPanel, detailPanel, recentLogArea, debugPanel }; + + foreach (RectTransform panel in panels) + { + if (panel == null) + continue; + + foreach (TMP_Text text in panel.GetComponentsInChildren(true)) + AddText(text.name, text); + + foreach (Image image in panel.GetComponentsInChildren(true)) + AddImage(image.name, image); + + foreach (Button button in panel.GetComponentsInChildren