【特別編 #19】3Dゲームで自然なジャンプの作り方

【特別編 #19】3Dゲームで自然なジャンプの作り方
ok-scratch
3Dゲームでタテの動きを作れたから、今度は応用してジャンプも実装してみたい。ジャンプできたらゲーム性がグッと高まって、いろいろなアイデアが湧いてくるよ!
スターター
プロジェクト
なし
難しさ

任意)自分の作業中のスクラッチ作品URLを記録しておこう!再開するときに便利だよ。

LOADING...

※ この記録は今使ってるPCに保存されます。別のPCで作業するときは表示されません。

スクラッチに挑戦している皆さん、どうも!スクラッチコーチです。

この回では、オンライン化とモバイル化をする前の状態の作品を改造していきます。ただ、オンライン化とモバイル化がしてあっても問題ありません。

さぁ、お待ちかねの3Dゲームにおけるジャンプ処理を実装していくぞ!これは多くの人からチュートリアルやってほしいという声をもらった人気の機能だ。

今回の目標

ジャンプ!とにかくジャンプする。Flyフライ highハイ

マウスの動きを反映するところを一時的に停止しておく

ジャンプを実装するのにマウスの動きがないほうが分かりやすいから、前回、前々回と作ってきたマウスで振り向いたり視線を上下する処理を、いったん停止しておく。

いったん停止しておきたいときに、スクラッチでどうやって実装しておくか、グリフパッチ流の方法を伝授いたすよ。

ではプレイヤーをひらこう。

定義「_マウスの動きを反映する」をつくる

定義「_プレイヤーティック」に配置した上から3つのブロックを、新定義「_マウスの動きを反映する」に移そう。

↓こんなかんじになるよ。

いったんマウスの動きを停止させる

定義「_プレイヤーティック」に「もしーでなければ」ブロックを置こう。

上にマウスの定義、下には★カメラYをゼロにするブロックを置こう。

ok-scratch ok-scratch

条件式はこのままでOK!なにもいれなければ、この条件ブロックは絶対に「でなければ」の方を実行するんだ。こうしておけば明らかにおかしいから、いったん停止させているって分かりやすい。外すだけでもいいんだけど、ふとした拍子に消しちゃったり、「きれいにする」を選んでどこかにいってしまったりするから、こうしておくほうが安全に処理を退避たいひできるんだ。

変数「プレイヤーZ」を作る

さぁ、今回の主役である変数「プレイヤーZ」をつくろう。

スプライト「ペン」を開くよ。

変数を作る。

デバッグ用の表示はスライダーにしておくと便利。

定義「_行を描画する」を改修する

この定義を見つけてね。

プレイヤーZを使って演算を組むところから始めようか。

プレイヤーZを使った演算を用意する

下のスクショをみて作ってみよう。

↓こんな演算になる。

1.5とか10という数字がいきなり使われてて分かりづらいね。この1.5と10はいったいなんだろうか。

10とは何か

高さの値を作るときに使った10という数字が、今回の10と同じものだよ。

これを変えると壁の高さが変わる。変数化してないけど、あえて名前をつけるなら「高さの調整値」とか、少し意味のある言葉にするなら「距離感」といったところかな。距離ではなく、距離感。

プレイヤーと壁がどのくらい離れているかは「★DV / 距離」によって計算できるけど、この数字は小さすぎるんだよね。そのため壁がすごく小さく見えちゃう。それを解消するために使ったのが、この10という数字だよ。

1.5とは何か

これは変数「y座標」の値を決めるときに使った数字だよ。

あえて変数化するとすれば「目線の高さ」みたいなかんじ。これを大きくすると、壁が画面の下側に描画されるようになる。大きくすると目線が下るから、目線の高さっていうか「目線の低さ」かな。

演算を使う

さっき作った演算は、この変数「y座標」のところで使うよ。もともと1.5のところにはめる。

↓こんな感じになるようにしよう。

プレイヤーZの値でタテに動くようになったかテストする

うおぉぉぉぉ!これはジャンプできそうな気がする!いっきに現実味がでたね。

この勢いでコーディングを続けよう。

エンティティの高さも直す

上のテスト動画を見るとナノが不自然だよね。これを改善する。

定義「_エンティティをスタンプする」の「x座標を◯、y座標を◯にする」ブロックを見つけて。いまは空白になっているところに演算をはめていくよ。

まずは空いてるスペースで演算を組もうか。さっきのコーディングに似てる。

↓こんな状態にする。

これを空白だったところにハメよう。

エンティティの高さもプレイヤーZで変わったかテストする

さいっこう!

プレイヤーにジャンプを追加する

さぁ、さぁさぁさぁ!ジャンプいこうか。

スプライト「プレイヤー」を開いて。

定義「_プレイヤーティック」にスペースキーの処理を追加する

この定義に処理を追加するよ。

定義の最後に、スペースキーが押されたかどうかを調べる条件ブロックを追加しよう。

さらに条件ブロックを入れ子にして、★プレイヤーZがゼロかどうかを調べる。これはジャンプしてない状態を意味しているよ。

変数「★プレイヤースピードZ」をつくる

今度はジャンプのスピードを格納する変数を作ろう。

スペースキーが押されたときにジャンプしてない状態なら、この変数を2にするよ。

定義の最後に、★プレイヤーZを★プレイヤースピードZずつ変えるブロックを置く。この際に★デルタも掛けておけば解像度によるFPSの変化にも対応したジャンプができあがる。

そして今度はジャンプ後に下がるように、★プレイヤースピードZを「-0.2 x ★デルタ」ずつ変わるようにする。

そして最後に★プレイヤーZがゼロよりも小さい値になった場合に備えよう。

このときは★プレイヤーZも★プレイヤースピードZもゼロにすればOK!

ジャンプできるかテストする

いぃぃぃぃぃやっほーーーー!

さい & こう!

まとめ

ついに3D空間にもかかわらずスムーズにジャンプするという偉業を達成した。これは伝説の幕開けに過ぎない。これを利用してどんなゲームが考えられる?それがきっとキミの伝説になっていくはずだ。

シンプルに敵をジャンプで乗り越えたらポイントが貯まるとか。それをマルチプレイヤーで競うようにするだけでも楽しそう。なんならフォールガイズみたいなレースとアスレを組み合わせた3Dゲームもできるかもしれない。

もうアイデアが止まんねぇ!

次回はとりあえず敵をジャンプで乗り越えるっていうアイデアを実現してみたいと思う!

完成サンプルがあるよ
おつかれさま!今回のチュートリアルには完成サンプルがあるから、作ってて分からなくなったり、 動作確認をしたいときはチェックしてみてね。
ブクマよろしくお願いします! ブクマよろしくお願いします!
どんどん追記・更新していくので、ブックマークやシェアよろしくお願いします!

スクラッチゲーム攻略

スクラッチゲーム

    • 厳選されたスクラッチ人気作品リストがレビュー付きで楽しめます
      趣味に関するスクラッチ作品例
      勉強になるスクラッチ作品