第一章 操作感No.003
可変ジャンプ
Variable Jump Height別名 長押しジャンプ、小ジャンプと大ジャンプ、押す長さで高さが変わるジャンプ
概要
ジャンプボタンを押す長さで跳ぶ高さを変える仕組み。短く押せば低く、長く押せば高く跳ぶ。高さが一定だと、低い天井の下や小さな段差の前で小さく跳びたいのに跳びすぎてしまう。
使われる場面
- 低い天井や頭上の障害物の下
- 天井の下にある段差や敵を越えるとき、高く跳ぶと頭をぶつける。短く押して低く跳べば、天井に触れずに越えられる。
- 高さの違う足場を渡る場面
- 近くの低い足場へは短く、高い足場へは長く押して跳び分ける。高く跳ぶほど空中にいる時間が長くなり横にも遠くまで進むので、高さが一定だと近くの低い足場を跳び越してしまうことがある。
- 小さな敵や穴を続けて越える場面
- 小さく跳べば早く着地するので、次の敵や穴に備える時間が残る。高さが一定だと、毎回最高の高さまで跳んで降りてくるまで待つことになる。
判断基準
| こういうとき | こうする |
|---|---|
| 小さく跳びたい場面があるのにいつも同じ高さまで跳んでしまう | 可変ジャンプを入れる。上がっている途中でボタンを離したら、上向きの速さに 0.3〜0.5 倍ほどを掛けて削る。 |
| 短く押しても長く押しても、高さがあまり変わらない | 離したときに残す速さの割合が大きすぎる。0.5 倍より大きければ、0.3〜0.5 倍に下げる。上昇が速すぎて離すのが間に合っていないこともある。そのときは跳ぶ速さと重力をともに下げ、最高の高さを保ったまま上昇を遅くする。 |
| 軽く押しただけなのにほとんど跳ばない | 押す長さの下限を決め、どれだけ短く押しても 2〜5 フレームは押したものとして扱う。残す速さの割合が小さいほど、下限がないときの高さは低くなる。 |
| ジャンプの途中で急に止まって落ちる | 残す速さの割合が 0 に近すぎる。割合を上げるか、押しているあいだだけ重力を弱める方式に変える。 |
| 落ちている途中でボタンを離すと、落ちるのが遅くなる | 落ちている速さにも割合を掛けている。削るのは自分で跳んで上がっているあいだだけにする。 |
| ばねで跳ね上がったとき、ボタンを押していないと低くしか上がらない | 跳ね上がりの速さも削っている。跳ね上がる高さを一定にしたいなら、削るのは自分で跳んだジャンプだけにする。 |
遊んでこう感じたら
指示の例
低い天井の下で小さく跳びたいのにいつも同じ高さまで跳んでしまう。可変ジャンプにして、上がっている途中でジャンプボタンを離したら上向きの速さを 0.4 倍に落として
ちょんと押したときにほとんど跳ばない。可変ジャンプに押す長さの下限を付けて、どれだけ短く押しても 3 フレームは押したものとして扱って
短く押しても長く押しても、高さがあまり変わらない。可変ジャンプで離したときに残す上向きの速さを今の半分くらいに下げて
ジャンプボタンを離すと、空中で急に止まって落ちる。可変ジャンプで離したときに残す上向きの速さを 0 倍から 0.4 倍くらいに上げて
ばねで跳ね上がったとき、ジャンプボタンを押していないと低くしか上がらない。可変ジャンプで速さを削るのは自分で跳んだジャンプだけにして
詳細
押す長さで高さを変える理由
ジャンプの高さが一つしかないと、プレイヤーが選べるのは跳ぶか跳ばないかだけになる。低い天井の下にある段差を越えるときも、足元の小さな敵を越えるときも、毎回同じ最高の高さまで跳ぶ。天井が低ければ頭をぶつけ、そうでなくても高く跳んだ分だけ着地までに時間がかかる。デモの平らな床で比べると、最高の高さまで跳んだときは着地まで 0.70 秒かかり、5 フレーム押した低いジャンプは 0.43 秒で着地する。
そこで、ボタンを押している長さで跳ぶ高さを変える。短く押せば低く、長く押せば高く跳ぶこの仕組みを可変ジャンプと呼ぶ。ボタンを増やさずに、跳ぶ高さをプレイヤーが選べるようになる。
離したときに速さを削る方式
デモの下の段では、跳んだ瞬間に最高の高さまで届く上向きの速さを与える。上がっている途中でボタンを離したら、そのときの上向きの速さに 0〜1 の残す速さの割合を掛けて削る。割合が 0 なら離した瞬間に上昇が止まり、1 なら削らないので高さ一定と変わらない。頂点に達するまで押し続ければ、削る前に上昇が終わるので、高さ一定のジャンプと同じ最高の高さまで跳ぶ。デモでは 21 フレーム(0.35 秒)押し続ければ最高の高さ(背丈の 2.4 倍)に届く。
// 1 ステップごとに。速さは上向きを正とする
if (jumpPressed && grounded) {
velocityY = jumpSpeed;
rising = true; // 自分で跳んで、上がっている途中
}
if (rising && !jumpHeld) {
velocityY *= cutRatio; // 離したら、上向きの速さを削る
rising = false;
}
velocityY -= gravity * dt;
if (velocityY <= 0) rising = false; // 頂点を過ぎたら、もう削らない
削るのは自分で跳んで上がっているあいだだけにする。落ちている速さにも割合を掛けると、落ちている途中で離したときに落ちるのが遅くなる。ばねで跳ね上がったときにも削ると、ボタンを押していなければ跳ね上がる高さが低くなる。
押しているあいだだけ重力を弱める方式
もう一つの作り方では、上がっている途中でボタンを押しているあいだだけ重力を弱くする。離すと重力がふだんの強さに戻り、上昇が早く止まる。
二つの方式の違いは離したときの動きに現れる。速さを削る方式では、離した瞬間に上向きの速さが一気に落ちるので、軌跡に折れ目ができる。デモで残す速さを 0 倍にすると、離した位置で上昇が止まり、空中で急に止まってから落ちるように見える。重力を変える方式では、離しても速さは一気には変わらない。上がる勢いが早めに弱まるだけなので、軌跡は折れずに曲がる。
短く押したときの最低の高さ
速さを削る方式では、押す長さが短いほど低く跳ぶ。ちょんと押したときは跳んだ直後に速さが削られるので、ほとんど地面を離れない。デモで残す速さを 0 倍、押す長さの下限を 0 フレームにすると、1 フレームだけ押したときの高さは背丈の 0.2 倍になる。プレイヤーには、ボタンを押したのにジャンプしなかったように見えることがある。
これを防ぐには、どれだけ短く押しても最低これだけは跳ぶという高さを決めておく。デモでは押す長さの下限を決め、下限より早く離したときも下限の長さだけ押したものとして扱う。跳んでからのフレーム数を数え、下限に届くまでは離していても削らずに待つ。下限を 3 フレームにすると、1 フレームだけ押しても 3 フレーム押したときと同じ高さまで跳ぶ。デモの既定値(残す速さ 0.4 倍、下限 3 フレーム)では、1 フレームだけ押しても背丈の 0.9 倍まで跳び、天井の下の低い段差を越えられる。下限を 0 にすると背丈の 0.6 倍までしか上がらず、段差に引っかかる。
最低の高さは「先行入力」と組み合わせたときにも効く。着地の前に押したジャンプを着地したときに跳ばせる場合、着地より前にボタンを離していると、跳んだ直後に速さが削られる。下限がなければ、先行入力で跳んだジャンプはちょんと押したときと同じ低いジャンプになる。
割合と下限の目安
残す速さの割合は 0.3〜0.5 倍ほどから試す。割合を大きくするほど、短く押しても高く跳び、長く押したときとの差が小さくなる。デモで 0.7 倍にすると、5 フレーム押したときの高さが背丈の 1.2 倍から 1.7 倍に上がり、天井のとげにぶつかる。割合を小さくするほど、離したときの止まり方が急になる。
押す長さの下限は 2〜5 フレーム(毎秒 60 回の更新で 0.03〜0.08 秒)ほどにする。下限を長くするほど、ちょんと押したときも高く跳ぶが、低く跳べる幅は狭まる。デモで下限を 8 フレームにすると、5 フレーム押しても 8 フレーム押したときと同じ背丈の 1.6 倍まで跳ぶ。
押す長さで高さを選べるのは跳んでから頂点に達するまでのあいだだけである。上昇にかかる時間が短いジャンプほど、高さを選べる押す長さの幅が狭くなり、低く跳ぶには素早く離さなければならない。最高の高さを保ったまま上昇を遅くするには、跳ぶ速さと重力をともに下げる。跳ぶ速さを 0.8 倍にするなら、重力を 0.64 倍にすると最高の高さは変わらず、頂点に達するまでの時間は 1.25 倍になる。