[Project Settings] - [Input]
사용자의 입력을 받기 위해 키보드나 마우스의 각 키를 눌렀을 때 또는 누르지 않았을 때를 일정한 값으로 변환해주어야 한다.
1. 마우스 왼쪽 버튼을 Grab 동작으로 매핑하기
블루프린트에 게임플레이 요소 노출시키기
UFUNCTION
리플렉션 시스템을 사용하여 C++ 함수를 블루프린트 노드화할 수 있다
UFUNCTION(BlueprintCallable)
void Releas();
UFUNCTION(BlueprintCallable)
void Grab();
void UGrabber::Release()
{
UE_LOG(LogTemp, Display, TEXT("Release"));
}
void UGrabber::Grab()
{
//Grabber 컴포넌트의 현재 위치
FVector Start = GetComponentLocation();
//Grabber 컴포넌트의 시작 벡터와 forward 벡터를 더한 값 * 라인 트레이스의 최대 거리
//시작점에서부터 정면 방향으로 MaxGrabDistance만큼 이동한 지점이 끝점
//GetForwardVector() : 현재 컴포넌트의 정면 방향 벡터를 반환, 해당 컴포넌트가 바라보는 전방 방향
FVector End = Start + GetForwardVector() * MaxGrabDistance;
DrawDebugLine(GetWorld(), Start, End, FColor::Red);
FCollisionShape Sphere = FCollisionShape::MakeSphere(GrabRadius);
FHitResult HitResult;
//SweepSingleByChannel : bool값을 반환
//FQuat::Identity : 회전값이 없다
bool HasHit = GetWorld()->SweepSingleByChannel(HitResult, Start, End, FQuat::Identity, ECC_GameTraceChannel2, Sphere);
//충돌이 있다
if(HasHit)
{
//HitResult struct을 사용하여 구체 트레이스에 부딪힌 액터를 가져온다
AActor* HitActor = HitResult.GetActor();
//GetActorNameOrLabel()을 사용하여 액터의 이름을 가져온다
UE_LOG(LogTemp, Display, TEXT("Hit actor : %s"), *HitActor->GetActorNameOrLabel());
}
else
{
UE_LOG(LogTemp, Display, TEXT("No actor hit"));
}
}
C++ 씬 컴포넌트인 Grabber를 이벤트 그래프 창으로 끌어와 변수로 만들어준다.
Grabber 변수에서 노드를 끌어와 C++ 함수를 검색할 수 있다.