StrikForge 프로젝트/작업일지

RTS 선택 UI에 3D 초상화 연동

editor66484 2026. 8. 30. 22:29

오늘의 목표

기존 InGameUI의 선택 정보 패널에 Render Target 기반 3D 초상화를 연결하고, 선택 대상에 따라 2D 이미지와 3D 초상화를 구분해 출력하는 작업을 진행했다.

  • 지휘관·전투 유닛: 실시간 3D 초상화
  • 건물·광물: 기존 데이터테이블의 2D 이미지
  • 선택 해제: 선택 정보 패널 숨김

1. 기존 2D 초상화 출력 구조 확인

기존 WBP_SFSelectedInfoPanel에서는 데이터테이블에서 가져온 PortraitImage를 SelectedPortraitImage에 적용하고 있었다.

FSFSelectableInfo.PortraitImage
→ Set Brush From Texture
→ SelectedPortraitImage

이 구조는 건물이나 광물처럼 정적인 2D 이미지를 표시하는 데 적합하다. 하지만 지휘관과 전투 유닛에는 Render Target Material을 사용해야 하므로 선택 대상에 따른 분기가 필요했다.

2. 2D 이미지와 3D 초상화 출력 분기

SelectableType을 기준으로 지휘관과 유닛을 확인하도록 구성했다.

SelectableType == Commander
SelectableType == Unit
→ OR
→ Branch

분기 결과:

True
→ Set Brush From Material
→ M_SFUnitPortraitUI

False
→ Set Brush From Texture
→ 데이터테이블의 PortraitImage

이 구조를 통해 기존 건물·광물 이미지 기능을 제거하지 않고, 지휘관과 유닛에만 3D 초상화를 적용할 수 있게 되었다.

최종 분기 구조

Commander 또는 Unit
→ Render Target Material

MainBuilding
NormalBuilding
ProductionBuilding
ResourceBuilding
→ 기존 PortraitImage

3. HUD와 Portrait Actor 연결

SFInGameHUDWidget에서 실제 선택된 캐릭터의 Skeletal Mesh를 가져와 공용 SFUnitPortraitActor에 전달하도록 연결했다.

유닛 선택
→ SelectedActor 확인
→ ACharacter Cast
→ SkeletalMeshComponent 조회
→ Skeletal Mesh Asset 획득
→ ApplyPortrait 호출

핵심 호출 구조:

UnitPortraitActor->ApplyPortrait(
    SelectedSkeletalMesh,
    nullptr
);

현재는 선택한 유닛의 Mesh를 교체하는 기능까지 연결되어 있으며, Animation은 아직 nullptr로 전달하고 있다.

또한 다음 선택 흐름에서도 초상화가 갱신되도록 구성했다.

  • 단일 유닛 선택
  • 다중 선택에서 대표 유닛 변경
  • 선택 해제
  • 선택 대상 파괴

4. Render Target 배경 투명화

Scene Capture 결과에 인게임 배경이 함께 촬영되는 문제가 있었다. Render Target의 Alpha 채널과 UI Material을 이용해 배경을 투명하게 처리했다.

Render Target

Clear Color
R = 0
G = 0
B = 0
A = 0

Scene Capture

Capture Source
→ SceneColor (HDR) in RGB, Inv Opacity in A

UI Material

Render Target RGB
→ Final Color

Render Target Alpha
→ OneMinus
→ Opacity

처음에는 Alpha 방향이 반대로 적용되어 캐릭터가 사라지고 배경만 출력되는 문제가 있었다. OneMinus를 적용하여 캐릭터 영역은 표시하고 배경 영역은 투명하게 처리했다.

실제 인게임 맵에서는 하늘, 나무, 지형 등이 불투명 오브젝트로 함께 촬영될 수 있기 때문에 PortraitMesh만 촬영하도록 제한하는 과정도 필요했다.

Primitive Render Mode
→ Use ShowOnly List

Show Only Component
→ PortraitMesh

5. 초상화 조명 변경

기존 Rect Light Component를 Spot Light Component로 교체했다.

변경된 파일:

  • SFUnitPortraitActor.h
    • URectLightComponent 제거
    • USpotLightComponent 추가
  • SFUnitPortraitActor.cpp
    • RectLightComponent.h 제거
    • SpotLightComponent.h 추가
    • PortraitSpotLight 생성

조명의 위치와 밝기는 코드에 고정하지 않고 BP_SFUnitPortraitActor에서 직접 조정할 수 있도록 유지했다.


6. 실제 지휘관 선택 결과

지휘관을 선택했을 때 실제 선택 정보 패널의 초상화 영역에 지휘관 Skeletal Mesh가 출력되는 것을 확인했다.

확인된 처리 흐름:

지휘관 클릭
→ SelectableType = Commander
→ Set Brush From Material
→ 지휘관 Mesh를 Portrait Actor에 적용
→ Render Target 출력
→ 실제 InGameUI에 표시

7. 실제 전투 유닛 선택 결과

전투 유닛을 선택했을 때 같은 PortraitActor와 Render Target을 재사용하면서 선택한 유닛의 Mesh로 교체되는 것을 확인했다.

유닛마다 별도의 카메라나 Render Target을 생성하지 않고, 공용 Portrait Actor 하나를 재사용했다.

지휘관 선택
→ 지휘관 Mesh 출력

전투 유닛 선택
→ 같은 PortraitMesh를 전투 유닛 Mesh로 교체

RTS처럼 다수의 유닛이 생성되는 환경에서 Scene Capture를 유닛마다 생성하지 않아도 된다는 장점이 있다.