スクラッチに挑戦している皆さん、どうも!スクラッチコーチです。
- ① まず2Dマップを動き回れるようにしよう!
- ② さっそく3D化しちゃおうぜ!
- ③ 壁にスキマがあって敵から丸見え!?やっば
- ④ 陰影をつけて立体感マシマシにしよう
- ⑤ トゲトゲやユガミを補正してハイクオリティ3Dの一歩を踏み出そう(爆速オンライン3Dゲームの作り方 #05)
- ⑥ 壁の衝突判定の基本を作ろう
- ⑦ 壁に触れてると進めない!?移動を改善しよう
- ⑧ ついに敵が現れた!距離感の計算ってどうやる?
- ⑨ 奥行きを実装して壁の後ろに隠れられるようにする
- ⑩ エンティティに陰影をつける
- ⑪ 敵がプレイヤーに向かって迫ってくるように実装する
- ⑫ スターを実装しよう!
- ⑬ 爆速3D爆誕
- ⑭ 壁に画像(テクスチャ)を貼り付けてリッチな3D空間を演出する
- ⑮ テクスチャの壁を洗練させて本格3D完成!
- ⑯ シメだ!モバイル & オンライン化をするぞ
- ⑰ 【おまけ】敵がプレイヤーを見つけたら追いかけるロジック (いまここ)
- ⑱ 【特別編】マウスに合わせて視線を上下させる方法
- ⑲ 【特別編】マウスでターンするスピードを調整する
- ⑳ 【特別編】敵をジャンプで乗り越える
逃走中はスクラッチゲームの中でも人気ジャンルの1つだよね。
よくあるコーディングとして、ハンターのスプライトに「プレイヤーへ行く」を実装してプレイヤーを追いかける動きだよね。でもこれは使わないよ。
逃走中のハンターに関しては、最初からプレイヤーに向かって走るのではなくて、あくまでプレイヤーを見つけてから追いかけてくるよね。
スクラッチでもそれを実現する方法はたくさんあるけど、今回は3D逃走中でそれをどうやって実現するのかを考えてみたよ。
今回のチュートリアルは3Dゲームの作り方で作ったプロジェクトが土台になっています。
今回コーディングしたい仕様
コーディングの際には次の点を実現したい。
- プレイヤーとハンターの距離が近づいたら(ハンターの視界に入ったら)ハンターが追いかけてくるようにしたい
- 3Dの壁の向こう側にプレイヤーがいても、ハンターは気づかないようにしたい
- 3Dの描画処理パフォーマンスを落とさないように実装したい
- 一定条件でハンターが諦めるようにしたい
特に大事なのが「パフォーマンス」かな。
ゲームが重たくなったらストレスだから、軽い実装をしたい。めちゃリアルに作り込むならエンティティごとにレイキャスターを実装して、エンティティの目線を実装すればいいかもしれないけど、そうすると恐ろしく重たい処理になる。さすがにグリフパッチ流3Dエンジンでも厳しい。
そんなときに役立つのはだいたい数学の力だ。
OKぃ、一緒に見ていこっさ!
エンティティを改造する
スプライト「エンティティ」だけ改造すれば実現できるよ。
緑の旗が押されたとき
緑の旗が押されたときはとくに目新しいことはしてない。ここで実行している定義「_スポーンさせる」の中でクローンを作るんだよね。このあたりは別途作った3Dゲームで敵を表示する方法を参照してほしい。もう作ってある人はパスしてOKだよ。
クローンされたとき
ここはガッツリ作り直すよ。まずは↓スクショのように変数を整えておいて。
変数「アクティブか」という値は、ハンターがプレイヤーを見つけると「■はい」に変わる予定。
ちなみに「■いいえ」にはゼロが入ってるよ。「■はい」には1を入れてある。■を接頭語として使っているのは、この変数の値は変えないっていうことを意味しているマイルールだよ。このあたりはコーディング規約として別途まとめてあるから興味のある人はチェックしてね。
移動する
向きを決める
アクティブのときと、そうでないときで、動くスピードを変えたい。テレビの逃走中でも非アクティブ状態のハンターはゆっくり歩いてるよね。
おっと、新しい定義が出てきたね。
定義「_プレイヤーを探す」
この定義は非アクティブのときは常に実行される。
ハンターの近くにプレイヤーがいないかチェックする処理になるよ。
今回の目玉となる機能だね!
初期化
まずは各種変数を初期化しておく。新しく変数を作って、↓スクショのように初期化しておいてほしい。
接頭語にアンダーバーがついている「_距離x」とかは、「ここでしか使わない一時的な変数」という意味だよ(マイルール)
視界にプレイヤーがいるか調べる
プレイヤーが一定距離内にいるかをまず調べよう。そのために条件ブロックを追加して、プレイヤーとハンターの距離が視力(70)以内かどうかを調べる条件式を作るぞ。
平方根で直線距離を求める
右側は複雑だからステップバイステップで作っていこう。
これを条件式の右側にはめて、最終的には↓こんな感じになるよ。
スイカゲームの作り方でもめっちゃ活躍した数式。ゲーム作りには欠かせないピタゴラス様。
間に壁があったら見つけられなくする
ここではスプライト「レイキャスター」で実装した「_シングル・レイ」のような処理を作る。といってもレイキャスターのように扇状に調査する必要はなくて、プレイヤーに向かって動かしてみて、途中で壁にぶつかれば処理中断、プレイヤーに触れたら発見というシンプルなロジックだよ。
レベル(壁)に触れるか、アクティブ化したら終了するループを置く。
アクティブ化したら終了というよりは、すでにアクティブならループを実行しないというニュアンスで理解するほうが正しいかも。実装方法によっては何度もこの処理を実行してしまいかねないので念の為。
1歩ずつ動かしていく。
プレイヤーに触れたかどうかを調べる。
X座標とY座標を調査前の値に戻してから、アクティブ化させて処理を中断しちゃおう。
最後のところで各値を元に戻しておく。
クローンされたとき(続き)
壁に当たったら方向転換したり、アクティブ状態でプレイヤーを追いかけているときに見失ったら諦めるようにしたりする。
壁や別のエンティティに当たった場合
この中でスタック回数という変数を使って諦めるタイミングを決めておく。
定義「_向きを決める」
壁に当たったらランダムで方向転換するようにする。
ハンターが追いかけてくるようになったかテストする
ちょっと見づらいけど、赤(ハンター)が黄色(プレイヤー)を見つけて追いかけていく様子が見て取れるぞ。
まとめ
これでパフォーマンス高くプレイヤーを追いかけるやばいハンターが出来上がった。つねにプレイヤーに向かってくるわけじゃないから、隠れながら迷宮を探検したり、それこそ逃走中のように宝物をゲットしたり、RPGならエンカントをさけながら緊張感のあるフィールドプレイを楽しんだりするゲームが作れるようになると思う!
#01 3D逃走中オンライン(モバイル対応)
- 50件
- 45件
- 827回
- ©
- 2024.3.22