관리 메뉴

Mini

[UE5] 의존성 주입, mover-trigger간 통신하는 방법, 가고일올리면 문 내려가도록 구현 본문

UE5

[UE5] 의존성 주입, mover-trigger간 통신하는 방법, 가고일올리면 문 내려가도록 구현

Mini_96 2023. 9. 18. 00:54

1. Mover에서 public:setter 만듬

void UMover::SetShouldMove(bool NewShouldMove)
{
	ShouldMove = NewShouldMove;
}

 

2.trigger에서

mover.h 인클루드

멤버 UMover* mover 만듬

그 맴버(mover)에 의존성주입하는 함수 만듬 // 매개변수 명을 다르게 지어야함에 주의

void UTriggerComponent::SetMover(UMover* NewMover)
{
	Mover = NewMover;
}

 

3. 문BP에서

매개변수로 문에 달려있는 mover전달. => 의존성주입됨.

 

4. trigger-tick에서

mover의 setter 실행

void UTriggerComponent::TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction)
{
	Super::TickComponent(DeltaTime, TickType, ThisTickFunction);

	AActor* Actor = GetAcceptableActor();
	if (Actor != nullptr) {
		Mover->SetShouldMove(true);
	}
	else {
		Mover->SetShouldMove(false);
	}
	
}

 

5. 실행결과

생략

 

 

6. 문제 : 가고일이 문이내려가는중에 떨어짐 => 문이내려가면서 멈춤

 

7. 해결 : 물리엔진제거, 문에 붙여주기

https://mini-96.tistory.com/202

 

8. 문제2 : 사용자가 그랩중인데 문이 조각상을 가져가버림

 

9. 해결2 : 태그를 이용

- Grabber 에서

grab->tag추가

release->tag삭제

 

- trriger에서

actor의 태그검사 조건 추가

AActor* UTriggerComponent::GetAcceptableActor() const
{
	//액터들 포인터 저장하는 벡터
	TArray<AActor*> Actors;
	GetOverlappingActors(Actors);	//오버랩된 액터들을 포인터로 Actors에 담아줌.

	for (auto Actor : Actors) {
		//태그가 언락일때만 반응하도록

		//문제 : 사용자가 그랩중인데 문이 낚아채버림
		//해결 : 태그목록에 있음 and Grab중 아닌 액터만 리턴
		if (Actor->ActorHasTag(AcceptableActorTag) &&
			!Actor->ActorHasTag("Grabbed")) {
			return Actor;
		}

	}

	return nullptr;
}
void UGrabber::Release() {

	UPhysicsHandleComponent* PhysicsHandle = GetPhysicsHandle();
	if (PhysicsHandle == nullptr) return;

	//들고있는 물체가 있는경우
	if (PhysicsHandle->GetGrabbedComponent()) {
		//가고일 놓으면 태그삭제하기
		//(가고일이 액터임)
		AActor* GrabbedActor = PhysicsHandle->GetGrabbedComponent()->GetOwner();
		GrabbedActor->Tags.Remove("Grabbed");

		PhysicsHandle->ReleaseComponent(); //물체놓기
	}

}
void UGrabber::Grab() {

	UPhysicsHandleComponent* PhysicsHandle = GetPhysicsHandle();
	if (PhysicsHandle == nullptr) return;

	FHitResult HitResult;
	bool HasHit = GetGrabableInReach(HitResult);
	

	if (HasHit) {
		UE_LOG(LogTemp, Display, TEXT("on hit"));


		//유저가 잡으면 태그추가.
		HitResult.GetActor()->Tags.Add("Grabbed");