오브젝트에 태그 추가 & 삭제

Jihyun·2023년 12월 22일
0

Unreal

목록 보기
11/11

현재 오브젝트를 잡고 있으니, 현재 잡은 오브젝트를 다른 컴포넌트가 잡을 수 없다고 알린다.

오브젝트에 태그 추가 & 삭제

동상 오브젝트에 태그를 추가하여 플레이어가 동상을 놓기 전까지 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;

}
profile
잊어버려도 다시 리마인드 할 수 있도록 공부한 것을 기록합니다

0개의 댓글