diff --git a/popcorn/Assets/MyGame/Scenes/MiniGame/MiniGame.unity b/popcorn/Assets/MyGame/Scenes/MiniGame/MiniGame.unity index cc9ea30c..a712f0c2 100644 --- a/popcorn/Assets/MyGame/Scenes/MiniGame/MiniGame.unity +++ b/popcorn/Assets/MyGame/Scenes/MiniGame/MiniGame.unity @@ -1023,6 +1023,21 @@ PrefabInstance: propertyPath: fallAcceleration value: 30 objectReference: {fileID: 0} + - target: {fileID: 2607884839347368726, guid: acd6e6365b5fe4863aedc684a50b8028, + type: 3} + propertyPath: hardSpeedMultiply + value: 1.5 + objectReference: {fileID: 0} + - target: {fileID: 2607884839347368726, guid: acd6e6365b5fe4863aedc684a50b8028, + type: 3} + propertyPath: extraSpeedMultiply + value: 2 + objectReference: {fileID: 0} + - target: {fileID: 2607884839347368726, guid: acd6e6365b5fe4863aedc684a50b8028, + type: 3} + propertyPath: normalSpeedMultiply + value: 1 + objectReference: {fileID: 0} - target: {fileID: 2607884839347368726, guid: acd6e6365b5fe4863aedc684a50b8028, type: 3} propertyPath: hitAnimationCurve.m_PostInfinity @@ -1434,7 +1449,7 @@ MonoBehaviour: - {fileID: 2044773546} - {fileID: 184442867} - {fileID: 628830308} - bgWidth: 17.66 + bgWidth: 17.6 bgOffset: 0 holeWidth: 0 --- !u!114 &1657044091 diff --git a/popcorn/Assets/MyGame/Scenes/MiniGame/Scripts/GameManager.cs b/popcorn/Assets/MyGame/Scenes/MiniGame/Scripts/GameManager.cs index 9c1f2fee..25a0dabf 100644 --- a/popcorn/Assets/MyGame/Scenes/MiniGame/Scripts/GameManager.cs +++ b/popcorn/Assets/MyGame/Scenes/MiniGame/Scripts/GameManager.cs @@ -211,6 +211,7 @@ namespace MyGame.Scenes.MiniGame.Scripts stageManager.Difficulty.SkipLatestValueOnSubscribe().Subscribe(x => { bgManager.SetSky(x); + player.SetSpeed(x); }).AddTo(this); player.OnHitItem.Where(_ => state.Value == GameState.Play).Subscribe(x => diff --git a/popcorn/Assets/MyGame/Scenes/MiniGame/Scripts/Player.cs b/popcorn/Assets/MyGame/Scenes/MiniGame/Scripts/Player.cs index 7082bb63..5ab9b27b 100644 --- a/popcorn/Assets/MyGame/Scenes/MiniGame/Scripts/Player.cs +++ b/popcorn/Assets/MyGame/Scenes/MiniGame/Scripts/Player.cs @@ -8,6 +8,9 @@ namespace MyGame.Scenes.MiniGame.Scripts public class Player : MonoBehaviour { [SerializeField] private float speed = 5f; + [SerializeField] private float normalSpeedMultiply; + [SerializeField] private float hardSpeedMultiply; + [SerializeField] private float extraSpeedMultiply; [SerializeField] private float hitJumpTime = 1f; [SerializeField] private float hitTime = 1.5f; [SerializeField] private float hitWaitTime = 1f; @@ -35,6 +38,7 @@ namespace MyGame.Scenes.MiniGame.Scripts private bool isWall; private bool isResult; private float currentFallSpeed; + private float currentSpeedMultiply; public bool IsHit => isHit; private readonly CompositeDisposable jumpCompositeDisposable = new CompositeDisposable(); private readonly CompositeDisposable hitCompositeDisposable = new CompositeDisposable(); @@ -70,6 +74,7 @@ namespace MyGame.Scenes.MiniGame.Scripts isHole = false; isWall = false; isResult = false; + currentSpeedMultiply = 1f; } private void Stay(bool force = false) @@ -87,7 +92,7 @@ namespace MyGame.Scenes.MiniGame.Scripts { return; } - transform.AddPositionX(speed * Time.deltaTime); + transform.AddPositionX(speed * Time.deltaTime * currentSpeedMultiply); if (isJump || isHit || isFall) { return; @@ -108,7 +113,8 @@ namespace MyGame.Scenes.MiniGame.Scripts isFall = false; var lastFrame = jumpAnimationCurve[jumpAnimationCurve.length - 1]; // 最高点までのジャンプ - var jumpCoroutine = MonoBehaviourExtensions.DoCallLerp(lastFrame.time, t => + var jumpTime = lastFrame.time / currentSpeedMultiply; + var jumpCoroutine = MonoBehaviourExtensions.DoCallLerp(jumpTime, t => { transform.SetLocalPositionY(basePos.y + jumpAnimationCurve.Evaluate(t * lastFrame.time)); }, () => @@ -118,7 +124,7 @@ namespace MyGame.Scenes.MiniGame.Scripts isFall = true; }); // 通常落下 - var jumpFallCoroutine = MonoBehaviourExtensions.DoCallLerp(lastFrame.time, t => + var jumpFallCoroutine = MonoBehaviourExtensions.DoCallLerp(jumpTime, t => { transform.SetLocalPositionY(basePos.y + jumpAnimationCurve.Evaluate((t + 1) * lastFrame.time)); }, () => @@ -159,10 +165,10 @@ namespace MyGame.Scenes.MiniGame.Scripts else { animator.Play("Brother_pink_Glideing_Cancel"); - currentFallSpeed -= fallAcceleration * Time.deltaTime; + currentFallSpeed -= fallAcceleration * Time.deltaTime * currentSpeedMultiply; } - transform.AddLocalPositionY(currentFallSpeed * Time.deltaTime); + transform.AddLocalPositionY(currentFallSpeed * Time.deltaTime * currentSpeedMultiply); }, () => { currentFallSpeed = 0f; @@ -201,40 +207,34 @@ namespace MyGame.Scenes.MiniGame.Scripts // 落下時間不定によりアニメ再生停止 animator.speed = 0f; currentFallSpeed = 0f; - this.UpdateAsObservable() - .TakeWhile(_ => transform.localPosition.y > basePos.y) - .Subscribe(_ => + FallDown(basePos.y, () => + { + // 31フレームまでが落下32からズサー + animator?.PlayInFixedTime("Brother_pink_FallDown", 0, .5f); + animator.speed = currentSpeedMultiply; + transform.SetLocalPositionY(groundPos); + currentFallSpeed = 0f; + isJump = false; + isFall = false; + Observable.Timer(TimeSpan.FromSeconds(hitTime)).Subscribe(_ => { }, () => { - currentFallSpeed -= fallAcceleration * Time.deltaTime; - transform.AddLocalPositionY(currentFallSpeed * Time.deltaTime); - }, () => - { - // 31フレームまでが落下32からズサー - animator?.PlayInFixedTime("Brother_pink_FallDown", 0, .5f); - animator.speed = 1f; - transform.SetLocalPositionY(groundPos); - currentFallSpeed = 0f; - isJump = false; - isFall = false; - Observable.Timer(TimeSpan.FromSeconds(hitTime)).Subscribe(_ => { }, () => + isHitStay = true; + Observable.Timer(TimeSpan.FromSeconds(hitWaitTime)).Subscribe(_ => { }, () => { - isHitStay = true; - Observable.Timer(TimeSpan.FromSeconds(hitWaitTime)).Subscribe(_ => { }, () => + // 入れ子対策するならコルーチンにして工程ごとに分けてSelectManyするのがよい。 + isHit = false; + isHitStay = false; + if (isResult) { - // 入れ子対策するならコルーチンにして工程ごとに分けてSelectManyするのがよい。 - isHit = false; - isHitStay = false; - if (isResult) - { - Result(); - } - else - { - Stay(); - } - }).AddTo(hitCompositeDisposable); + Result(); + } + else + { + Stay(); + } }).AddTo(hitCompositeDisposable); }).AddTo(hitCompositeDisposable); + }).AddTo(jumpCompositeDisposable); }).AddTo(hitCompositeDisposable); } @@ -249,21 +249,26 @@ namespace MyGame.Scenes.MiniGame.Scripts hitCompositeDisposable.Clear(); jumpCompositeDisposable.Clear(); - this.UpdateAsObservable() - .TakeWhile(_ => transform.localPosition.y > fallLimit) + FallDown(fallLimit, () => + { + isFall = false; + currentFallSpeed = 0f; + if (isResult) + { + Result(); + } + }).AddTo(jumpCompositeDisposable); + } + + private IDisposable FallDown(float baseYPos, Action onComplete) + { + return this.UpdateAsObservable() + .TakeWhile(_ => transform.localPosition.y > baseYPos) .Subscribe(_ => { - currentFallSpeed -= fallAcceleration * Time.deltaTime; - transform.AddLocalPositionY(currentFallSpeed * Time.deltaTime); - }, () => - { - isFall = false; - currentFallSpeed = 0f; - if (isResult) - { - Result(); - } - }).AddTo(jumpCompositeDisposable); + currentFallSpeed -= fallAcceleration * Time.deltaTime * currentSpeedMultiply; + transform.AddLocalPositionY(currentFallSpeed * Time.deltaTime * currentSpeedMultiply); + }, onComplete); } public void Wall() @@ -271,6 +276,18 @@ namespace MyGame.Scenes.MiniGame.Scripts isWall = true; } + public void SetSpeed(ScrollGameDifficulty difficulty) + { + currentSpeedMultiply = difficulty switch + { + ScrollGameDifficulty.Easy => 1f, + ScrollGameDifficulty.Normal => normalSpeedMultiply, + ScrollGameDifficulty.Hard => hardSpeedMultiply, + ScrollGameDifficulty.Extra => extraSpeedMultiply, + _ => throw new ArgumentOutOfRangeException(nameof(difficulty), difficulty, null) + }; + } + public void Result() { if (isJump || isHit || isFall)