diff --git a/popcorn/Assets/MyGame/Scenes/Main/Scripts/BulkOrderAchievedEffect.cs b/popcorn/Assets/MyGame/Scenes/Main/Scripts/BulkOrderAchievedEffect.cs index aa8a6a2e..31a63164 100644 --- a/popcorn/Assets/MyGame/Scenes/Main/Scripts/BulkOrderAchievedEffect.cs +++ b/popcorn/Assets/MyGame/Scenes/Main/Scripts/BulkOrderAchievedEffect.cs @@ -16,7 +16,6 @@ namespace MyGame.Scenes.Main.Scripts [SerializeField] private int heartCount = 5; [SerializeField] private float minCurve = 100f; [SerializeField] private float maxCurve = 400f; - [SerializeField] private float waitTime = .3f; [SerializeField] private float curveTime = .5f; [SerializeField] private float linerTime = .5f; private readonly Subject effectCompleteSubject = new Subject(); @@ -39,7 +38,10 @@ namespace MyGame.Scenes.Main.Scripts { var coin = Instantiate(coinPrefab, beginPos, Quaternion.identity, transform); coin.GetComponent()?.Play("BulkOrde_EarnedCoins"); - Effect(coin, goalPos, () => effectCompleteSubject.OnNext(Unit.Default)); + Observable.NextFrame().Subscribe(_ => + { + Effect(coin, goalPos, () => effectCompleteSubject.OnNext(Unit.Default)); + }).AddTo(this); }); } } @@ -48,8 +50,8 @@ namespace MyGame.Scenes.Main.Scripts { // 最後のeffect終了時か、このオブジェクトが破棄された時に1度だけonCompleteが実行される effectCompleteSubject.Take(heartCount).Last() - .Amb(this.OnDestroyAsObservable()) - .Subscribe(_ => { }, () => + .Amb(this.OnDestroyAsObservable()) + .Subscribe(_ => { }, () => { onComplete?.Invoke(); }); @@ -65,12 +67,19 @@ namespace MyGame.Scenes.Main.Scripts private void Effect(Transform target, Vector3 goalPos, Action onComplete = null) { - // localPosじゃなくて worldでやりたい var animator = target.GetComponent(); + var nameHash = animator.GetCurrentAnimatorStateInfo(0).shortNameHash; + var clip = animator.GetCurrentAnimatorClipInfo(0)[0].clip; + var beginDuration = 37 / clip.frameRate; + var beginNormalizedTime = beginDuration / clip.length; + var endNormalizedTime = 52 / clip.frameRate / clip.length; + var endDuration = (1 - endNormalizedTime) * clip.length; + var direction = Random.value <= .5f ? -1 : 1; var depth = Random.Range(minCurve, maxCurve); - this.CallWaitForSeconds(waitTime, () => + this.CallWaitForSeconds(beginDuration, () => { + animator.Play(nameHash, 0, beginNormalizedTime); animator.speed = 0f; var initPos = target.localPosition; this.CallLerp(curveTime, f => @@ -79,15 +88,19 @@ namespace MyGame.Scenes.Main.Scripts target.localPosition = initPos + new Vector3(f * direction * depth, x * x * depth - depth); }, () => { + var pos = target.position; this.CallLerp(linerTime, f => { - var pos = target.position; target.position = Vector2.Lerp(pos, goalPos, f); }, () => { animator.speed = 1f; - onComplete?.Invoke(); - Destroy(target.gameObject, 5f); + animator.Play(nameHash, 0, endNormalizedTime); + this.CallWaitForSeconds(endDuration, () => + { + onComplete?.Invoke(); + Destroy(target.gameObject); + }); }); }); });