강의

멘토링

로드맵

Inflearn brand logo image

인프런 커뮤니티 질문&답변

qmal789님의 프로필 이미지
qmal789

작성한 질문수

이득우의 언리얼 프로그래밍 Part2 - 언리얼 게임 프레임웍의 이해

15강 게임의 완성

안녕하세요. 강의와는 별개의 내용이지만 질문드립니다.

작성

·

197

·

수정됨

0

선생님 강의를 전부 듣고 저만의 게임을 제작하고 있습니다.

강의 내용과 크게 상관은 없지만 여쭐 곳이 없어 질문합니다.

문제상황은 이렇습니다.

  1. 저는 PMAttack 이라는 트레이스채널을 하나 만들고 기본 설정은 Overlap으로 둔 상태입니다.

  2. 그리고 다음과 같은 코드를 통해 구 안에 들어오는 모든 액터를 찾아보려했습니다.

void APMArrowRain::HitOfRain()
{
	// 1초마다 데미지
	FVector Center = GetActorLocation();
	const float SphereRadius = 500.f;
	
	FCollisionShape CollisionSphere = FCollisionShape::MakeSphere(SphereRadius);
	FCollisionQueryParams Params(FName(TEXT("Attack")), false, this);
	
	TArray<FOverlapResult> Overlaps;
	
	DrawDebugSphere(GetWorld(), Center, SphereRadius, 12, FColor::Green, false, 1.0f, 0, 2.0f);
	
	bool bIsHit = GetWorld()->OverlapMultiByChannel(
		Overlaps, // 결과를 저장할 배열
		Center, // 중심점
		FQuat::Identity, // 회전
		ECollisionChannel::ECC_GameTraceChannel2, // 채널(PMAttack)
		CollisionSphere, // 콜리전 형태
		Params // 추가 파라미터
	);

	if (bIsHit)
	{
		for (auto& Overlap : Overlaps)
		{
			AActor* OverlapActor = Overlap.GetActor();
			if (OverlapActor == Owner)
			{
				UE_LOG(LogTemp, Log, TEXT("asd"));

				continue;
			}
			if (OverlapActor)
			{
				// 데미지를 받는 인터페이스를 생성해서 인터페이스가 구현됐는지 확인

				UE_LOG(LogTemp, Log, TEXT("%s"), *OverlapActor->GetName());
			}
		}
	}
}

 

  1. 하지만 코드를 실행해보면 주변에 있는 액터(큐브나 플레인, 그리고 Owner 등)이 아무도 로그에 찍히지 않았습니다.

(모든 액터는 Overlap event를 전부 true로 설정했습니다.)

  1. 문제는 여기부터 입니다. 범위에 들어오는 액터중 하나라도 ColiisionPreset에서 PMAttack에 대한 채널 반응을 Block으로 바꿀 경우 그 때부터 정상적으로 범위에 있는 액터들이 출력됩니다.


  2. 오랜 시간 조사를 했지만 끝내 해답을 얻지 못해 질문드립니다.

 

왜 범위 내 모든 액터의 콜리전 설정이 특정 채널에 대해 Overlap 인 경우 일땐 위 코드가 정상적으로 동작하지 않고,

왜 범위 내 액터 중 하나만 이라도 Block으로 설정되어 있다면 그제서야 모든 액터에 대해 정상적으로 Overlap 판정이 날까요?

긴 글 읽어주셔서 감사합니다.

답변 2

0

이득우님의 프로필 이미지
이득우
지식공유자

안녕하세요.
이게 좀 헷갈리는 부분인데, C++ Overlap 함수를 사용할 때는 기본적으로 대상 물체에 block 설정이 있어야 감지됩니다. ㅎㅎ

0

안녕하세요, 인프런 AI 인턴입니다. qmal789님.

언리얼 엔진에서의 충돌 설정과 이벤트 처리 방식은 복잡할 수 있으며, 특히 특정 채널에 대해 오버랩(Overlap)과 블록(Block) 설정이 섞여 있을 때 예상치 못한 동작을 할 수 있습니다. 질문하신 내용을 바탕으로 몇 가지 고려할 점을 안내드리겠습니다.

  1. 트레이스 채널과 프로파일 설정: Overlap 이벤트는 두 객체가 서로 오버랩 상태에 있을 때 실행됩니다. 이 때, 채널 설정이 모두 Overlap으로 되어 있으면 간혹 문제가 발생할 수 있습니다. 일반적으로 AllOverlap 설정된 상태에서는 다른 채널의 설정에 따라 오버랩 이벤트 발생이 미묘하게 영향을 받을 수 있습니다. 하나의 액터가 Block으로 설정되면 물리 연산이 조금 더 명시적인 경로를 가지게 되어 예상한 대로 작동하게 되는 경우가 발생할 수 있습니다.

  2. 충돌 세팅과 Query 파라미터: FCollisionQueryParams 를 설정할 때 소유자나 무시할 객체를 명시적으로 추가 설정하셔야 제대로 된 결과가 나올 수 있습니다. 코드에서 CollisionQueryParams가 올바르게 설정되어 있는지 확인해 보시기 바랍니다.

  3. 물리 엔진과의 상호작용: 언리얼 엔진에서 충돌 처리의 일부는 외부 물리 엔진에서 처리되기 때문에, 이 과정에서 특정 채널이나 객체에 대한 연산이 예상과 다르게 이루어질 수 있습니다. 이때, 다양한 물리 엔진과의 상호작용이 문제가 될 수 있음을 유의하십시오.

질문 내용과 유사한 문제를 논의한 가능한 답변 링크를 몇 가지 첨부합니다:

이러한 링크들은 비슷한 문제를 해결하는 데 도움이 되는 정보를 제공할 수 있을 것입니다. 기본적으로 알맞은 충돌 설정과 물리 채널 설정을 확인하는 것이 좋습니다.

질문하신 내용이 복잡한 설정 문제로 보이므로, 특정 조건과 상황을 정확히 분석하여 해결하는 것이 필요합니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

qmal789님의 프로필 이미지
qmal789

작성한 질문수

질문하기