TIL

Kyu_·2026년 7월 14일

34주차

목록 보기
2/4

웨이포인트 위젯 컨테이너가 있는 이유

마커는 여러개가 동시에 뜰 수 있고 개수가 런타임에 계속 바뀌는데, 그 생명주기 관리와 매 틱 화면 계산을 한 곳에서 하기 위한 관리자 레이어

  1. 생성/제거 동기화 : NSWaypointSubsystem의 OnWaypointLIstChanged 델리게이트를 구독해서, 마커 컴포넌트가 등록/해제될 때마다 마커 위젯을 만들거나 지움(RegreshMarkerWidgets), 마커 위젯 개별로는 자기가 언제 생기고 사라져야 하는지 알 수 없음

  2. 매 틱 공통 계산 : 월드 좌표 -> 스크린 투영, 카메라 뒤 판정, 화면 밖일때 가장자리 클램프, 거리 텍스트/스케일 갱신을 컨테이너의 NativeTick 한곳에서 전부 처리. 뷰포트 크기, DPI, 카메라 시점 같은 공통 값을 한 번만 구해서 모든 마커에 재사용할 수 있고, 마커 위젯 각각이 틱을 도는 것보다 효율적

  3. 배치 공간 제공 : 아이콘 + 거리 텍스트 비주얼만 담당하고,

NSStageManager.h

IsObjectiveInitialized()의 주석에서 RescureNPC 스폰 순서 역방향 확인용이라는데 이게 무슨 말인지?

인런 실행하면 두가지가 발생함

  1. ANSRunGameMode::InitializeObjectiveInternal 에서 게임 목표를 랜덤 선택해서 NSStageManager에 세팅하는데 (인런 데이터 준비 완료 후 실행)
  2. ANSInRunNPCSpawner::BeginPlay() -> NPC가 스폰되는 시점에 이미 목표가 구출형으로 초기화 되어있는지 거꾸로 확인해서 켬

GetTargetNPCId는 정확히 뭔지?

그냥 구출 목표 id반환하는 함수

PlayerController.cpp

  1. 인터렉션 위젯을 열때 즉, 인터렉션을 할때 가이드 서브시스템에서는 NotifyNPCInteracted(NPCId)로 처리를 해준다 (다음부터 안띄우게)
  2. BeginPlay에서 가이드서브시스템의 StartGuide호출, 실제로 블락은 가이드 서브시스템에서 처리

RunGameMode

  1. 목표 설정하는 ANSRunGameMode::InitializeObjectiveInternal에서 NPC마커 활성화 함수(ActivateRescueMarkersIfNeeded) 설정
  2. ActivateRescueMarkersIfNeeded에서는 월드에 이미 스폰된 구출NPC를 순회해서 그중 조건에 맞는것만 마커를 켠다.
  3. 이때 ShouldShowRescueMarker 함수를 보는데 목표가 아직 초기화되지 않았거나, 목표가 NPC구출이 아니면 마커 대상이 아니고, 지정대상이 있으면 일치할때만 마킹해준다.

서브시스템

// 캐릭터 선택 콘솔과 첫 상호작용 (NSCharacterSelectNPC::OnInteract에서 호출)
void NotifyCharacterConsoleUsed();

// 게임시작 콘솔과 첫 상호작용 (NSReadyStartActor::OnInteract에서 호출)
void NotifyReadyConsoleUsed();

// 허브 NPC와 첫 상호작용 (NSPlayerController::OpenInteractionWidget에서 호출)
void NotifyNPCInteracted(FName NPCId);

마커어떻게 뜨는지

우선 틱 에서 MarkerWidget은 많은 효과가 있다.
1단계 화면 투영 (마커가 화면에 있을때) -> ProjectWorldLocationToScreen이 카메라 투명 행렬을 이용해서 월드 좌표 -> 스크린 픽셀 좌표로 변환해줌, 대상이 카메라 시야 안(정확히는 투명 평만 앞)에 있으면 성공(true)하고 픽셀 좌표를 채워줌
2단계 화면 안인지 판정(카메라 뒤 케이스가 핵심), ProjectWorldLocationToScreen은 대상이 카메라 뒤에 있으면 false를 반환하긴 하는데 그 전에 이미 계산된 스크리 좌표값이 남아있어서 신뢰할 수 없다. 그래서 내적(DotProduct)으로 직접 한번 더 확인함
WorldLocation -> CameraLocation(카메라->대상 액터) 과 CameraForward(카메라가 보는 방향)의 내적이 음수면 대상이 카메라보다 뒤에 있다는 뜻

투영 성공 + 카메라 앞 + 여백(EdgePadding) 안쪽까지 다 만족해야 '화면 안'으로 인정합니다. 여백을 두는 이유는 마커가 화면 가장자리에 딱 붙어서 잘려 보이지 않게 하기 위해서입니다.

3단계 가장자리 글램핑 (화면 밖일때 방향만 표시) -

0개의 댓글