Unreal Engine/Trouble Shooting

Lyra (5.5.4)에서 SKM_Manny에 OnlyOwnerSee, OwnerNoSee 적용이 안되는 오류

J00n 2025. 8. 19. 19:02

언리얼 엔진 5.5.4 버전의 라이라(Lyra) 샘플 프로젝트를 기반으로 프로젝트를 진행 중에 발생한 오류이다.

 

1인칭 시점 구현의 정석적인 방법은 두 개 이상의 스켈레탈 메시 컴포넌트를 사용하는 것이다.

플레이어 자신에게만 보이는 1인칭 메시(OnlyOwnerSee 활성화)와 다른 플레이어들에게 보이는 3인칭 메시(OwnerNoSee 활성화)를 사용하는 것이다.

Camera Component에 First Person Mesh를 추가하였다.

 

Experience에서 사용 할 Lyra Character 하위 클래스에는 First Person Mesh를 추가하여 1인칭 메시를 추가하였다.

Lyra에서 Character Parts Costmetic 시스템은 기본적으로 B_Manny에셋의 스켈레탈 메시 에셋 SKM_Manny를 이용한다. 
해당 에셋을 1인칭, 3인칭용 스켈레탈 메시 컴포넌트에 모두 적용하도록 만들었다.

그 후 1인칭 메시에는 OnlyOwnerSee를 true로, 3인칭 메시에는 OwnerNoSee를 true로 설정했다.

 

하지만 예상과 달리 3인칭 메시는 여전히 화면에 렌더링 되고, 다른 플레이어의 1인칭 메시는 레벨의 (0, 0, 0) 위치에

스폰되어 렌더링 되었다.

이상하지만 화면에 보이는 다리는 1인칭 메시이고 (0, 0, 0) 위치에 클라이언트 1 (빨간색)은 클라이언트 2(파란색)의 1인칭 메시가 보인다. 그리고 3인칭 메시도 각 클라이언트 화면에도 렌더링 된다.

원인 탐색

처음에는 블루프린트 로직이나 액터의 소유권(Ownership) 설정에 문제가 있을 것으로 추측했다.

일단 Lyra에서는 Character Parts 시스템을 적용하여, Pawn(또는 Character)에 적용된 메시 외에 별도로 '메시 파츠'를 적용하기 한다. 그리고 TPS에서 FPS로 시점을 변환한 순간, 3인칭 시점의 파츠들은 1인칭 시점에서 보이면 안된다.

 

따라서 우선 FLyraCharacterPartList::SpawnActorForEntry 함수 내에 새롭게 스폰한 파츠들의 Owner를 설정하는 코드를 추가하였다.

bool FLyraCharacterPartList::SpawnActorForEntry(FLyraAppliedCharacterPartEntry& Entry)
{
	bool bCreatedAnyActors = false;

	if (ensure(OwnerComponent) && !OwnerComponent->IsNetMode(NM_DedicatedServer))
	{
		if (Entry.Part.PartClass != nullptr)
		{
			UWorld* World = OwnerComponent->GetWorld();

			if (USceneComponent* ComponentToAttachTo = OwnerComponent->GetSceneComponentToAttachTo())
			{
				const FTransform SpawnTransform = ComponentToAttachTo->GetSocketTransform(Entry.Part.SocketName);

				UChildActorComponent* PartComponent = NewObject<UChildActorComponent>(OwnerComponent->GetOwner());

				PartComponent->SetupAttachment(ComponentToAttachTo, Entry.Part.SocketName);
				PartComponent->SetChildActorClass(Entry.Part.PartClass);
				PartComponent->RegisterComponent();
				
				if (AActor* SpawnedActor = PartComponent->GetChildActor())
				{
					// Character Parts 들의 Owner및 OwnerNoSee 설정
					SpawnedActor->SetOwner(OwnerComponent->GetOwner());
					
					TArray<UPrimitiveComponent*> PrimitiveComponents;
					SpawnedActor->GetComponents<UPrimitiveComponent>(PrimitiveComponents);
					for (UPrimitiveComponent* PrimitiveComponent : PrimitiveComponents)
					{
						if (PrimitiveComponent)
						{
							PrimitiveComponent->SetOwnerNoSee(true);
						}
					}
					
					switch (Entry.Part.CollisionMode)
					{
					case ECharacterCustomizationCollisionMode::UseCollisionFromCharacterPart:
						// Do nothing
						break;

					case ECharacterCustomizationCollisionMode::NoCollision:
						SpawnedActor->SetActorEnableCollision(false);
						break;
					}

					// Set up a direct tick dependency to work around the child actor component not providing one
					if (USceneComponent* SpawnedRootComponent = SpawnedActor->GetRootComponent())
					{
						SpawnedRootComponent->AddTickPrerequisiteComponent(ComponentToAttachTo);
					}
				}

				Entry.SpawnedComponent = PartComponent;
				bCreatedAnyActors = true;
			}
		}
	}

	return bCreatedAnyActors;
}

 

