Unityでアーマードコアっぽいロックオンを実装

アーマードコアVにでてくるようなロックオンシステムを実装していきます。
画面に描画されたロックオンサークル内に、敵を一定時間捕捉しているとロックオンしてくれるシステムですね。

こんな感じ↓(画像は拾いもん)

以下のようなロジックでロックオンを実装していく。

※最初の画面内に敵がいるかどうかの判定は不必要かもしれない

OnWillRenderObject関数は指定したカメラに映る位置にオブジェクトがいた場合に呼び出される関数。まずはここで自機の視野角内にいる敵に絞り込む。

しかし、OnWillRenderObject関数はカメラと対象オブジェクトの間にある他のオブジェクト有無を考慮しない。
つまりこのままでは壁の向こう側にいる敵すらロックオンしてしまう。

なので、Physics.Linecast関数を用いて間に他のオブジェクトが間にあるかの判定を行う。ここで全オブジェクトを判定にいれてしまうと弾が自機と敵の間を通っただけでロックオンが途切れかねない。なので有無判定を行うオブジェクトにはレイヤーでマスクをかけること。

上記の手順で実際にプレイヤーから見て画面上に移っている敵に絞り込まれるはず。後は絞りこんだ敵が画面上のどこに描画されているかをRectTransformUtility.WorldToScreenPoint関数を用いて取得する。
RectTransformUtility.WorldToScreenPoint関数は指定したワールド座標を画面座標に変換してくる関数です。
敵の画面座標が分かったのでこの画面座標がロックオンサークル内に収まっているかを判定する。
ロックオンサークル内に何フレーム捕捉し続けているかを計測し、目標時間まで到達したら晴れて無事ロックオン完了といった流れ。

各関数の細かい使用方法や注意点は、ぐぐれば個別に詳細がわかる記事があるのでそちらを参考にしてください。

上記を踏まえ、以下のように実装しました。

敵の画面内に入っているかの判定

ロックオンシステムの処理

ロックオンマーカーは以下のように実装
あらかじめ以下のような画像を用意し、スクリプトイメージとしてインポート
白い長方形の辺部分の画像なので、背景白いからなんも見えないかも・・・

※インポート時にTexture TypeをSpriteにすること
これをUIのImageとして描画し、スクリプトで描画位置と色・表示非表示を処理している。
UIに関しては以下が参考になりました
http://www.metalbrage.com/UnityTutorials/uGUI/ImageElement.html

あとはロックオンしたら武器の向きを
transform.LookAt ()で敵に向けるだけ。

こんな感じになりました。

まだ偏差撃ちを実装していないので、ロックオンするとむしろ当たらない・・・

望み通りの動きになってはいるものの、カメラの視野角に収まっているかどうかの判定処理を敵オブジェクト自体に入れなきゃいけないのは歯がゆい。できればその辺の処理もロックオンシステムオブジェクトで処理させちゃいたい。

というより視野角に収まってる状態かどうかの判定なんていらないのかな・・・

それと、敵が一機だった場合のみのロジックになってるから複数の敵を考慮するロジックに修正する必要がある。武器の左右のロック速度が違った場合のロジックもいれないとね。

以上です。

コメント

タイトルとURLをコピーしました