【おまけ】敵が「プレイヤーを見つけたら」追いかけてくる処理の作り方

【おまけ】敵が「プレイヤーを見つけたら」追いかけてくる処理の作り方
ok-scratch
敵の目線もレイキャスターで実装すれば、プレイヤーを見つけたかどうか判断できるって?うーん、でも負荷が高すぎてスクラッチでは無理そう……一体どうすればいいんだ!?
スターター
プロジェクト
なし
難しさ
タグ

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

LOADING...

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

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

逃走中はスクラッチゲームの中でも人気ジャンルの1つだよね。

よくあるコーディングとして、ハンターのスプライトに「プレイヤーへ行く」を実装してプレイヤーを追いかける動きだよね。でもこれは使わないよ。

逃走中のハンターに関しては、最初からプレイヤーに向かって走るのではなくて、あくまでプレイヤーを見つけてから追いかけてくるよね。

スクラッチでもそれを実現する方法はたくさんあるけど、今回は3D逃走中でそれをどうやって実現するのかを考えてみたよ。

今回のチュートリアルは3Dゲームの作り方で作ったプロジェクトが土台になっています。

今回コーディングしたい仕様

コーディングの際には次の点を実現したい。

  • プレイヤーとハンターの距離が近づいたら(ハンターの視界に入ったら)ハンターが追いかけてくるようにしたい
  • 3Dの壁の向こう側にプレイヤーがいても、ハンターは気づかないようにしたい
  • 3Dの描画処理パフォーマンスを落とさないように実装したい
  • 一定条件でハンターが諦めるようにしたい

特に大事なのが「パフォーマンス」かな。

ゲームが重たくなったらストレスだから、軽い実装をしたい。めちゃリアルに作り込むならエンティティごとにレイキャスターを実装して、エンティティの目線を実装すればいいかもしれないけど、そうすると恐ろしく重たい処理になる。さすがにグリフパッチ流3Dエンジンでも厳しい。

そんなときに役立つのはだいたい数学の力だ。

OKぃ、一緒に見ていこっさ!

エンティティを改造する

スプライト「エンティティ」だけ改造すれば実現できるよ。

緑の旗が押されたとき

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

クローンされたとき

ここはガッツリ作り直すよ。まずは↓スクショのように変数を整えておいて。

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

ok-scratch ok-scratch

ちなみに「■いいえ」にはゼロが入ってるよ。「■はい」には1を入れてある。■を接頭語として使っているのは、この変数の値は変えないっていうことを意味しているマイルールだよ。このあたりはコーディング規約として別途まとめてあるから興味のある人はチェックしてね。

移動する

向きを決める

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

おっと、新しい定義が出てきたね。

定義「_プレイヤーを探す」

この定義は非アクティブのときは常に実行される。

ハンターの近くにプレイヤーがいないかチェックする処理になるよ。

今回の目玉となる機能だね!

初期化

まずは各種変数を初期化しておく。新しく変数を作って、↓スクショのように初期化しておいてほしい。

ok-scratch ok-scratch

接頭語にアンダーバーがついている「_距離x」とかは、「ここでしか使わない一時的な変数」という意味だよ(マイルール)

視界にプレイヤーがいるか調べる

プレイヤーが一定距離内にいるかをまず調べよう。そのために条件ブロックを追加して、プレイヤーとハンターの距離が視力(70)以内かどうかを調べる条件式を作るぞ。

平方根で直線距離を求める

右側は複雑だからステップバイステップで作っていこう。

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

  • なんでこれで直線距離が分かるの? なんでこれで直線距離が分かるの?

    これは三平方の定理(ピタゴラスの定理)を使って直線距離(ユークリッド距離)を算出するという数学的な実装なんだ。ざっくり言うと↓の解説図を見てね。そしてより詳しくは数学が得意な人に聞いてみよう(興奮してめっちゃ早口で教えてくれるはずw)

ok-scratch ok-scratch

スイカゲームの作り方でもめっちゃ活躍した数式。ゲーム作りには欠かせないピタゴラス様。

