【特別編 #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!

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

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

さい & こう!

軽量化モードのジャンプ

ok-scratch ok-scratch

2025/01/25追記:軽量化モードのジャンプが実装できてないことをご指摘してくれたHikiniku14さん、ありがとうございます!!

2025/01/27追記:軽量化モードの壁の高さがバグってしまっていたので、再び調整を行いました。再びご指摘をしてくれたHikiniku14さん、ありがとうございます!!

定義「_行を描画する」に追加する

この定義を改修するぞ。

ここでいったん切り離しておこう。

切り離したら上下をくっつける。

こうなってればOK。

軽量化モードの条件ブロック内を調整する

切り離したブロックの一部を、更に削除する。

こうしておく。

定義の最下部にある「◯回繰り返す」を変える

変数「スケールしたテクスチャのサイズ」回繰り返す、というループに「もしーでなければー」ブロックをスクショのように追加しよう。

ここに先ほど切り離しておいたブロックを近づけて、各ブロックを移行する。スクショを参考にブロックを移してみてほしい。

こうなればOK。

これで軽量化モードでも正しい壁の高さになった。軽量化モードの在り方そのものがガラッと変わってしまったけど、これで安定したからOK!

ok-scratch ok-scratch

ジャンプしたり上下を見るように動かしてもバグってないはず。。。たぶん。

まとめ

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

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

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

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

完成サンプルがあるよ
おつかれさま!今回のチュートリアルには完成サンプルがあるから、作ってて分からなくなったり、 動作確認をしたいときはチェックしてみてね。
このスクラッチゲームの作り方への質問もOK このスクラッチゲームの作り方への質問もOK
このスクラッチゲームの作り方に挑戦していて分からないことが発生したら質問してみてね。気づいたタイミングで回答するよ。 質問は 僕のスクラッチのプロフィール で受け付けているよ。

質問テンプレート(素早く3回クリックすると全選択できるのでコピーしよう)

・◯◯ ... 記事のどこまで実装が終わったのかを記入しよう。
・□□ ... どんな問題が起きているのか、どういうときに起きるのか、具体的に書こう。
・共有済みURL ... たまに共有してない作品URLを書いてる人がいるけど、共有しないとこちらから確認できないからよろしくね。

スクラッチャーからのコメント

Hikiniku14 Hikiniku14 2025-01-25
質問です。 3D作成シリーズは特別編まで終わらせて、無事3Dエンジンを作ることができました!それで、作ったプロジェクトでジャンプをすると、普通のTNTなどを壁にすることができるモードなら、問題ないのですが、軽量モードだと壁がバグってしまいます。自分なりに努力しましたがうまくいきません。どうすればいいのでしょうか。 https://scratch.mit.edu/projects/1124532018/
Hikiniku14 Hikiniku14 2025-01-25
@Hikiniku14 おそらく忙しいと思いますので、時間が余ったらで大丈夫です。
ok-scratch ok-scratch 2025-01-25
@Hikiniku14 ハッ!?た、軽量モードでのジャンプ、試したことなかったです。後ほどやってみます!!
ok-scratch ok-scratch 2025-01-25
@Hikiniku14 軽量化モードのジャンプは未実装でした!あわててチュートリアルに追記しておきましたので、ご覧いただければと思います。ご指摘をくれてありがとうございます(^o^) https://scratch.coach/lesson/3d-20/#contents-13
Hikiniku14 Hikiniku14 2025-01-26
@ok-scratch 何度もすみません。 これでやってみたのですが視点を上に向けたり、下にむけたりするとするとバグってしまいます。 あと、普通のモードと軽量モードで壁の高さが違う気がします。
ok-scratch ok-scratch 2025-01-27
@Hikiniku14 壁の高さ、変わってますね‥(^_^;) のちほど改善できるかチェックしてみます!
Hikiniku14 Hikiniku14 2025-01-28
@ok-scratch できました! わざわざ記事を更新までしてくれてありがとうございます。
N_POTETO N_POTETO 2024-08-31
スクラッチコーチさんお世話になっています!今3dゲームを作っているんですが中々ジャンプとジャンプして地形に着地する(?)仕組みが作れません、上下に動く視点まではできたんですが....解説を作ってもらえると嬉しいです...!
ok-scratch ok-scratch 2024-08-31
@N_POTETO リクエストありがとうございます。高さの計算が複雑なところですよね。タスク候補に入れておこうと思います!
ブクマよろしくお願いします! ブクマよろしくお願いします!
どんどん追記・更新していくので、ブックマークやシェアよろしくお願いします!

スクラッチゲーム攻略

スクラッチゲーム

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