using System; using System.Collections; using DG.Tweening; using Sirenix.OdinInspector; using UnityEngine; namespace BlueWater.Tycoons { [Serializable] public class RewardBox : InteractionFurniture { [SerializeField] private AnimationController _animationController; [Title("구매 불가능 연출")] [SerializeField] private float _shakeDuration = 0.3f; [SerializeField] private Vector3 _shakePosition = new(0.05f, 0f, 0f); [SerializeField] private int _vibrato = 30; [SerializeField] private Ease _ease = Ease.OutQuad; private Tween _unavailablePurchaseTween; private RewardBoxType _rewardBoxType; private int _requiredGold; private bool _isInteracting; protected override void Start() { base.Start(); _unavailablePurchaseTween = VisualLook.transform.DOShakePosition(_shakeDuration, _shakePosition, _vibrato).SetEase(_ease).SetAutoKill(false).Pause(); } private void OnDestroy() { _unavailablePurchaseTween.Kill(); } public void Initialize(LevelData levelData) { _rewardBoxType = levelData.RewardBoxType; _requiredGold = levelData.RewardBoxPrice; InteractionCanvas.UnlockUi.Initialize(DataManager.Instance.SpriteDataSo.Gold02, _requiredGold); } public override void Interaction() { if (_isInteracting) return; if (TycoonManager.Instance.TycoonStatus.CurrentGold < _requiredGold) { _unavailablePurchaseTween.Restart(); return; } StartCoroutine(nameof(OpenRewardBoxCoroutine)); } public override void CancelInteraction() { } private IEnumerator OpenRewardBoxCoroutine() { _isInteracting = true; _animationController.SetAnimationParameter("isOpened", true); var animationStarted = false; yield return StartCoroutine(_animationController.WaitForAnimationToRun("Open", success => animationStarted = success)); if (!animationStarted) { Destroy(gameObject); yield break; } yield return new WaitUntil(() => _animationController.GetCurrentAnimationNormalizedTime() >= 1f); EventManager.InvokeAddedGold(-_requiredGold, false); switch (_rewardBoxType) { case RewardBoxType.Normal: EventManager.InvokeOpenedNormalRewardBox(); break; case RewardBoxType.Rare: EventManager.InvokeOpenedRareRewardBox(); break; default: throw new ArgumentOutOfRangeException(); } Destroy(gameObject); } } }