[언리얼] SetActorLocation 충돌처리

jh Seo·2024년 11월 21일

언리얼

목록 보기
15/18

개요

움직임을 SetActorLocation으로 제어했을 때 충돌처리에 관해 정리한 글이다.

tick함수에서 setactorlocation과 deltatime을 통해 액터의 움직임을 제어할 때
충돌처리가 안 되서 정리해봤다.

block처리된 액터

FHitResult로 처리

만약 collision profile에서 block처리된 액터와 충돌처리를 하기 위해선
SetActorLocation의 bSweep인자를 true로 설정해줘야한다.

그리고 FHitResult타입의 구조체를 만들어서 인자로 넣어줘야한다.

	FHitResult HitResult;
	SetActorLocation(NewLocation,true,&HitResult);

이런식으로
그 후, HitResult구조체에 담긴 정보로 처리해주면 된다.

	if ( HitResult.IsValidBlockingHit() )
	{
		if(HitResult.GetActor()->Tags.Contains(TagNames::Border))
		{
			Destroy();
		}
	}

IsValidBlockingHit를 통해 block액터와 hit이 있는지 검사하고
태그를 통해 경계인지 확인햇다.

Notifyhit함수 override를 이용

	UFUNCTION()
	virtual void NotifyHit(
		UPrimitiveComponent* MyComp 
		, AActor* Other 
		, UPrimitiveComponent* OtherComp 
		, bool bSelfMoved 
		, FVector HitLocation 
		, FVector HitNormal 
		, FVector NormalImpulse 
		, const FHitResult& Hit
	) override;

이렇게 NotifyHit함수를 구현해주면 굳이 FHitResult안사용하고 그냥

SetActorLocation(NewLocation,true);

이렇게 위치를 변경해도 NotifyHit함수가 호출이 된다.

overlap처리 액터

액터와 overlap을 발생시키고 싶다면 간단하다.
bsweep여부와 상관없이 움직이는 액터의 OnComponentBeginOverlap델리게이트에
등록해주면된다.

	Collider->OnComponentBeginOverlap.AddDynamic(this , &ThisClass::OnPlayerOverlap);

onComponentBeginOverlap델리게이트에 등록될 함수의 인자는

	UFUNCTION()
	virtual void OnPlayerOverlap
	(
		UPrimitiveComponent* OverlappedComponent
		, AActor* OtherActor
		, UPrimitiveComponent* OtherComp
		, int32 OtherBodyIndex
		, bool bFromSweep
		, const FHitResult& SweepResult
	);

이다.
당연한 소리지만 함수가 delegate에 등록되려면 UFUNTION() 매크로를 붙여야한다

profile
코딩 창고!

0개의 댓글