【UE4 C++】LineTraceに苦しめられた話　~ブループリントとC++で名前が一致する関数が無いぞ！？~

# 挨拶
皆さんお体元気でしょうか。自分は12月の寒波で足先がホントに冷たくて、足先の感覚が一日の半分くらいは無くなってる気がします。:tired_face:

まあそんなことはおいといて、さっそく行きましょう。

## 状況
作成しているゲームの移動処理を書く際に、ブループリントで先に処理を作ってC++のコードに落とし込んでいました。
その時に陥ったLineTraceの種類間違いについてです。
環境はue4.27、VS2022、Windows10です。


## １：最初はSingleLineTraceを使っていた。がしかし...
ブループリントでLineTraceByChannelを使っている場所があったので、とりあえず検索で 「ue4 LineTraceByChannel C++」 と検索しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3599502/addf1ff8-03fd-b468-a8c0-1d64f0af8671.png)
検索の結果、同じ名前のC++関数はありませんでした。
なのでとりあえず名前が似ていて、検索上位に来たSingle Line Trace関数を最初は使用していました。
しかし、コードを書いていくうちに、
「なんか挙動がブループリントの時と一致しないな...:thinking:　しかもこれ、引数の数も場所も違いすぎね？」となりました。

## ２：ブループリントで確認すると？
あまりに違うためブループリントの方にカーソルを合わせて場所を確認したところ...
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3599502/c2088ccf-48c0-390d-24a3-dd52d1fc95b8.png)

なんと全然違うクラスが表示されてる..!（カーソル合わせて出てくるの、教えてもらって初めて知りました:hushed:）
なにはともあれ、Kismet System Libraryというところにあるのがわかったので、コード内部で検索を掛けて探しに行きました。

すると...
同じような処理を発見！:santa_tone2:

```php

/**
	 * Does a collision trace along the given line and returns the first blocking hit encountered.
	 * This trace finds the objects that RESPONDS to the given TraceChannel
	 * 
	 * @param WorldContext	World context
	 * @param Start			Start of line segment.
	 * @param End			End of line segment.
	 * @param TraceChannel	
	 * @param bTraceComplex	True to test against complex collision, false to test against simplified collision.
	 * @param OutHit		Properties of the trace hit.
	 * @return				True if there was a hit, false otherwise.
	 */
	UFUNCTION(BlueprintCallable, Category="Collision", meta=(bIgnoreSelf="true", WorldContext="WorldContextObject", AutoCreateRefTerm="ActorsToIgnore", DisplayName="LineTraceByChannel", AdvancedDisplay="TraceColor,TraceHitColor,DrawTime", Keywords="raycast"))
	static bool LineTraceSingle(const UObject* WorldContextObject, const FVector Start, const FVector End, ETraceTypeQuery TraceChannel, bool bTraceComplex, const TArray<AActor*>& ActorsToIgnore, EDrawDebugTrace::Type DrawDebugType, FHitResult& OutHit, bool bIgnoreSelf, FLinearColor TraceColor = FLinearColor::Red, FLinearColor TraceHitColor = FLinearColor::Green, float DrawTime = 5.0f);
	
```
引数の数を見る感じ
#include "Kismet/KismetSystemLibrary.h"をincludeし、UKismetSystemLibrary::LineTraceSingleを使えば同じ処理が書けそうだと思いました。


## ３：コードを書いて挙動確認
使用してみたところ、レイを飛ばして当たっている場所がどうやらおかしく、ブループリントと挙動が違います！
具体的には、何にも当たっていないのにtrueになってしまう状態でした。
なぜだろうと２時間ぐらい調べたところ...
```php
TArray<AActor*>{ },
```
ここの部分で自身のコリジョンに当たっているため、常にhitしてtrueが返ってくることが判明しました。


そこで、直す方法として
```php
TArray<AActor*>{ this },						
```
と書けば自身を無視してレイを飛ばしてくれるので、自分の中央からレイを飛ばしても自身に当たらずブループリントと同じ挙動になりちゃんと動きました！
良かった！:robot:

## UKismetSystemLibrary::LineTraceSingle関数の例
一応使用した際のコードとパラメータの意味についてです。
ブループリントのLineTraceByChannelと大体の引数は一致しているので、間違えてはないはずですが、間違ってたらすいません。
ちなみにちゃんと.cppで#include "Kismet/KismetSystemLibrary.h"しないと動かないので注意！

```php
//bHitTrace1はhitしていたらtrueを返す。
//bhitTrace1は、ヘッダーでbool bhitTrace1と宣言。
//hitF1はローカルでHitResult hitF1と宣言。
	bHitTrace1 = UKismetSystemLibrary::LineTraceSingle(
		GetWorld(),												// ワールドへのポインタ
		GetActorLocation(),										// トレースの始点（アクターの現在の位置から）
		GetActorLocation() + (GetNormalizeVector1() * 200.0f),  // トレースの終点
		UEngineTypes::ConvertToTraceType(ECC_Visibility),		// トレースの対象となるコリジョン チャネル
		false,													// 詳細なコリジョン情報を得るかどうか (falseなら得ない)
		TArray<AActor*>{ this },								// 自身を無視するために自身を配列に追加									
		EDrawDebugTrace::ForDuration,							// デバッグ表示の設定
		hitF1,													// トレースの結果を格納するHitResult構造体
		true,                                                   // ヒット情報を保持するかどうか (trueなら保持する)
        FColor::Green,                                          // 当たってない時の色
		FColor::Red,                                            // 当たっている時の色
        -1.0f                                                   // レイの描画時間
	);
```
これを参考にしてもらえればブループリントのLineTraceByChannelと同じような処理ができると思います。

## 感想
ブループリントにカーソルを合わせている時にクラス名が表示されるのを最初は知らず、他のことで質問をした際に教えてもらいました。
（おま環でブループリントをダブルクリックしてもC++コードに飛べないってことも、この時に知りました:cry:）

そもそもなんで同じ関数が用意されてないんでしょう。謎ですね..:worried:

以上です。私がQiitaを書くのはこれで2記事目です。
見出しとか初めて使ったので、見づらかったら次回から改善していきます。

日々精進、日々成長。



## 最後に
最後に一応公式のドキュメント貼っておきます。
自分の検索エンジンだと検索上位に来なかったので、同じ被害者の方を増やさないために貼っておきます:cow:

UKismetSystemLibrary::LineTraceSingleについて↓
https://docs.unrealengine.com/4.27/en-US/API/Runtime/Engine/Kismet/UKismetSystemLibrary/LineTraceSingle/

UKismetSystemLibraryについて↓
https://docs.unrealengine.com/4.27/en-US/API/Runtime/Engine/Kismet/UKismetSystemLibrary/