間に壁があったら見つけられなくする

ここではスプライト「レイキャスター」で実装した「_シングル・レイ」のような処理を作る。といってもレイキャスターのように扇状に調査する必要はなくて、プレイヤーに向かって動かしてみて、途中で壁にぶつかれば処理中断、プレイヤーに触れたら発見というシンプルなロジックだよ。

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

ok-scratch ok-scratch

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

1歩ずつ動かしていく。

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

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

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

クローンされたとき(続き)

壁に当たったら方向転換したり、アクティブ状態でプレイヤーを追いかけているときに見失ったら諦めるようにしたりする。

壁や別のエンティティに当たった場合

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

定義「_向きを決める」

壁に当たったらランダムで方向転換するようにする。

ハンターが追いかけてくるようになったかテストする

ちょっと見づらいけど、赤(ハンター)が黄色(プレイヤー)を見つけて追いかけていく様子が見て取れるぞ。

まとめ

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

#01 3D逃走中オンライン(モバイル対応)

54件
49件
870回
©
2024.3.22
3D逃走中オンライン(モバイル対応)
高画質ペンでプレイする 紹介URLをコピーする ハートを押しに行く メモを書く
ok-scratchさんのスクラッチゲーム ok-scratchさんのスクラッチゲーム

スクラッチコーチの3Dチュートリアルを土台にして、実験的に作ってみた3Dオンライン逃走中です!
ハンターから逃げながら賞金額を増やしていこう!

ミッションもあるよ〜。どんなミッションか、プレイしてみてね。

あ、ハンターに見つかったらダッシュで逃げるんだ!つかまると……ゴクリ

このスクラッチゲームの情報

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

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

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

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

eakonn705 eakonn705 2024-07-21
質問なのですが、僕が作ったプロジェクトで、まずスクラッチの通常モードで実行するとfpsが1になり、スクラッチのターボモードで実行してもfpsが1で、互換機のターボワープで実行するとクラッシュするという現象が起こったのですが、どういうことでしょうか。自分でも全く意味が分かりません。長文すみません。
ok-scratch ok-scratch 2024-07-21
@eakonn705 予想ですが、どこかで循環参照という現象が起きてると思います。いわゆるメモリーリークというバグです。たとえば定義Aから定義Bを実行してのに、定義Bの中からも定義Aを実行している状態です。これがあると処理が無限に終わらずにクラッシュします。
eakonn705 eakonn705 2024-07-21
@ok-scratch ありがとうございます。チェックしてみますね。
eakonn705 eakonn705 2024-07-21
@eakonn705 うーん…そのようなメモリーリークはありませんでした。「ほんの少しずつ(fpsが1くらい」」では動いているのですが、ターボワープを利用してもfpsが全く増えないのです。ブロック数も少ないのですが。
eakonn705 eakonn705 2024-07-21
@eakonn705 URLはこちらです。左上の水色のウィンドウの、白色の細長い長方形をドラッグできるようにしているのですが、そのドラッグが異様に遅いのです。fpsは変数で表示されています。 https://scratch.mit.edu/projects/1048637798/ ターボワープはこちらです。 https://turbowarp.org/1048629010/
eakonn705 eakonn705 2024-07-21
@eakonn705 ドラッグの処理は、プログラムエリアの下部にあります。定義ブロックをたくさん使っていて、全てにおいて再描画せずに実行する、にチェックを入れています。
ok-scratch ok-scratch 2024-07-21
@eakonn705 すいません、中は見れてませんが、ずっとループをたくさん使っててもそういう現象起きるかなと思いました。
eakonn705 eakonn705 2024-07-25
@ok-scratch 返答ありがとうございます。もう少しプログラムを全体的に効率的に変更させてみます。
eakonn705 eakonn705 2024-07-25
@eakonn705 直りました。ありがとうございました。
ブクマよろしくお願いします! ブクマよろしくお願いします!
どんどん追記・更新していくので、ブックマークやシェアよろしくお願いします!

スクラッチゲーム攻略

スクラッチゲーム

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