スプラインに沿って移動する方法
立ち止まってる時に進む先が見れるようにカメラを移動出来るようにしたんですがY軸でしか動かせなかったので
(一つのボタンで操作したいと思い、自由に動かせるようにはしませんでした)
当然地面が上下した時に道が見えなくなったため、
カメラ移動をスプラインコンポーネントを使って行いたいと思います。
スプラインコンポーネントの使い方としてはヒストリアさんのこの記事が参考になりました。
http://historia.co.jp/archives/2424
http://historia.co.jp/archives/1232
(ほとんどこれと同じことをしてます)
ブログ丸コピでスプライン移動ができるようになりましたが、この方法はスプラインの最初から最後まで移動すると言う処理で、プレイヤーの現在のカメラ位置から一定距離までスプラインに沿って移動させる的なことは出来ません。
なので色々処理を追加していきます。
まず考えたことはスプラインを開始したいアクターの位置を取得しスプラインの始点からの距離を求めMoveDistanceに入れることでした。
FindLocationClosestToWorldLocationと言うノードで入力した位置に一番近いスプラインの位置が分かります。
GetLocationatDistanceAlongSplineノードで入力したDistanceのときの位置を取得するノードです
0を入力すればスプラインの開始位置がわかります。
出てきたベクターを引いてLengthを取得すれば距離がわかると思いましたがこの数字は直線距離でスプラインに沿った長さではありませんでした。
しばらくして気づき次に考えたのはスプラインにポイントを追加してそのポイントのDistanceを求めると言うやり方です。
しかしポイント追加するノードは使い方がよくわかりませんでした(ポイントが良く分かってない)
AddPoint ポイントを追加することができる しかしSplinePoint構造体がブルーポイントで使えなくなってるので実質追加することが出来ないC++使えば追加できると思います
AddPoints ポイント配列がつかできる 上と同じで使えない
AddSplinePointAtIndex Positionの位置にポイント追加 Indexの数値はポイントの並び順だと思いますスプラインはこの数字の順に線を結びます。
最初はポイントの合計数をIndexにしてましたがそれだと当たり前ですが最後のポイントになり意味がありません。
AnswerHubにIndexに近くのポイントのIndexを入れて後ろのポイントの情報をすべて保存して配列に入れポイントを削除してまたポイントを作ると言う方法がありましたがポイントの情報すべて入れるのが面倒なのでやめましたSplinePoint構造体が使えれば楽だったんですけどね。
これがスプラインの途中にポイントを作る時に一番使う方法かなと思います。
しばらく考えて出来た処理が下の方法です
まずLocal変数でDistanceというのを作りスプラインのLengthの回数ForLoopWithBreakで+1していきます
GetLocationatDistanceAlongSplineにLocalDistanceを入れてその時点での位置を求め
FindLocationClosestToWorldLocationで開始したいアクターの位置を取得し
二つのVectorが=だったら同じ位置なのでその時のLocalDistanceが開始位置のDistanceだというのがわかります。
=の許容判定は1にしますループ回数を増やしプラスする数値も細かくすれば精度が良くなると思いますが別にやりません。
処理がわかった今だとなんで思いつかなかったんだろうという感じのかんたんな処理ですね。
スプラインとは別の位置でスプラインに沿って動かしたいので
(カメラが遠くに有るけどスプラインはステージの近くで編集したい)
アクターの位置からスプラインの位置を引いて変数に保存しときます。
ForceMoveのときにこの数値を足せばアクターの位置で移動させることが出来ます
到着地点の処理はこんな感じです
到着地点を変えるにはまず新しく数値を渡します。
NowDistanceは呼び出された時の距離が到着地点って時の数値です。
カメラのボタンを離して位置を戻す時にその場が到着地点としたかったので付けました。
あとは移動が終わったらイベントを起こす処理を付けて(カメラが元の位置に戻ってからSetViewTargetWithBlendしたかったので)
カメラの時は回転させなくてもいいのでForcemoveにオンオフの処理を付けスプラインコンポーネントは完成です
Blutilityを使ってみた
スプラインのポイントを移動すると 動かしてないY座標も動くのが気になったのでbutilityでポイントのy軸を戻す処理を付けました
こちらのブログhttp://unrealengine.hatenablog.com/entry/2016/10/05/215937を参考にMySplineActorのカスタムイベントでBlutilityを呼び出しますやってることはループを回してポイントのYの位置を0にしてます
写真の上の処理はAddPointを使ってた時にポイントの位置を見たかったのでポイントの位置に数字を出すという処理です記事書くまでTickで回していたのでなんで急に重くなったんだろうと思ってました。
0 件のコメント :
コメントを投稿