【障害物検知】索敵システム作り方紹介【RPGBakin】
いつもご愛顧いただきありがとうございます、んだば重工です。
本日は昨日紹介した新索敵システムの作り方をご紹介します。
今までの索敵システム
まず、以前使っていた索敵システムはこちらの記事にて紹介してます。
今回はこれを改良し「遮蔽物を感知できるようになる」というのが目的です。
Bakinの当たり判定システムは…使わないッ!
Bakinには周囲の当たり判定を検知する、レイキャストというコマンドスクリプトがあるのですが、今回これは使いません。
使わないんかーい。
というか今回の用途としては使えない、が正しいです。
というのもレイキャストの判定が「イベントの直線上」にしか存在させられなく、広めの視野に対応が難しいんですよね。
「プレイヤーのいる方向に向けて」という機能を実装してもらえないかなあ…
あ、逆に直線上だけでいい状況だったらこちらを使った方が簡単に作れるかと思います。
時代は弾幕だよ兄さん!
なのでこのレイキャスト機能は今回は封印します。
残念。
というわけでBakinの謎機能「イベントの生成」で成立させます。
出た、RPG作るソフトなのにシューティングゲーム作れる機能!
以前の索敵システムでは索敵範囲を射出するというやり方でしたが、今回は弾幕シューティングよろしく、放射状に複数の弾を発生させます。
実際は見えないですが、こんな感じで弾が飛んでます。
弾幕シューティングだ!
地形やオブジェクトの後ろにいれば弾が消えて飛んでこないので、検知されることがないということですね。
視線の範囲は弾の消える距離や秒数で設定できます。
なんだ、これだけでいいなら楽ですね。
そう思っていた時期が私にもありました。
おや、何かトラブルが?
試しにこの複数の弾を発射するシステムを作って、敵を10体ほどマップに配置しテストプレイしたところ…
「ナニコレクッソ重い!!」
おうふ。。
BakinはMAPのイベントに対しての描画距離設定がなく、1マップにたくさんの弾を0.5秒毎に発射するイベントが複数いることで、処理が激重になりました。
なるほど…
なので、この問題を解決する方法として「イベントとの距離が近くなると弾を発射する」というスクリプトを作ることにしました。
イベントとの距離を測るスクリプト
Bakinにはデフォルトでプレイヤーとイベントの距離を測る機能がないので、距離を計算するスクリプトを作ります。
まず、プレイヤーの座標を並列自動処理で取得するイベントを作ります。
次に敵側のイベントの座標も取得し、距離を算出します。
計算式はこちら
細かい計算式の説明は省きますが、
(X座標の差)^2+(Y座標の差)^2=(イベントとの距離)^2になります。
Bakinはルートの計算はできないので(※複雑な変数処理から平方根計算できました)、計算式で出た(イベントとの距離)^2で条件判断します。
今回は索敵弾の飛距離5マスに合わせ「6マス以内に来ると弾を発射する」と設定したいので、数字が36以下の場合に弾を発射するようにします。より遠くから検知する場合はこの数字を大きくすれば可能です。(※重さ次第)
遠くにいる時は発射せず、近くにくると発射するようになりました!
そして重さ問題も解決しました!
副産物も…!
実はこの距離計算スクリプトを作ったことでですね、ひとつやれることが増えたんです。
お?
擬似的な距離描写が出来るこれを活かせば、基本マップ50x50の大きさに拘らず、もっと大きなマップを作れるんじゃないかと。
なるほど。
このスクリプトがどの程度耐えれるかは未知数なので、色々試してみようと思います!