언리얼

Unreal) GetOverlappingActors, DetachFromActor

HJH0825 2024. 11. 2. 21:09

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에서 분리

 

석상이 놓여있으면 트리거로 인해 철장이 열리고 잡는 순간 다시 철장이 내려옴

 

 

같은 속성의 액터오브젝트로 바꿔치기