スピードアップ対応

This commit is contained in:
kimura 2022-07-25 14:35:29 +09:00
parent 77b443f8e8
commit 0e4891a2d9
3 changed files with 81 additions and 48 deletions

View File

@ -1023,6 +1023,21 @@ PrefabInstance:
propertyPath: fallAcceleration propertyPath: fallAcceleration
value: 30 value: 30
objectReference: {fileID: 0} 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, - target: {fileID: 2607884839347368726, guid: acd6e6365b5fe4863aedc684a50b8028,
type: 3} type: 3}
propertyPath: hitAnimationCurve.m_PostInfinity propertyPath: hitAnimationCurve.m_PostInfinity
@ -1434,7 +1449,7 @@ MonoBehaviour:
- {fileID: 2044773546} - {fileID: 2044773546}
- {fileID: 184442867} - {fileID: 184442867}
- {fileID: 628830308} - {fileID: 628830308}
bgWidth: 17.66 bgWidth: 17.6
bgOffset: 0 bgOffset: 0
holeWidth: 0 holeWidth: 0
--- !u!114 &1657044091 --- !u!114 &1657044091

View File

@ -211,6 +211,7 @@ namespace MyGame.Scenes.MiniGame.Scripts
stageManager.Difficulty.SkipLatestValueOnSubscribe().Subscribe(x => stageManager.Difficulty.SkipLatestValueOnSubscribe().Subscribe(x =>
{ {
bgManager.SetSky(x); bgManager.SetSky(x);
player.SetSpeed(x);
}).AddTo(this); }).AddTo(this);
player.OnHitItem.Where(_ => state.Value == GameState.Play).Subscribe(x => player.OnHitItem.Where(_ => state.Value == GameState.Play).Subscribe(x =>

View File

@ -8,6 +8,9 @@ namespace MyGame.Scenes.MiniGame.Scripts
public class Player : MonoBehaviour public class Player : MonoBehaviour
{ {
[SerializeField] private float speed = 5f; [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 hitJumpTime = 1f;
[SerializeField] private float hitTime = 1.5f; [SerializeField] private float hitTime = 1.5f;
[SerializeField] private float hitWaitTime = 1f; [SerializeField] private float hitWaitTime = 1f;
@ -35,6 +38,7 @@ namespace MyGame.Scenes.MiniGame.Scripts
private bool isWall; private bool isWall;
private bool isResult; private bool isResult;
private float currentFallSpeed; private float currentFallSpeed;
private float currentSpeedMultiply;
public bool IsHit => isHit; public bool IsHit => isHit;
private readonly CompositeDisposable jumpCompositeDisposable = new CompositeDisposable(); private readonly CompositeDisposable jumpCompositeDisposable = new CompositeDisposable();
private readonly CompositeDisposable hitCompositeDisposable = new CompositeDisposable(); private readonly CompositeDisposable hitCompositeDisposable = new CompositeDisposable();
@ -70,6 +74,7 @@ namespace MyGame.Scenes.MiniGame.Scripts
isHole = false; isHole = false;
isWall = false; isWall = false;
isResult = false; isResult = false;
currentSpeedMultiply = 1f;
} }
private void Stay(bool force = false) private void Stay(bool force = false)
@ -87,7 +92,7 @@ namespace MyGame.Scenes.MiniGame.Scripts
{ {
return; return;
} }
transform.AddPositionX(speed * Time.deltaTime); transform.AddPositionX(speed * Time.deltaTime * currentSpeedMultiply);
if (isJump || isHit || isFall) if (isJump || isHit || isFall)
{ {
return; return;
@ -108,7 +113,8 @@ namespace MyGame.Scenes.MiniGame.Scripts
isFall = false; isFall = false;
var lastFrame = jumpAnimationCurve[jumpAnimationCurve.length - 1]; 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)); transform.SetLocalPositionY(basePos.y + jumpAnimationCurve.Evaluate(t * lastFrame.time));
}, () => }, () =>
@ -118,7 +124,7 @@ namespace MyGame.Scenes.MiniGame.Scripts
isFall = true; 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)); transform.SetLocalPositionY(basePos.y + jumpAnimationCurve.Evaluate((t + 1) * lastFrame.time));
}, () => }, () =>
@ -159,10 +165,10 @@ namespace MyGame.Scenes.MiniGame.Scripts
else else
{ {
animator.Play("Brother_pink_Glideing_Cancel"); 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; currentFallSpeed = 0f;
@ -201,40 +207,34 @@ namespace MyGame.Scenes.MiniGame.Scripts
// 落下時間不定によりアニメ再生停止 // 落下時間不定によりアニメ再生停止
animator.speed = 0f; animator.speed = 0f;
currentFallSpeed = 0f; currentFallSpeed = 0f;
this.UpdateAsObservable() FallDown(basePos.y, () =>
.TakeWhile(_ => transform.localPosition.y > basePos.y) {
.Subscribe(_ => // 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; isHitStay = true;
transform.AddLocalPositionY(currentFallSpeed * Time.deltaTime); Observable.Timer(TimeSpan.FromSeconds(hitWaitTime)).Subscribe(_ => { }, () =>
}, () =>
{
// 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; // 入れ子対策するならコルーチンにして工程ごとに分けてSelectManyするのがよい。
Observable.Timer(TimeSpan.FromSeconds(hitWaitTime)).Subscribe(_ => { }, () => isHit = false;
isHitStay = false;
if (isResult)
{ {
// 入れ子対策するならコルーチンにして工程ごとに分けてSelectManyするのがよい。 Result();
isHit = false; }
isHitStay = false; else
if (isResult) {
{ Stay();
Result(); }
}
else
{
Stay();
}
}).AddTo(hitCompositeDisposable);
}).AddTo(hitCompositeDisposable); }).AddTo(hitCompositeDisposable);
}).AddTo(hitCompositeDisposable); }).AddTo(hitCompositeDisposable);
}).AddTo(jumpCompositeDisposable);
}).AddTo(hitCompositeDisposable); }).AddTo(hitCompositeDisposable);
} }
@ -249,21 +249,26 @@ namespace MyGame.Scenes.MiniGame.Scripts
hitCompositeDisposable.Clear(); hitCompositeDisposable.Clear();
jumpCompositeDisposable.Clear(); jumpCompositeDisposable.Clear();
this.UpdateAsObservable() FallDown(fallLimit, () =>
.TakeWhile(_ => transform.localPosition.y > 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(_ => .Subscribe(_ =>
{ {
currentFallSpeed -= fallAcceleration * Time.deltaTime; currentFallSpeed -= fallAcceleration * Time.deltaTime * currentSpeedMultiply;
transform.AddLocalPositionY(currentFallSpeed * Time.deltaTime); transform.AddLocalPositionY(currentFallSpeed * Time.deltaTime * currentSpeedMultiply);
}, () => }, onComplete);
{
isFall = false;
currentFallSpeed = 0f;
if (isResult)
{
Result();
}
}).AddTo(jumpCompositeDisposable);
} }
public void Wall() public void Wall()
@ -271,6 +276,18 @@ namespace MyGame.Scenes.MiniGame.Scripts
isWall = true; 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() public void Result()
{ {
if (isJump || isHit || isFall) if (isJump || isHit || isFall)