From 2856d83f2586ca7c6da7361eeac777c21e0f295b Mon Sep 17 00:00:00 2001 From: Nam Tae Gun Date: Mon, 30 Sep 2024 11:11:09 +0900 Subject: [PATCH] =?UTF-8?q?=EC=B9=B5=ED=85=8C=EC=9D=BC=20=EC=A0=9C?= =?UTF-8?q?=EC=A1=B0=20Ui=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Assets/01.Scenes/01.Tycoon.unity | 15 +- .../Character/Player/Tycoon/TycoonPlayer.cs | 8 +- Assets/02.Scripts/EventManager.cs | 4 +- Assets/02.Scripts/Tycoon/LiquidController.cs | 188 +++++++++++------- .../Tycoon/LiquidInteractionRegion.cs | 82 ++++---- .../Characters/Players/TycoonPlayer.prefab | 4 + .../LiquidRenderTexture.shadergraph | 28 +-- 7 files changed, 193 insertions(+), 136 deletions(-) diff --git a/Assets/01.Scenes/01.Tycoon.unity b/Assets/01.Scenes/01.Tycoon.unity index 4a93fe046..e7e91e0dd 100644 --- a/Assets/01.Scenes/01.Tycoon.unity +++ b/Assets/01.Scenes/01.Tycoon.unity @@ -9424,8 +9424,9 @@ MonoBehaviour: _colorLerpSpeed: 0.5 _colorIntensity: 2 _objectPoolCount: 1000 - _moveDuration: 0.5 - _endPosition: {x: -300, y: 0, z: 0} + _moveToPlayerDuration: 0.3 + _moveToCenterDuration: 0.1 + _centerPosition: {x: -300, y: 0, z: 0} _endPositionOffset: {x: 0, y: 20, z: 0} _endScale: {x: 0.3, y: 0.3, z: 0.3} --- !u!1001 &1011627381 @@ -11795,7 +11796,7 @@ GameObject: m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 1 + m_IsActive: 0 --- !u!4 &1247057679 Transform: m_ObjectHideFlags: 0 @@ -14215,7 +14216,7 @@ GameObject: m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 1 + m_IsActive: 0 --- !u!4 &1400792458 Transform: m_ObjectHideFlags: 0 @@ -14317,6 +14318,8 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: f0f3dc568d0721b48ad5f24339d24951, type: 3} m_Name: m_EditorClassIdentifier: + _tycoonPlayer: {fileID: 0} + _isEntered: 0 --- !u!114 &1400792463 MonoBehaviour: m_ObjectHideFlags: 0 @@ -18915,7 +18918,7 @@ Transform: m_GameObject: {fileID: 1774013116} serializedVersion: 2 m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: -250, y: 0, z: -10} + m_LocalPosition: {x: -300, y: 0, z: -10} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: [] @@ -22735,7 +22738,7 @@ Transform: m_GameObject: {fileID: 2105041732} serializedVersion: 2 m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: -250, y: 0, z: 0} + m_LocalPosition: {x: -300, y: 0, z: 0} m_LocalScale: {x: 100, y: 100, z: 1} m_ConstrainProportionsScale: 0 m_Children: [] diff --git a/Assets/02.Scripts/Character/Player/Tycoon/TycoonPlayer.cs b/Assets/02.Scripts/Character/Player/Tycoon/TycoonPlayer.cs index 6715081a3..3db658d0f 100644 --- a/Assets/02.Scripts/Character/Player/Tycoon/TycoonPlayer.cs +++ b/Assets/02.Scripts/Character/Player/Tycoon/TycoonPlayer.cs @@ -123,8 +123,8 @@ namespace BlueWater.Players.Tycoons TycoonInput.OnMoveInputReceived += TycoonMovement.HandleInputMovement; var balloonUi = InteractionCanvas.BalloonUi; - EventManager.OnLiquidRegionEntered += balloonUi.EnterLiquidRegion; - EventManager.OnLiquidRegionExited += balloonUi.ExitLiquidRegion; + // EventManager.OnLiquidRegionEntered += balloonUi.EnterLiquidRegion; + // EventManager.OnLiquidRegionExited += balloonUi.ExitLiquidRegion; EventManager.OnCocktailStarted += balloonUi.PickupUnfinishedCocktail; EventManager.OnCocktailCompleted += balloonUi.SetItemImage; EventManager.OnCocktailDiscarded += balloonUi.DiscardItem; @@ -136,8 +136,8 @@ namespace BlueWater.Players.Tycoons TycoonInput.OnMoveInputReceived -= TycoonMovement.HandleInputMovement; var balloonUi = InteractionCanvas.BalloonUi; - EventManager.OnLiquidRegionEntered -= balloonUi.EnterLiquidRegion; - EventManager.OnLiquidRegionExited -= balloonUi.ExitLiquidRegion; + // EventManager.OnLiquidRegionEntered -= balloonUi.EnterLiquidRegion; + // EventManager.OnLiquidRegionExited -= balloonUi.ExitLiquidRegion; EventManager.OnCocktailStarted -= balloonUi.PickupUnfinishedCocktail; EventManager.OnCocktailCompleted -= balloonUi.SetItemImage; EventManager.OnCocktailDiscarded -= balloonUi.DiscardItem; diff --git a/Assets/02.Scripts/EventManager.cs b/Assets/02.Scripts/EventManager.cs index da8dfd635..7732dd98a 100644 --- a/Assets/02.Scripts/EventManager.cs +++ b/Assets/02.Scripts/EventManager.cs @@ -33,8 +33,8 @@ namespace BlueWater public static Action OnTycoonOpenedEvent; public static Action OnTycoonClosedEvent; - public static Action OnLiquidRegionEntered; - public static Action OnLiquidRegionExited; + // public static Action OnLiquidRegionEntered; + // public static Action OnLiquidRegionExited; public static Action OnCocktailStarted; public static Action OnCocktailCompleted; diff --git a/Assets/02.Scripts/Tycoon/LiquidController.cs b/Assets/02.Scripts/Tycoon/LiquidController.cs index 23d0e812c..bd0c2da30 100644 --- a/Assets/02.Scripts/Tycoon/LiquidController.cs +++ b/Assets/02.Scripts/Tycoon/LiquidController.cs @@ -5,6 +5,7 @@ using System.Linq; using BlueWater.Items; using BlueWater.Players.Tycoons; using BlueWater.Tycoons; +using BlueWater.Utility; using DG.Tweening; using Sirenix.OdinInspector; using TMPro; @@ -82,10 +83,13 @@ namespace BlueWater [Title("패널")] [SerializeField] - private float _moveDuration = 0.5f; - + private float _moveToPlayerDuration = 0.5f; + [SerializeField] - private Vector3 _endPosition = new(-300f, 0f, 0f); + private float _moveToCenterDuration = 0.2f; + + [SerializeField] + private Vector3 _centerPosition = new(-300f, 0f, 0f); [SerializeField] private Vector3 _endPositionOffset = new(0f, 20f, 0f); @@ -100,11 +104,10 @@ namespace BlueWater private List _activeGarnishDatas = new(); private Dictionary _liquidDataCounts = new(7); private Material _instanceMaterial; - private Tween _showTween; - private Tween _hideTween; private bool _isShowingPanel; private bool _isPouring; + private bool _isCompleted; private float _startTime = float.PositiveInfinity; private int _instanceLiquidCount; private float _currentLiquidAmount; @@ -115,6 +118,9 @@ namespace BlueWater private Camera _overlayCamera; private TycoonPlayer _tycoonPlayer; private Vector3 _lastPlayerPosition; + private Vector3 _originalPanelScale; + private Coroutine _movePanelToPlayerInstance; + private Coroutine _movePanelToCenterInstance; // Hashes private static readonly int LiquidAmountHash = Shader.PropertyToID("_LiquidAmount"); @@ -129,18 +135,12 @@ namespace BlueWater { _liquidObjectPool = new ObjectPool(CreateLiquidObject, OnGetLiquidObject, OnReleaseLiquidObject, OnDestroyLiquidObject, maxSize: _objectPoolCount); _garnishObjectPool = new ObjectPool(CreateGarnishObject, OnGetGarnishObject, OnReleaseGarnishObject, OnDestroyGarnishObject, maxSize: _objectPoolCount); - - _hideTween = _liquidPanel.transform.DOMoveX(_endPosition.x + 100f, _moveDuration).Pause() - .SetAutoKill(false); - - _showTween = _liquidPanel.transform.DOMoveX(_endPosition.x, _moveDuration).Pause() - .SetAutoKill(false); } private void Start() { - EventManager.OnLiquidRegionEntered += ShowPanel; - EventManager.OnLiquidRegionExited += HidePanel; + //EventManager.OnLiquidRegionEntered += ShowPanel; + //EventManager.OnLiquidRegionExited += HidePanel; EventManager.OnCocktailDiscarded += ReleaseAllObject; EventManager.OnPlaceOnServingTable += ReleaseAllObject; LiquidIngredient.OnReachedTarget += OnTargetReached; @@ -151,7 +151,8 @@ namespace BlueWater _tycoonPlayer = GameManager.Instance.CurrentTycoonPlayer; _instanceMaterial = Instantiate(_liquidRenderer.material); _liquidRenderer.material = _instanceMaterial; - + + _originalPanelScale = _liquidPanel.transform.localScale; _instanceMaterial.SetFloat(LiquidAmountHash, 0f); _timeInterval = 1f / _liquidsPerSecond; _shaker.SetActive(true); @@ -201,22 +202,22 @@ namespace BlueWater _startTime = Time.time; } } - else - { - if (_instanceLiquidCount <= 0) return; - - var playerPosition = _tycoonPlayer.transform.position; - var playerScreenPosition = TycoonCameraManager.Instance.MainCamera.WorldToScreenPoint(playerPosition); - var panelWorldPosition = _overlayCamera.ScreenToWorldPoint(new Vector3(playerScreenPosition.x, - playerScreenPosition.y, _overlayCamera.nearClipPlane)); - panelWorldPosition += _endPositionOffset; - - if (_activeLiquidDatas.Count == 0 && _activeGarnishDatas.Count == 0) - { - _liquidPanel.transform.DOScale(_endScale, _moveDuration).SetEase(Ease.Linear); - _liquidPanel.transform.DOMove(panelWorldPosition, _moveDuration).SetEase(Ease.Linear); - } - } + // else + // { + // if (_instanceLiquidCount <= 0) return; + // + // var playerPosition = _tycoonPlayer.transform.position; + // var playerScreenPosition = TycoonCameraManager.Instance.MainCamera.WorldToScreenPoint(playerPosition); + // var panelWorldPosition = _overlayCamera.ScreenToWorldPoint(new Vector3(playerScreenPosition.x, + // playerScreenPosition.y, _overlayCamera.nearClipPlane)); + // panelWorldPosition += _endPositionOffset; + // + // if (_activeLiquidDatas.Count == 0 && _activeGarnishDatas.Count == 0) + // { + // _liquidPanel.transform.DOScale(_endScale, _moveDuration).SetEase(Ease.Linear); + // _liquidPanel.transform.DOMove(panelWorldPosition, _moveDuration).SetEase(Ease.Linear); + // } + // } if (_liquidReachedTime + _colorLerpSpeed >= Time.time) { @@ -227,8 +228,8 @@ namespace BlueWater private void OnDestroy() { - EventManager.OnLiquidRegionEntered -= ShowPanel; - EventManager.OnLiquidRegionExited -= HidePanel; + //EventManager.OnLiquidRegionEntered -= ShowPanel; + //EventManager.OnLiquidRegionExited -= HidePanel; EventManager.OnCocktailDiscarded -= ReleaseAllObject; EventManager.OnPlaceOnServingTable -= ReleaseAllObject; @@ -315,6 +316,7 @@ namespace BlueWater } _liquidDataCounts.Clear(); + _isCompleted = false; _instanceLiquidCount = 0; _instanceMaterial.SetFloat(LiquidAmountHash, 0f); SetCurrentAmount(0f); @@ -326,11 +328,12 @@ namespace BlueWater _currentBarrel = barrel; if (_instanceLiquidCount == 0) { - ShowPanelFast(); + ShowPanelStarted(); _shaker.SetActive(true); _amountText.enabled = true; _completeCocktailImage.enabled = false; _completeText.enabled = false; + _isCompleted = false; _currentMixedColor = barrel.GetLiquidData().Color; _instanceMaterial.SetColor(LiquidColorHash, _currentMixedColor * _colorIntensity); EventManager.OnCocktailStarted?.Invoke(); @@ -338,37 +341,27 @@ namespace BlueWater _startTime = Time.time; _isPouring = true; + + // To Center 이동 코루틴이 활성화 중이지 않을 때 + if (_movePanelToCenterInstance == null) + { + // To Player 이동 코루틴이 활성화 중이라면 멈추고 To Center 활성화 + if (_movePanelToPlayerInstance != null) + { + StopCoroutine(_movePanelToPlayerInstance); + _movePanelToPlayerInstance = null; + } + Utils.StartUniqueCoroutine(this, ref _movePanelToCenterInstance, MovePanelToCenter()); + } } public void HandleBarrelCancelInteraction() { _isPouring = false; + + Utils.StartUniqueCoroutine(this, ref _movePanelToPlayerInstance, MovePanelToPlayer()); } - // public void ActiveIsPouring(Barrel barrel) - // { - // _currentBarrel = barrel; - // if (_instanceLiquidCount == 0) - // { - // ShowPanelFast(); - // _shaker.SetActive(true); - // _amountText.enabled = true; - // _completeCocktailImage.enabled = false; - // _completeText.enabled = false; - // _currentMixedColor = _currentBarrel.GetLiquidData().Color; - // _instanceMaterial.SetColor(LiquidColorHash, _currentMixedColor * _colorIntensity); - // EventManager.OnCocktailStarted?.Invoke(); - // } - // - // _startTime = Time.time; - // _isPouring = true; - // } - - // public void InActiveIsPouring() - // { - // _isPouring = false; - // } - private void SetCurrentAmount(float value) { _currentLiquidAmount = value; @@ -392,6 +385,7 @@ namespace BlueWater /// private IEnumerator CompleteCocktail() { + _isCompleted = true; HandleBarrelCancelInteraction(); yield return new WaitUntil(() => _currentLiquidAmount >= _maxLiquidCount); @@ -520,25 +514,82 @@ namespace BlueWater } } - public void ShowPanelFast() + public void ShowPanelStarted() { if (_isShowingPanel) return; - _liquidPanel.transform.localScale = Vector3.one; - _liquidPanel.transform.position = _endPosition; + _liquidPanel.transform.localScale = _originalPanelScale; + _liquidPanel.transform.position = _centerPosition; _liquidPanel.SetActive(true); _isShowingPanel = true; - _hideTween.Pause(); - _showTween.Pause(); } - public void ShowPanel() + private IEnumerator MovePanelToPlayer() { - if (_isShowingPanel || _instanceLiquidCount <= 0) return; + if (_isCompleted) + { + _movePanelToPlayerInstance = null; + yield break; + } + + yield return new WaitUntil(() => _activeLiquidDatas.Count == 0 && _activeGarnishDatas.Count == 0); + + var startScale = _liquidPanel.transform.localScale; + var startPosition = _liquidPanel.transform.position; + var elapsedTime = 0f; + while (elapsedTime <= _moveToPlayerDuration) + { + var playerPosition = _tycoonPlayer.transform.position; + var playerScreenPosition = TycoonCameraManager.Instance.MainCamera.WorldToScreenPoint(playerPosition); + var panelWorldPosition = _overlayCamera.ScreenToWorldPoint(new Vector3(playerScreenPosition.x, + playerScreenPosition.y, _overlayCamera.nearClipPlane)); + panelWorldPosition += _endPositionOffset; + + var lerpTime = elapsedTime / _moveToPlayerDuration; + _liquidPanel.transform.position = Vector3.Lerp(startPosition, panelWorldPosition, lerpTime); + _liquidPanel.transform.localScale = Vector3.Lerp(startScale, _endScale, lerpTime); + + elapsedTime += Time.deltaTime; + yield return null; + } + + _liquidPanel.transform.localScale = _endScale; + + // 완성되지 않았거나, 따르고 있지 않으면 플레이어를 추적함 + var waitTime = new WaitForFixedUpdate(); + while (!_isCompleted && !_isPouring) + { + var playerPosition = _tycoonPlayer.transform.position; + var playerScreenPosition = TycoonCameraManager.Instance.MainCamera.WorldToScreenPoint(playerPosition); + var panelWorldPosition = _overlayCamera.ScreenToWorldPoint(new Vector3(playerScreenPosition.x, + playerScreenPosition.y, _overlayCamera.nearClipPlane)); + panelWorldPosition += _endPositionOffset; + + _liquidPanel.transform.position = panelWorldPosition; + yield return waitTime; + } - _isShowingPanel = true; - _hideTween.Pause(); - _showTween.Restart(); + _movePanelToPlayerInstance = null; + } + + private IEnumerator MovePanelToCenter() + { + var startScale = _liquidPanel.transform.localScale; + var startPosition = _liquidPanel.transform.position; + var elapsedTime = 0f; + while (elapsedTime <= _moveToCenterDuration) + { + var lerpTime = elapsedTime / _moveToCenterDuration; + _liquidPanel.transform.position = Vector3.Lerp(startPosition, _centerPosition, lerpTime); + _liquidPanel.transform.localScale = Vector3.Lerp(startScale, _originalPanelScale, lerpTime); + + elapsedTime += Time.deltaTime; + yield return null; + } + + _liquidPanel.transform.position = _centerPosition; + _liquidPanel.transform.localScale = _originalPanelScale; + _movePanelToCenterInstance = null; } public void HidePanel() @@ -546,8 +597,7 @@ namespace BlueWater if (!_isShowingPanel) return; _isShowingPanel = false; - _showTween.Pause(); - _hideTween.Restart(); + _liquidPanel.SetActive(false); } #endregion diff --git a/Assets/02.Scripts/Tycoon/LiquidInteractionRegion.cs b/Assets/02.Scripts/Tycoon/LiquidInteractionRegion.cs index 7378568f0..05f8af251 100644 --- a/Assets/02.Scripts/Tycoon/LiquidInteractionRegion.cs +++ b/Assets/02.Scripts/Tycoon/LiquidInteractionRegion.cs @@ -1,41 +1,41 @@ -using System; -using BlueWater.Players.Tycoons; -using UnityEngine; - -namespace BlueWater -{ - public class LiquidInteractionRegion : MonoBehaviour - { - private TycoonPlayer _tycoonPlayer; - private bool _isEntered; - - private void Start() - { - _tycoonPlayer = GameManager.Instance.CurrentTycoonPlayer; - } - - private void Update() - { - if (!_isEntered) return; - - if (_tycoonPlayer.TycoonPickupHandler.IsPickedUpItem()) return; - - EventManager.OnLiquidRegionEntered?.Invoke(); - } - - private void OnTriggerEnter(Collider other) - { - if (!other.CompareTag("Player")) return; - - _isEntered = true; - } - - private void OnTriggerExit(Collider other) - { - if (!other.CompareTag("Player")) return; - - _isEntered = false; - EventManager.OnLiquidRegionExited?.Invoke(); - } - } -} +// using System; +// using BlueWater.Players.Tycoons; +// using UnityEngine; +// +// namespace BlueWater +// { +// public class LiquidInteractionRegion : MonoBehaviour +// { +// private TycoonPlayer _tycoonPlayer; +// private bool _isEntered; +// +// private void Start() +// { +// _tycoonPlayer = GameManager.Instance.CurrentTycoonPlayer; +// } +// +// private void Update() +// { +// if (!_isEntered) return; +// +// if (_tycoonPlayer.TycoonPickupHandler.IsPickedUpItem()) return; +// +// EventManager.OnLiquidRegionEntered?.Invoke(); +// } +// +// private void OnTriggerEnter(Collider other) +// { +// if (!other.CompareTag("Player")) return; +// +// _isEntered = true; +// } +// +// private void OnTriggerExit(Collider other) +// { +// if (!other.CompareTag("Player")) return; +// +// _isEntered = false; +// EventManager.OnLiquidRegionExited?.Invoke(); +// } +// } +// } diff --git a/Assets/05.Prefabs/Characters/Players/TycoonPlayer.prefab b/Assets/05.Prefabs/Characters/Players/TycoonPlayer.prefab index 624e02c58..a44c6a1c2 100644 --- a/Assets/05.Prefabs/Characters/Players/TycoonPlayer.prefab +++ b/Assets/05.Prefabs/Characters/Players/TycoonPlayer.prefab @@ -676,6 +676,10 @@ PrefabInstance: propertyPath: m_LocalEulerAnglesHint.z value: 0 objectReference: {fileID: 0} + - target: {fileID: 5297442833789713246, guid: a6a0d1675321b7a43b4132ca15cf7ca0, type: 3} + propertyPath: m_SortingOrder + value: 6 + objectReference: {fileID: 0} - target: {fileID: 5611097802189151736, guid: a6a0d1675321b7a43b4132ca15cf7ca0, type: 3} propertyPath: m_Name value: InteractionCanvas diff --git a/Assets/09.Shaders/LiquidRenderTexture.shadergraph b/Assets/09.Shaders/LiquidRenderTexture.shadergraph index c783d8139..813528cc7 100644 --- a/Assets/09.Shaders/LiquidRenderTexture.shadergraph +++ b/Assets/09.Shaders/LiquidRenderTexture.shadergraph @@ -327,20 +327,6 @@ "m_SlotId": 0 } }, - { - "m_OutputSlot": { - "m_Node": { - "m_Id": "9305fd09fafc42488b36734a733d4e6a" - }, - "m_SlotId": 4 - }, - "m_InputSlot": { - "m_Node": { - "m_Id": "d7ae6f9dead049e1b58ece60b1867ee6" - }, - "m_SlotId": 0 - } - }, { "m_OutputSlot": { "m_Node": { @@ -593,6 +579,20 @@ "m_SlotId": 1 } }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "f207d005495148b0a7fb864588751ee2" + }, + "m_SlotId": 7 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "d7ae6f9dead049e1b58ece60b1867ee6" + }, + "m_SlotId": 0 + } + }, { "m_OutputSlot": { "m_Node": {