- スターター作品
- なし
- 今回の完成サンプル
- なし
逃走中はスクラッチゲームの中でも人気ジャンルの1つだよね。
よくあるコーディングとして、ハンターのスプライトに「プレイヤーへ行く」を実装してプレイヤーを追いかける動きだよね。でもこれは使わないよ。

逃走中のハンターに関しては、最初からプレイヤーに向かって走るのではなくて、あくまでプレイヤーを見つけてから追いかけてくるよね。
スクラッチでもそれを実現する方法はたくさんあるけど、今回は3D逃走中でそれをどうやって実現するのかを考えてみたよ。
u003cpu003e今回のチュートリアルはu003ca href=u0022https://scratch.coach/lesson/3d-online-game-1/u0022 target=u0022_blanku0022 rel=u0022noreferrer noopeneru0022u003e3Dゲームの作り方u003c/au003eで作ったプロジェクトが土台になっています。u003c/pu003e
今回コーディングしたい仕様
コーディングの際には次の点を実現したい。
- プレイヤーとハンターの距離が近づいたら(ハンターの視界に入ったら)ハンターが追いかけてくるようにしたい
- 3Dの壁の向こう側にプレイヤーがいても、ハンターは気づかないようにしたい
- 3Dの描画処理パフォーマンスを落とさないように実装したい
- 一定条件でハンターが諦めるようにしたい
特に大事なのが「パフォーマンス」かな。
ゲームが重たくなったらストレスだから、軽い実装をしたい。めちゃリアルに作り込むならエンティティごとにレイキャスターを実装して、エンティティの目線を実装すればいいかもしれないけど、そうすると恐ろしく重たい処理になる。さすがにグリフパッチ流3Dエンジンでも厳しい。
そんなときに役立つのはだいたい数学の力だ。
OKぃ、一緒に見ていこっさ!
エンティティを改造する
スプライト「エンティティ」だけ改造すれば実現できるよ。

緑の旗が押されたとき
緑の旗が押されたときはとくに目新しいことはしてない。ここで実行している定義「_スポーンさせる」の中でクローンを作るんだよね。このあたりは別途作った3Dゲームで敵を表示する方法を参照してほしい。もう作ってある人はパスしてOKだよ。

クローンされたとき
ここはガッツリ作り直すよ。まずは↓スクショのように変数を整えておいて。

変数「アクティブか」という値は、ハンターがプレイヤーを見つけると「■はい」に変わる予定。

u003cpu003eちなみに「■いいえ」にはゼロが入ってるよ。「■はい」には1を入れてある。■を接頭語として使っているのは、この変数の値は変えないっていうことを意味しているマイルールだよ。このあたりはu003ca href=u0022https://scratch.coach/lesson/coding-rules/u0022u003eコーディング規約u003c/au003eとして別途まとめてあるから興味のある人はチェックしてね。u003c/pu003e
移動する

向きを決める
アクティブのときと、そうでないときで、動くスピードを変えたい。テレビの逃走中でも非アクティブ状態のハンターはゆっくり歩いてるよね。

おっと、新しい定義が出てきたね。
定義「_プレイヤーを探す」
この定義は非アクティブのときは常に実行される。
ハンターの近くにプレイヤーがいないかチェックする処理になるよ。
今回の目玉となる機能だね!
初期化
まずは各種変数を初期化しておく。新しく変数を作って、↓スクショのように初期化しておいてほしい。


u003cpu003e接頭語にアンダーバーがついている「_距離x」とかは、「ここでしか使わない一時的な変数」という意味だよ(マイルール)u003c/pu003e
視界にプレイヤーがいるか調べる
プレイヤーが一定距離内にいるかをまず調べよう。そのために条件ブロックを追加して、プレイヤーとハンターの距離が視力(70)以内かどうかを調べる条件式を作るぞ。

平方根で直線距離を求める
右側は複雑だからステップバイステップで作っていこう。


これを条件式の右側にはめて、最終的には↓こんな感じになるよ。



u003cpu003eu003ca href=u0022https://scratch.coach/lesson/stamp-and-list/u0022 target=u0022_blanku0022 rel=u0022noreferrer noopeneru0022u003eスイカゲームの作り方u003c/au003eでもめっちゃ活躍した数式。ゲーム作りには欠かせないピタゴラス様。u003c/pu003e
間に壁があったら見つけられなくする
ここではスプライト「レイキャスター」で実装した「_シングル・レイ」のような処理を作る。といってもレイキャスターのように扇状に調査する必要はなくて、プレイヤーに向かって動かしてみて、途中で壁にぶつかれば処理中断、プレイヤーに触れたら発見というシンプルなロジックだよ。

レベル(壁)に触れるか、アクティブ化したら終了するループを置く。


u003cpu003eアクティブ化したら終了というよりは、すでにアクティブならループを実行しないというニュアンスで理解するほうが正しいかも。実装方法によっては何度もこの処理を実行してしまいかねないので念の為。u003c/pu003e
1歩ずつ動かしていく。

プレイヤーに触れたかどうかを調べる。

X座標とY座標を調査前の値に戻してから、アクティブ化させて処理を中断しちゃおう。

最後のところで各値を元に戻しておく。

クローンされたとき(続き)
壁に当たったら方向転換したり、アクティブ状態でプレイヤーを追いかけているときに見失ったら諦めるようにしたりする。
壁や別のエンティティに当たった場合

この中でスタック回数という変数を使って諦めるタイミングを決めておく。

定義「_向きを決める」
壁に当たったらランダムで方向転換するようにする。

ハンターが追いかけてくるようになったかテストする
ちょっと見づらいけど、赤(ハンター)が黄色(プレイヤー)を見つけて追いかけていく様子が見て取れるぞ。
まとめ
これでパフォーマンス高くプレイヤーを追いかけるやばいハンターが出来上がった。つねにプレイヤーに向かってくるわけじゃないから、隠れながら迷宮を探検したり、それこそ逃走中のように宝物をゲットしたり、RPGならエンカントをさけながら緊張感のあるフィールドプレイを楽しんだりするゲームが作れるようになると思う!