GetOverlappingActors : 액터가져오기
AActor* UTriggerComponent::GetAcceptableActor() const
{
TArray<AActor*> Actors;
GetOverlappingActors(Actors);
for (AActor* Actor : Actors)
{
bool HasAcceptableTag = Actor->ActorHasTag(AcceptableActorTag);
bool IsGarbbed = Actor->ActorHasTag("Grabbed");
if (HasAcceptableTag && !IsGarbbed)
{
return Actor;
}
}
return nullptr;
}
셋팅해놓은 태그가 붙어있고 Grabbed가아니면 액터를 반환.
UPrimitiveComponent : "기본적인 렌더링 기능 컴포넌트 클래스"
void UGrabber::Grab()
{
UE_LOG(LogTemp, Display, TEXT("Grab"));
UPhysicsHandleComponent* PhysicsHandle = GetPhysicsHandle();
if (PhysicsHandle == nullptr)
{
return;
}
FHitResult HitResult;
if (GetGrabberableInReach(HitResult))
{
UPrimitiveComponent* HitComponent = HitResult.GetComponent();
HitComponent->SetSimulatePhysics(true);
HitComponent->WakeAllRigidBodies();
AActor* HitActor = HitResult.GetActor();
HitActor->Tags.Add("Grabbed");
HitActor->DetachFromActor(FDetachmentTransformRules::KeepWorldTransform);
PhysicsHandle->GrabComponentAtLocationWithRotation(
HitResult.GetComponent(),
NAME_None,
HitResult.ImpactPoint,
GetComponentRotation()
);
}
}
HitActor->Tags.Add("Grabbed"); : 동적으로 Tag추가
HitActor->DetachFromActor(FDetachmentTransformRules::KeepWorldTransform); : Actor의 RootComponent를 현재 연결되어 있는 모든 SceneComponent에서 분리
석상이 놓여있으면 트리거로 인해 철장이 열리고 잡는 순간 다시 철장이 내려옴
같은 속성의 액터오브젝트로 바꿔치기