衝突予測地点にマーカーを表示

衝突予測地点にマーカーを表示

軌道予測線に衝突判定の追加

 軌道予測線に沿ってRayを飛ばすことで、衝突判定を行いました。

Scriptと実行結果

 マウスを動かすことで視点移動を行い、左クリックでオブジェクトを投射します。マウスの左ボタンを押し続けると、初速が大きくなります。初速と向いている方向に応じて、LineRendererによって軌道予測線の描画を行います。また、衝突判定はRayによって行っています。Rayによって検出された衝突位置にマーカーの表示を行い、軌道予測線は衝突位置より先を描画しないように処理をしています。

このScriptを実行するとこのようになります。

カメラの移動

 マウスを動かすことでプレイヤーが回転し、それに伴いカメラが移動するようなScriptを書きました。また、スクロールホイールによりカメラを前後に動かすことができます。カメラの移動処理をLateUpdate内で行っている理由は、Update内でカメラの移動処理を行うと、オブジェエクトが移動してからカメラが移動したり、カメラが移動してからオブジェクトが移動したりと、処理の順番が変わるため画面が、がたついてしまいます。そこで、確実に最後に実行されるLateUpdate内で処理を行っています。これにより、オブジェクトの移動等が実行されてからカメラを動かすことができます。

衝突判定の追加

 GetLinePositionは原点より投射された物体のある時刻における予測位置を計算する関数です。
startPosにRayの開始位置をendPosにRayの終了位置を計算し、代入しています。GetLinePositionは原点よりz方向へ向けて計算しているため、プレイヤーの位置や向いている方向を考慮した座標を計算する必要があります。
Quaternion.AngleAxis(transform.eulerAngles.y, Vector3.up) * GetLinePosition(count * rayStep)によりプレイヤーの回転に合わせた座標を計算し、さらにプレイヤーの現在位置(ownPos)を加算することでプレイヤーの位置や向いている方向を考慮した予測線の座標を計算しています。
LinecastによりstartPosからendPosへ向けてRayを飛ばし、衝突判定を行っています。衝突が検知された場合、hitPosに衝突座標を代入しています。衝突座標を軌道予測線の描画に使用するため、原点よりz方向へ予測した際の座標に変換しています。また、衝突位置へマーカー(objMarker)の移動と表示をしています。

軌道予測線の描画

 軌道予測線をLineRendererを使用して描画します。Rayが衝突した位置(hitPos)より予測線の座標(pos)が大きくなった時、LineRendererへ衝突した座標を代入した後にfor文を抜けることで、予測線が衝突した座標を超えないようにしています。

UIによるマーカー表示

 ゲームオブジェクトによりマーカーを表示すると他のオブジェクトにめり込むことがあります。そこで、衝突面にあわせてマーカーを回転すると当然のことながら、マーカーが斜めを向いてしまいます。マーカーが斜めを向くことで、衝突面の向いている方向がわかるという利点があると思います。しかしながら、マーカーには正面を向いていて欲しいと考えたので、マーカーがめり込まず、尚且つ常に正面を向いているようにするために、UIで表示するようにScriptを変更しました。

Scriptと実行結果

 マーカーをゲームオブジェクトからUIで表示する方法へ変更したScriptはこちらです。マーカーにはUIのImageを使用しています。

このScriptを実行するとこのようになります。

マーカーをUIへ表示

 UIで表示するとカメラと衝突座標の間にオブジェクトがある場合でも、マーカーが表示されてしまいます。そこで、カメラから衝突座標へRayを飛ばし、カメラと衝突座標の間にオブジェクトがある場合、マーカーを非表示にする処理を加えています。また、カメラと衝突座標の距離によってマーカーの大きさが変わるようにしています。マーカーの位置計算はカメラの座標が必要になるため、カメラが移動した後にワールド座標からスクリーン座標へ変換し、移動しています。

参考サイト

【Unity】地形に沿った着弾マーカーを表示する