月別アーカイブ: 2016年2月

UE4で放物線LineTrace(っぽいもの)

基本的なFPSやTPSのゲームでは、プレイヤーが撃った銃弾は重力などの影響を受けず直進します(影響を受ける物も勿論ありますが)。このような場合で銃弾の経路と当たりを処理したい場合は「①発射地点から②狙う方向に③一直線に④射程距離の長さだけ」壁や敵などに当たるかどうかをチェックする事になると思います、いわゆるLine trace(もしくはRay trace, Ray castなど)です。

で、UE4にはこのLineTraceの機能がブループリントであるので簡単に使えるのですが、重力の影響を受ける発射物の飛ぶ経路はどう取るんじゃい?というわけで、作ってみました。

 

①準備

まず弾の飛ぶ経路は、発射速度と発射角度から”斜方投射の公式”を使って求めます。当たり判定のチェックにはLineTraceを使用しますが、これだけですと直線の判定しかとれません。弾の飛ぶ経路は曲線の為、これを再現するために「1秒に描く曲線をx分割して点(座標)をとり、点と点を直線で結んで擬似曲線を作る」という方法をとります。若干ややこしいですが・・・曲線はSplineコンポーネントで管理します(重くなりそうですが都合上)。精度と長さが増すとかなり重かったので最後で修正した物を記載しました・・・

 

②斜方投射の公式

発射地点からの距離及び高さをそれぞれxとy,発射速度をv0,発射角度をθ,重力加速度をg,任意の時間をtとします。斜方投射の公式から

x=v0*cosθ*t

y=v0*sinθ*t-(1/2)*g*t^2

これで任意の時間の弾の位置が分かります。これをBPで作ります。空のアクタ(名前をParabolaLineTraceとします)にSplineコンポーネントを追加し、関数を作成した物がこちら↓。

get_dist

距離の計算

get_height

高さの計算

get_xy

Vector2Dで出力

だいぶ簡素ですが・・・これを元にSplineを作ります。

 

③Splineの作成

コンストラクションスクリプトに処理を書きます。

construct.png

画像一枚にまとめてます

これで放物線を描くSplineが出来ます。初速、重力加速度、発射角度はデフォルトで3000,980,30にしてます(スポーン時に設定出来るようにしてあります)。

viewport.png

こんな感じ

 

④2点間のLineTraceを繰り返す

event1event2

これまたこんな感じに・・・ごめんなさい特に書く事が・・・

 

⑤作ったアクタをスポーンする

例としてFPSテンプレートを利用しています。FirstPersonCharacterのBPで、定間隔にParabolaLineTraceアクタをスポーンします。

FPSchara

 

⑥プレイ

ここまで作っておいてこんな記事が・・・Splineを使わないのでこちらのが軽くていいかも?
ためしにSpline無しにしたら(1秒間飛んだ距離当たりに取る点の数60、長さ10秒の600点でテスト)fpsが
8fps→30fps位に改善しました。今回は無理やりSplineを使ってしまったので(数百のポイントを追加したり座標を取ったりを毎フレーム処理するようなコンポーネントではない筈、というか放物線LineTraceとして作ったコレも取る点は多くて10*10位なのでやり過ぎ)最初からちゃんと作るべきでした・・・
(複雑なBPになると思ったら無い方がむしろすっきり)

修正後の物がこちら(修正箇所のスクショのみ)

get_xyz227

距離と高さの2次元ではなく3次元で座標を取るための関数追加

construct227

コンストラクションスクリプト、作ったVector配列に座標を入れていく

event1_227

この辺はSpline使ったのとほぼ同じ