하지만 문제는 여전히 발생하였다. 보이지 않게 설정한 3인칭 파츠는 여전히 렌더링 되고, 다른 플레이어의 1인칭 시점의 메시가 레벨의 (0, 0, 0) 위치에 스폰되어 렌더링 된다.

 

문제의 원인은 다른 곳에 있었다.

Lyra에서 제공되는 SKM_Manny 스켈레탈 메시 애셋 대신 다른 프로젝트에서 SKM_Manny를 가져와 교체했다.

OwnerNoSee와 OnlyOwnerSee가 의도한 대로 작동하는 것을 확인했다.

 

따라서 원인은 Lyra의 SKM_Manny 애셋 자체에 있다고 판단했다.

원인 발견: SKM_Manny의 나나이트 지원 활성화

각 SKM_Manny 애셋의 디테일 패널을 비교한 결과 Lyra의 SKM_Manny에서는 '나나이트 세팅(Nanite Settings)' 항목의 '나나이트 지원 활성화(Enable Nanite Support)' 옵션이 활성화 된 것을 확인하였다.

 

마찬가지로 동일한 문제를 다루는 에픽 개발자 포럼을 찾을 수 있었다.

https://forums.unrealengine.com/t/ue5-5-lyras-default-mesh-wont-effect-by-setownernosee/2219917

 

UE5.5: Lyra's default mesh won't effect by SetOwnerNOSee

As the title saied, If I set the Mesh(CharacteMesh0) in B_Gero_ShooterMannequin SetOwnerNoSee, I can still see the lyra model (B_Manny), but if I change the B_Manny’s Skeletal Mesh Asset from SKM_Manny to SK_MannyQuin, the model will act normally. I thin

forums.unrealengine.com

 

기술적 원인 분석: 기존 시스템과 새로운 렌더링 파이프라인의 충돌(예상)

아마도 OnlyOwnerSee와 OwnerNoSee는 CPU 주도 렌더링 파이프라인에서 사용되고, 나나이트는 새로운 GPU 주도 파이프라인으로 알고 있다. 이 둘이 호환이 되지 않는 것이 원인이라 생각된다. 추가적인 조사가 필요하다.

해결 방법 위한 몇 가지 방법을 확인하였다.

1. 빠른 해결책: 나나이트 비활성화

가장 빠른 해결책은 SKM_Manny 애셋의 '나나이트 지원 활성화' 옵션을 끄는 것이다.

2. 그 외 해결책: 1인칭 렌더링 시스템 활용 (아직 확인되지 않음)

엔진 5.6 버전 문서부터 1인칭 렌더링 문서가 추가되었다.

https://dev.epicgames.com/documentation/en-us/unreal-engine/first-person-rendering


이 가이드라인을 이용해서 나나이트와 호환이 되는지 추후 확인 할 예정이다.

결론

최신기술이 적용되는 Lyra 프로젝트의 경우 아직도 어렵다고 느껴진다. 실제 프로젝트를 만들어보면서 최대한 에픽의 방향성을
이해해 보려고 한다.