LineTrace
레이캐스트와 트레이스
지오메트리
가 있으면 어떤 작업을 할 수 있도록 걸린 것을 반환합니다.블루프린트 LineTrace
Line Trace는 특정 지점에서부터 직선 상의 충돌 감지(검사)를 수행하는 기능
Line Trace의 주요 사용 사례
콜루젼 필터링 사이트
https://www.unrealengine.com/ko/blog/collision-filtering
구조체(Structure)
구조체 예제
USTRUCT(BlueprintType) // 블루프린트에서도 사용가능한 매크로
struct FMyGameStruct // F를 반드시 붙여야된다 블루프린트 연계시 반드시
{
GENERATED_BODY()
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "State")
int32 Health;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "State")
int32 Stamina;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "State")
float strength;
FMYGameStart()
:Health(100), Stamina(100), strength(50.0f)
{}
};
언리얼 엔진 구조체 Document
https://dev.epicgames.com/documentation/en-us/unreal-engine/structs-in-unreal-engine
안전한 관리
를 돕습니다.tip
- 안전한 관리
- 얕은 복사
- 얕은 복사는 아주 최소한만 복사를 한다.
- 값을 복사한다 하더라도, 인스턴스가 메모리에 새로 생성되지 않는다. 값 자체를 복사하는 것이 아니라 주소값을 복사하여 같은 메모리를 가리키기 때문이다.
- 깊은 복사
- 데이터 자체를 통째로 복사한다.
- 복사된 두 객체는 완전히 독립적인 메모리를 차지한다.
- value type의 객체들은 깊은 복사를 하게 된다.
- safeptr -> 메모리 누수를 안전하게 방지하는 주소포인터
LineTrace
void ACTPSPlayer::InputInteraction(const FInputActionValue& value)
{
// 시작점
FVector _Start = GetActorLocation();
// 끝점
FVector _End = _Start + GetActorForwardVector()* 2000.0f;
// Trace 결과 값 struct = BreakResult
FHitResult _HitOut;
FCollisionQueryParams _TraceParams;
//
GetWorld()->
LineTraceSingleByChannel(
_HitOut,
_Start,
_End,
ECollisionChannel::ECC_Visibility,
_TraceParams);
// true : 계속 살아있을껀지
DrawDebugLine(GetWorld(), _Start, _End, FColor::Green, true, 10.0f);
}
사용 예시 )
- AddIgnoreActor로 특정 액터를 트레이스 대상에서 제외
FCollisionQueryParams IgnoreOwner = FCollisionQueryParams::DefaultQueryParam;
IgnoreOwner.AddIgnoredActor(GetOwner());
void ACTPSPlayer::InputInteraction(const FInputActionValue& value)
{
#pragma region sigle Trace
/*
// 시작점
FVector _Start = GetActorLocation();
// 끝점
FVector _End = _Start + GetActorForwardVector()* 2000.0f;
// Trace 결과 값 struct = BreakResult
FHitResult _HitOut;
FCollisionQueryParams _TraceParams;
//
GetWorld()->LineTraceSingleByChannel(_HitOut, _Start, _End, ECollisionChannel::ECC_Visibility, _TraceParams);
// true : 계속 살아있을껀지
DrawDebugLine(GetWorld(), _Start, _End, FColor::Green, true, 10.0f);
*/
#pragma endregion
#pragma region Multi Trace
FVector _Start = GetActorLocation();
FVector _End = _Start + GetActorForwardVector() * 2000.0f;
TArray<FHitResult> _HitOut;
FCollisionQueryParams _TraceParams;
GetWorld()->LineTraceMultiByChannel(_HitOut, _Start, _End, ECC_GameTraceChannel1, _TraceParams);
// ECC_GameTraceChannel1-> Collision Profile 셋팅에 직접 만든 첫번째 채널
//DrawDebugLine(GetWorld(), _Start, _End, FColor::Red, true, 10.0f);
// 맞은 적들을 표시할때
for (const FHitResult& Hit : _HitOut)
{
// 충돌한 지점
FVector HitLocation = Hit.ImpactPoint;
// 시작 지점에서 충동한 지점까지 디버그 라인 그리기
DrawDebugLine(GetWorld(), _Start, _End, FColor::Green, true, 10.0f, 0, 1.f);
DrawDebugSphere(GetWorld(), HitLocation, 10.0f, 12, FColor::Blue, true, 5.0f);
_Start = HitLocation;
}
#pragma endregion
}