Unreal Project Acero#17(MiniMap)

공팡팡·2025년 4월 17일

Unreal - Project Acero

목록 보기
4/10

Minimap의 형태는 비교적 간단하게 만들 수 있다.

SpringArm을 통해 미니맵을 찍는 2D Scene Capture Component를 캐릭터의 머리 위에 두고, 매 프레임마다 해당 사진을 업데이트시키면 그게 미니맵이다.

대략 이런 형태로 구비 후에, Scene Capture의 텍스쳐 타겟을 인스턴스 형태로 만들고, 이를 Widget에 박아넣으면 된다.


대략 이런식의 UMG에서 파란색으로 보이는 불투명한 이미지 대신 아까 만들어둔 렌더타겟을 넣어두면 된다. 렌더 타겟의 경우 별도의 조작없이도 실시간으로 프레임을 갱신시켜 전달해주기 때문에 사용도 간단하다고 할 수 있다.

싱글 플레이의 경우 여기까지 해줘도 되지만, 멀티플레이의 경우는 다르다. 당연히 각 캐릭터마다 렌더타겟이 있을것이고, 기존에 만들어둔 렌더타겟으로 하게 되는 경우라면 단 한명의 플레이어 미니맵만 볼 수 있을 것이다.

예상 했듯이, 이런 경우는 모든 캐릭터에게 동적으로 Render Target을 만들고 할당한 뒤, Widget에 박아넣어줘야 한다.


생성자는 대충 이렇게 만들어주고, 중요한건 렌더타겟의 생성에 관해서다.

초기에는 렌더타겟도 생성자에 넣어줬었는데, Character에서 자꾸만 RenderTarget 텍스쳐를 불러오지 못하고 null값만 뜨길래, 한참을 헤맸었다.

나중에서야 발견하였는데 렌더 타겟은 동적으로 생성되기에, 캐릭터가 만들어지고 후에 해당 Target을 집어넣어줘야하는 형태이다. 즉 런타임중에 Target을 촬영하고 이를 넘겨주는 형태로 가야한다.

void ACDPlayerController::SetMinimap()
{
	CDHUD=CDHUD==nullptr?Cast<ACDHUD>(GetHUD()):CDHUD;
	APawn* CDPawn = GetPawn();
	if (!CDPawn)return;
	ACDCharacter* CDCharacter = Cast<ACDCharacter>(CDPawn);
	if (!CDCharacter) return;
	
	if (CDHUD&&CDHUD->CharacterOverlay&&CDHUD->CharacterOverlay->MinimapBox)
	{
		if (CDHUD->CharacterOverlay->MiniMapImage)
		{
			UTextureRenderTarget2D* MiniMapRenderTarget=CDCharacter->GetMiniMapTarget();
			FSlateBrush MiniMapBrush;
			MiniMapBrush.SetResourceObject(MiniMapRenderTarget);
			MiniMapBrush.ImageSize = FVector2D(128, 128);
			
			CDHUD->CharacterOverlay->MiniMapImage->SetBrush(MiniMapBrush);
			
		}
	}
}

중간에 FSlateBrush의 형태를 만들고 SetBrush한 이유는 UTextureRenderTarget2D의 경우 SetBrush로 이미지형태를 집어넣을 수 없기 때문이다. 도큐에서는 SetBrushDynamic을 통해 집어넣을 수 있다고 하였으나, 실제로는 타입오류가 떴다. 때문에 SlateBrush의 형태로 변환해서 집어넣는 형태로 진행하였다.


허접하지만 정상적으로 각 캐릭터마다 SceneCapture를 불러오는데 성공하였다.

profile
공부 정리 노트

0개의 댓글