알아두면 좋은 것들(언리얼 관련 여러 잡다한 정보)

SweepMultiByChannel() 을 이용한 액터 감지

Turtle_Jun 2025. 8. 25. 22:50

SweepMultiByChannel() 의 시각적 다이어그램은 아래와 같다.

시작 위치부터 끝 지점까지 특정 Collision 도형을 가지고 범위내에 Hit 되는 모든 것(Multi)들의 값들을 얻어 올 수 있다.

 

 

SweepMultiByChannel 의 원본은 아래와 같다.

bool UWorld::SweepMultiByChannel(
    TArray<struct FHitResult>& OutHits,		// 함수 실행 후 여기에 모든 충돌 정보가 저장됨
    const FVector& Start,
    const FVector& End,
    const FQuat& Rot,
    ECollisionChannel TraceChannel,
    const FCollisionShape& CollisionShape,
    const FCollisionQueryParams& Params,
    const FCollisionResponseParams& ResponseParam
) const

 

위 파라미터들을 참고하여 아래처럼 사용할 수 있다.

 

 

	TArray<FHitResult> HitResults;		// 히트될 저장 값들 
	FCollisionQueryParams Params(NAME_None, false, this);

	bool bResult = GetWorld()->SweepMultiByChannel(
		HitResults,
		GetActorLocation(),
		GetActorLocation() + AttackMeleeRange * GetActorForwardVector(),
		FQuat::Identity,
		ECC_ATTACK,
		FCollisionShape::MakeSphere(AttackMeleeRadius),
		Params
	);

 

TArray<FHitResult> HitResults;
// 함수 실행 후 여기에 모든 충돌 정보가 저장됨

 

GetActorLocation() : 탐지를 시작할 위치

GetActorLocation() + AttackMeleeRange * GetActorForwardVector() : 시작 위치에서 전방으로 Range 만큼의 곱한 거리(끝 위치)

FQuat::Identity : 탐지할 도형의 회전 값으로 Identity 는 회전이 없는 설정

다른 회전 옵션은 아래와 같다.

// 회전 없음 (가장 일반적)
FQuat::Identity

// 특정 각도 회전
FQuat::MakeFromEuler(FVector(0.0f, 0.0f, 45.0f))  // Z축으로 45도

// 액터 회전값 사용
GetActorRotation().Quaternion()

// 방향 벡터에서 회전값 생성
FQuat::FindBetweenNormals(FVector::ForwardVector, TargetDirection)

 

ECC_ATTACK : 콜리전 채널로 감지하고자하는 콜리전 채널을 설정

(필자는 Attack이라는 Trace 채널을 새로만들어둔 후 프로젝트 헤더 파일에서 아래처럼 매크로 정의를 해뒀다.) 

 

프로젝트 파일의 헤더파일에서 설정을 해줘야함 (필자의 프로젝트 파일은 Sparta_Basic_A_Study)

- Sparta_Basic_A_Study.h

 

FCollisionShape::MakeSphere()

Sweep 에 사용할 도형 정의로 파라미터 값으로 반경을 주어 감지할 범위를 설정할 수 있다.

 

사용가능한 다른 도형들은 아래와 같다.

// 구체 (Sphere)
FCollisionShape::MakeSphere(float Radius)
FCollisionShape::MakeSphere(100.0f)  // 반지름 100

// 박스 (Box)
FCollisionShape::MakeBox(FVector HalfExtents)
FCollisionShape::MakeBox(FVector(50.0f, 50.0f, 100.0f))

// 캡슐 (Capsule)
FCollisionShape::MakeCapsule(float Radius, float HalfHeight)
FCollisionShape::MakeCapsule(50.0f, 100.0f)  // 반지름 50, 반높이 100

 

Params : 

충돌 응답 파라미터