LoginSignup
1
1

More than 1 year has passed since last update.

【UE】テレポート(壁は通り抜けるが、マップからは出ない)の作り方

Last updated at Posted at 2023-04-04

この記事はUE Blueprint初心者が書いたものです。コードは冗長である可能性が高いです。
より簡潔に作ることができそうであれば教えていただけると、とても嬉しいです。
適当Englishも優しい目で見逃してもらえると嬉しいです。

2023/4/1 Macro : PutKey_to_vectorが複数回発動してしまっていた問題を修正

テレポートの仕様と完成品

テレポートキー(IA_Teleport)を押すとEnhancedInput IA_Teleport_Directionで設定されたAxis3D (Vector)で得た方向にテレポートをします。もしIA_Teleport_Directionで設定したキーが押されていなかった場合、前方にテレポートします。
また、ここでいう前方はカメラの向いている方向なので上をむいて前方向テレポートをした場合、地面から高いところへテレポートします。

完成品は以下のblueprint共有サイトから

本体

途中ででてくるMacro : PutKey_to_vectorの内容

出てくる変数(その他、Tagの名前など)

変数名 種類 内容
default_Teleport_Range 変数 壁と当たらないときのテレポート距離
Teleport_Range 変数 実際にテレポートする距離
Tag_Playground タグ 通り抜けてほしくないアクターにつけるTag
PutKey_to_vector マクロ 折りたたむ機能を知らなかった
0,0,0 Counter 変数 何も押していないときにテレポートキーを押すと前方向テレポートをするためnにすべてが0かカウントする変数。冗長になっている原因。
(X/Y/Z) Vector 変数 3種類とも各々の頭文字での処理で使う。左/後ろ/下 方向はマイナスをかけないといけないためその処理をするために設定

解説

Macro : PutKey to vectorの解説

IA_Teleport_directionからもらったベクトルを分解しX,Y,Zを別々に処理しています。

image.png

上画像はXの処理のみを表示したもの
switch文で-1,0,1の3種類に更に分ける
Get Control Rotation(カメラの向いている方向)からGet Forward VectorでRotationからベクトルに変換。Xでは前後方向なのでForwardだが、Yでの処理ではGet Right Vector(角度から右方向ベクトルを取得)、Zでの処理は上下方向なのでGet Up Vector(角度から上方向ベクトルを取得)を使う。

-1のとき

これは後ろ方向キーを押している状態であるため、Forward Vectorを反転させる。
その反転したものをSETする

0のとき

押されていない状態なのでForward Vectorは使わない。一応、X_Vectorを(0,0,0)にSETする。
そして、全てが0か確認するために0,0,0 Conterを+1する。

1のとき

前方向キーをおしている状態なので、Forward VectorをそのままSETする。

上記3パターンの処理を同様にY,Zでも行う(詳しくはBPをみてね)

X,Y,Zの処理で得たものをまとめる & 0,0,0 Counterの処理

image.png
X,Y,Zで得たベクトルを全て足して、長さを1にしてGo vectorに値をいれている
長さを1にしないと斜め方向にてレポートした時に通常より長い距離テレポートしてしまうため
image.png
0,0,0 Counterが3のとき前方向のベクトルをセットしている。

複数回、実行ピンに出力されるのを回避する

image.png
EnterにはX/Y_vectorからの実行ノードとZ_VectorをSETしたあとに行われている0,0,0 Counterの数字によるSwitch on Intからの実行ノードがつながっている
ResetにはInputsノードの次にあるSequenceノードの1とつながっている
これにより、3種類すべてのノードが実行されてから一度だけ Outputsに実行が出力される
また、毎回このマクロに実行が送られると最初にDo Nノードをリセットするようになっている

Raycastの解説

image.png

プレイヤーの位置(GetActorLocation)からDefault_Teleport_Rangeの距離Raycastを飛ばしている
そして、Raycastがあたっているものの情報がOut Hitsから出てくるのでis not emptyで空(=あたっていない)か判断している。

あたっている場合

ForEachLoopを利用して当たった複数のアクターを手前から順番にTag_Playgroundを持っているか確認している

Tagを持っていた場合

そのアクターまでの距離を-52したものをTeleport_RangeにSETしてAdd Actor World Offsetに処理を流してテレポートするようにしている
なぜ-52するかというと、そのままの距離をテレポートすると半分壁にめりこんでしまうため

Tagを持っていなかった場合

Default_Teleport_RangeTeleport_RangeにSETしてAdd Actor World Offsetに処理を流してテレポートするようにしている

あたっていない場合

Tagを持っていなかった場合と同様の処理をしている
Default_Teleport_RangeTeleport_RangeにSETしてAdd Actor World Offsetに処理を流してテレポートするようにしている

あとがき

数々のQiitaの記事、ブログ、解説動画などを見てつくりました
先人の方々ありがとうございます
テレポートなどを多用した高機動なFPSゲームを作っているのでまた記事を書くかもしれません
読んでいただきありがとうございました

2023/4/1 Macro : PutKey_to_vectorが複数回発動してしまっていた問題を修正

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1