움직임을 SetActorLocation으로 제어했을 때 충돌처리에 관해 정리한 글이다.
tick함수에서 setactorlocation과 deltatime을 통해 액터의 움직임을 제어할 때
충돌처리가 안 되서 정리해봤다.
만약 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이 있는지 검사하고
태그를 통해 경계인지 확인햇다.
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을 발생시키고 싶다면 간단하다.
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() 매크로를 붙여야한다