현재 오브젝트를 잡고 있으니, 현재 잡은 오브젝트를 다른 컴포넌트가 잡을 수 없다고 알린다.
동상 오브젝트에 태그를 추가하여 플레이어가 동상을 놓기 전까지 Mover 컴포넌트가 동작을 할 수 없다
void UGrabber::Grab()
{
UPhysicsHandleComponent* PhysicsHandle = GetPhysicsHandle();
if(PhysicsHandle == nullptr)
{
return;
}
FHitResult HitResult;
bool HasHit = GetGrabbableInReach(HitResult);
if(HasHit)
{
UPrimitiveComponent* HitComponent = HitResult.GetComponent();
HitComponent->WakeAllRigidBodies();
//충돌한 액터를 가져와 태그를 추가한다
HitResult.GetActor()->Tags.Add("Grabbed");
DrawDebugSphere(GetWorld(),HitResult.Location, 10, 10, FColor::Green, false, 5);
DrawDebugSphere(GetWorld(),HitResult.ImpactPoint, 10, 10, FColor::Red, false, 5);
PhysicsHandle->GrabComponentAtLocationWithRotation(
//HitResult.GetComponent(),
HitComponent,
NAME_None,
HitResult.ImpactPoint,
GetComponentRotation()
);
}
}
void UGrabber::Release()
{
UPhysicsHandleComponent* PhysicsHandle = GetPhysicsHandle();
if(PhysicsHandle == nullptr)
{
return;
}
if(PhysicsHandle->GetGrabbedComponent() != nullptr)
{
//잡은 액터의 태그를 삭제
AActor* GrabbedActor = PhysicsHandle->GetGrabbedComponent()->GetOwner();
GrabbedActor->Tags.Remove("Grabbed");
PhysicsHandle->GetGrabbedComponent()->WakeAllRigidBodies();
PhysicsHandle->ReleaseComponent();
}
}
if문 안에 조건문을 2개 이상 사용할 수 있다
AActor* UTriggerComponent::GetAcceptableActor() const
{
TArray<AActor*> Actors;
GetOverlappingActors(Actors);
for(AActor* Actor : Actors)
{
bool HasAcceptableTag = Actor->ActorHasTag(AcceptableActorTag);
bool IsGrabbed = Actor->ActorHasTag("Grabbed");
//액터가 해당 태그(AcceptableActorTag)를 가지고 있는지 확인
//잡혀있지 않는 상태인지 확인
if(HasAcceptableTag && !IsGrabbed)
{
return Actor;
}
}
return nullptr;
}