언리얼 58
7인용 턴제 카드 게임(리슨 서버)에서 접속이 끊기면 그 좌석이 통째로 사라져 승패가 즉시 뒤집혔다. 승패 판정이 실제로 읽는 값을 역추적해 PlayerState·폰·좌석 예약 중 무엇을 남길지 정하고, 폰을 떼어낼 훅과 복귀 시 재빙의 경로까지 설계 결정을 정리한다.
BG(뱅! 카드게임 프로토타입)에 좌석 소유를 전담하는 컴포넌트를 넣고 메인메뉴를 별도 레벨로 분리했다. 좌석 배정 훅을 InitNewPlayer로 잡은 이유, 좌석 번호를 연속으로 채우지 않기로 한 근거, 그리고 맵 이동을 메인메뉴 한 번으로만 허용한 분기까지 설계 결정을 정리한다.
언리얼의 어서션 셋을 가르는 축은 '실패했을 때의 반응'과 '컴파일에서 빠질 때 식이 남는가' 두 개다. UE 5.8 엔진 헤더에서 세 매크로의 실제 정의와 빌드 구성별 활성 여부를 확인하고, 흔한 설명과 어긋나는 지점 두 가지를 정리했다.
방코드 하나로만 돌던 세션 계층에 친구 초대와 방찾기를 얹었다. 방코드용으로 켜 둔 설정이 초대 조건을 이미 채우고 있었다는 발견과, 검색 필터를 클라이언트로 넘긴 판단.
레벨에 걸려 있는 셀 셰이딩 포스트 프로세스와 툰스카이 머티리얼을 에디터에서 열어, 노드 체인과 인스턴스 파라미터를 그대로 옮겨 적었다. 접었던 PP 림라이트·아웃라인 실패 기록까지.
셰이더를 만드는 것과 팀 게임에 정착시키는 것은 다른 일이었다. 팀원 재질 수백 개를 하나도 고치지 않고 레벨 전체에 필터를 거는 대신, 나눗셈 노이즈 증폭과 미연결 머티리얼 입력이 터졌다.
Tripo로 생성해 리깅한 펭귄을 FBX로 뽑아 Blender에서 스켈레톤과 텍스처를 확인하고, 텍스처를 파일에 내장해 재익스포트했다. '정말 들어갔는가'를 세 가지 방법으로 검증한 기록.
서로 다른 리그 사이의 리타게팅이 무너져 한 번 우회했던 문제를, 리그 자체를 다시 만들어 정면으로 풀었다. 표준 휴머노이드 리그를 입히고 IK 리타게터·블렌드스페이스·ABP로 이어지는 구조까지.
로비 대기 중에 다음 스테이지를 미리 로드하면 로딩이 짧아진다 — 그렇게 넣은 최적화가 게임 입장 자체를 막았다. 프리로드는 성공하고 있었고, 문제는 트래블의 맵 로드와 같은 패키지를 두고 부딪힌 것.
레벨 조명을 굽자 벽이 탄 것처럼 얼룩덜룩해졌다. 원인은 하나가 아니라 셋이었고 전부 라이트맵이 참조하는 데이터 쪽에 있었다. 셋을 다 고친 뒤에도 남은 노이즈와, 굽지 않기로 한 결론.
클라이언트에서만 전진이 사선으로 휘거나 벽처럼 막혔고, 카메라를 급회전하면 가구가 몸을 뚫었다. 같은 반경을 서로 다른 자로 재고 있었던 것과, 성분 보간이 0점을 관통하는 문제.
공동 운반의 러버밴딩은 튜닝 문제가 아니라 이중 보정 구조 자체가 원인이었다. 되끌어오는 견인을 걷어내고 입력 단계에서 이탈 성분만 지우자 서버와 클라가 같은 결론에 도달했다.
어떤 가구는 트레이스에 안 잡히고, 바닥에 1uu 박힌 가구는 조작을 얼렸다. 무엇보다 '서버는 원격 폰 속도에 손대지 않는다'는 원칙이 정작 견인을 무효로 만들고 있었다.
가구를 들고 걸으면 캐릭터가 순간이동하듯 튀었다. 값을 아무리 조정해도 안 잡힌 이유는 캐릭터 무브먼트가 끝낸 예측 위에 서버가 한 번 더 손을 대는 구조였기 때문. 회전 기준도 몸으로 옮겼다.
에디터에서 되는 것과 패키징된 빌드에서 되는 것은 다른 문제다. 같은 프로젝트를 세 번 패키징하며 실패 원인을 하나씩 걷어내고, 에러 억제 플래그 없이 클린 패키징에 도달한 기록.
수식으로 그린 툰 하늘은 Unlit 이미시브 돔이라 레벨의 태양을 모른다. 그 사이에 다리를 놓아 낮→황혼→밤을 잇고, 팀원 파일을 한 줄도 고치지 않은 채 사운드·이펙트를 얹은 관찰 기반 설계.
플레이 구역 밖으로 못 나가게 막으면서 그 너머가 비어 보이지 않아야 했다. 바리케이드와 원경 임포스터로 가장자리를 채우고, 아웃라인을 볼륨 안쪽에만 그려 배경에 선이 번지지 않게 했다.
'지금 뭘 잡을 수 있는지 안 보인다'는 피드백. 패스를 하나 더 얹는 대신 이미 있는 아웃라인 머티리얼 안에서 세피아 외곽선과 노란 링을 같이 그렸고, 화면 가장자리 점선 아티팩트도 잡았다.
도시도 나무도 만화풍인데 하늘만 사실적인 볼류메트릭 구름이었고, 이 하늘은 포스트 프로세스 툰 셰이딩으로 잡히지 않는다. 그 이유와, 스카이돔을 대체한 8단계 노드 그래프.
에디터 두 창에서 되던 멀티플레이가 PC 두 대에서는 하나도 되지 않았다. 방코드 생성부터 P2P 접속·로비 합류·게임 진입까지, 문제→로그→가설→수정 사이클을 일곱 번 돌린 기록.
가짜 데이터로 잘 돌던 세션 UI를 실제 Steam 세션에 붙이자, 화면이 아니라 매칭 방식을 다시 봐야 했다. 방 코드 도입과, 원인을 추측하다 시간을 버린 빌드 경고 C4458.
이미 올라간 커밋 메시지를 규칙에 맞게 고치려다 히스토리 재작성과 언리얼 에셋 참조가 한꺼번에 얽혔다. 커밋을 일괄로 다시 쓰는 대가와, 끊어진 레벨 에셋 참조를 되살린 과정.
패키징 단계에서 처음으로 빌드가 멈췄고, 고쳐서 실행 파일을 뽑아도 Steam 세션이 붙지 않았다. 에디터에서 실행 파일까지 가는 길을 뚫고, 그 사이 어긋난 팀 브랜치를 되돌린 기록.
여러 명이 가구 하나를 드는 게임에서 이동을 클라이언트가 계산하면 화면마다 가구 위치가 달라진다. 코드 전에 복제 표준부터 정한 이유와, 에디터를 막던 BuildId 불일치.
각 문서는 멀쩡한데 합쳐 놓으면 서로 다른 말을 한다. 흩어진 기획안을 하나로 통합하며 드러난 충돌을 덮지 않고 표면에 올려 결정받고, 시안용 이미지와 구현 룩을 분리한 판단.
언리얼은 바이너리 에셋이 많아 머지 충돌 하나가 파일을 통째로 못 쓰게 만든다. 첫 커밋 전에 .gitignore에서 무엇을 왜 빼는지 정하고, 도메인별 소유권과 develop 완충 브랜치까지 세웠다.
'아슬아슬하게 함께 든다'는 말로 적힌 채로는 구현자마다 다른 게임이 된다. 어느 각도에서 놓치는지, 속도가 얼마나 어긋나면 흔들리는지를 수식과 튜닝 표로 못 박고 수용 기준까지 정했다.
무거운 가구를 둘이서 들고 계단을 내려가는 장면 하나로 게임이 성립할까. One Pager와 코어 루프로 범위를 닫고, 협동 운반을 어떤 규칙으로 만들지 인게임 시스템으로 푼 기획안.
PIE 두 창으로 띄우자 이론으로만 보던 복제 문제가 한꺼번에 나왔다. 이름이 엔진 hex ID로 뜨고, 클라 위젯만 갱신되지 않고, 접속 순번이 흔들렸다 — 셋 다 권위와 도착 타이밍 문제였다.
복제가 되는 것과 감당 가능한 복제는 다르다. 복제 빈도·연관성·우선순위·휴면·RepNotify로 무엇을 언제 누구에게 보낼지 조절하고, 애니메이션·공격·컴포넌트 동기화까지 붙였다.
서버의 판단을 클라이언트에 보내는 수단은 둘로 갈린다. 한 번 터지고 사라지는 효과는 RPC, 계속 유지되는 상태는 Replication — 채팅과 숫자 야구로 각각 구현해 경계를 확인했다.
멀티플레이 코드에서 가장 먼저 잡아야 할 건 문법이 아니라 '지금 이 줄이 어디서 도는가'다. 데디케이티드 서버 실행 흐름과, 월드 단위·액터 단위 두 축으로 권한을 읽는 기준.
UI가 매 프레임 체력을 묻는 대신 체력이 바뀔 때 알리는 쪽으로 뒤집었다. 파티가 공유하는 퀘스트 진행도는 GameInstanceSubsystem에 단일 진실 공급원으로 두고, 데미지 타입 널 크래시까지 잡았다.
협동 게임 제안에서 출발했는데 결론은 서로를 의심하는 포렌식 추리 게임이었다. 논의를 붙잡은 기획 프레임워크와, 보상 설계를 현상금 표에서 이진 승패로 단순화한 근거.
Ch4 팀플 기획 브레인스토밍 — 튜터님 제안 협동+마피아에서 출발해 포렌식 소셜 추리 'TRACE' 컨셉에 도달한 과정과 스코프·리스크 정리.
맞았다는 걸 알아채게 만드는 건 데미지 숫자가 아니라 흔들리는 화면과 줄어드는 게이지, 붉어지는 가장자리다. 이미 만든 히트 위임 구조를 반대 방향으로 미러링해 경로를 뚫었다.
말단 본을 맞히면 라그돌이 안 흔들리고, 히트스톱을 걸어도 뒤 좀비가 밀고 들어왔다. Mixamo와 UE5의 본 이름 표준이 다르다는 문제와, 충돌 응답을 일시 무시하는 한 세트 패턴.
좀비 Pawn만 늦추면 몸은 멈춰도 AIController의 행동 트리는 풀스피드로 돈다. 흩어진 발사 경로를 하나로 모아 진입점에만 효과를 얹는 구조와, 본 이름이 비어 오던 채널 누락.
아이템이 플레이어 상태를 아는 가장 쉬운 방법은 매 프레임 확인이고, 그게 가장 비싸다. 아이템이 스스로 구독을 거는 구조와 push·pull 선택 기준, _Implementation과 Execute_ 구분.
카테고리 폴더에 헤더와 소스를 함께 쌓으면 어떤 헤더가 모듈 밖으로 공개되는지 구조에서 안 보인다. 언리얼 표준 구조로 옮기며 include 경로와 빌드가 깨진 지점들.
히트스캔이냐 프로젝타일이냐가 안 정해진 상태에서 히트리액트·이펙트·히트스톱을 먼저 만들어야 했다. 인터페이스 하나로 의존을 끊는 설계와, 코드 리뷰에서 드러난 콜리전 채널 미스매치.
역할 × 마일스톤 시드를 89개 작업의 행 단위 WBS로 펼치고, 행마다 발제 출처·합의 마감일·우선순위를 붙여 블로커를 드러냈다. 그 표를 노션으로 일괄 이관해 타임라인까지.
팀원 다섯의 사전 자료가 채팅·블로그 링크·피그마로 제각각인 상태. 흩어진 설계를 좀비 AI·게임 스테이트·전투 인터페이스로 모으고, 발제와 한 줄씩 대조해 갭을 수치로 만들었다.
드론이 바닥을 뚫고 내려가고 어떤 각도에서는 바닥이 천장처럼 굴었다. 원인은 LineTrace 시작점이 콜리전 표면과 같은 높이라 엔진이 결과를 버린 것. 빠른 낙하의 터널링은 CCD로 막았다.
기능이 다 돌아가도 메뉴→본편→엔딩 루프가 닫히지 않으면 게임이 아니다. 레벨 셋을 잇는 전환과 탈출 타이머, 위젯 하나로 네 페이지를 처리하는 HUD, 레벨을 갈지 않는 게임오버.
무기가 둘이 되는 순간 Pawn의 발사 코드는 분기로 갈라진다. 로직은 컴포넌트로 캡슐화하고 펠릿·스프레드·반동 같은 값은 DataAsset으로 빼내, 무기 추가가 에셋 하나로 끝나게 만들었다.
아이템 하나가 데이터로 정의되고 바닥에 스폰되고 주워지고, 그 무게가 이동 속도와 소음까지 바꾸는 경로를 한 줄로 연결했다. 도중에 DataTable과 DataAsset을 혼동해 막힌 두 건.
'맞았다'는 이벤트 하나로는 화상·관통·폭발을 구분할 수 없다. UDamageType을 식별자로 써서 TakeDamage를 분기하고, 적 여럿이 매 틱 시야 판정을 돌릴 때 프레임이 튀는 이유까지.
목록은 순서가, 아이템 정의는 즉시 조회가, 칭호는 중복 제거가 필요하다 — 인벤토리 하나에 컨테이너 셋이 다 들어가는 이유. generated.h include 순서와 GameMode 위젯 생성에서 걸린 오류까지.
이동 3축·회전 3축을 전부 플레이어가 쥐는 드론이라 CharacterMovement가 없다. 중력과 착지 스냅을 직접 짜야 했고, 이동 후에 스냅하는 순서 때문에 드론이 바닥에서 튀었다.
언리얼 코드에는 생 포인터 대신 TObjectPtr이, 클래스 타입 대신 TSubclassOf가 나온다. 두 래핑이 각각 무엇을 대신 처리하는지, 그 위에서 컨테이너 셋을 고르는 기준까지.
캐릭터 하나를 움직이는 데 클래스 네댓 개가 관여한다. 키를 누른 순간부터 애니메이션이 재생되기까지의 경로를 순서대로 따라가며 각 클래스가 어디를 맡는지 확인했다.
발판 종류가 넷으로 늘면 클래스를 종류마다 파고 싶어진다. 베이스 액터를 bool 분기로 공유하는 구조를 먼저 잡고, FTimerHandle 주기 동작과 SpawnActor 랜덤 스폰, Tick 낙사 리스폰을 얹었다.
따로 외우면 다섯 개지만 실제로는 한 줄기다. UBT가 빌드를 지휘하고 UHT가 매크로를 읽어 리플렉션 데이터를 만들고, 그 위에서 CDO 복사와 GC 추적이 돈다. CDO 런타임 수정 실습까지.
블루프린트에서 아무것도 할당하지 않아도 WASD·Space가 동작하는 입력 구조를 코드로 만들었다. UObject 데이터 에셋에는 초기화 지점이 없다는 것과, 경고만 남기고 넘어가는 deprecated 함정.
Actor를 랜덤 거리·각도로 10회 움직이는 과제. 좌표를 바로 대입하면 순간이동이 되기 때문에 매 프레임 조금씩 다가가는 보간으로 갔다. Tick이 비대해지지 않게 나눈 메서드 구조까지.
새 PC로 옮기자 C++ 클래스 생성이 막히고 에디터가 튕겼다. 원인은 UE 5.5.4가 인식하는 MSVC 툴체인이 VS 2022까지라는 것과, 이관하며 따라온 이전 환경의 중간 산출물.
에디터를 처음 열면 패널부터 막힌다. 화면을 읽는 순서를 잡고 World → Level → Actor → Pawn 계층을 실습으로 확인한 뒤, 메시 복사본의 머티리얼 슬롯을 갈아 끼우기까지.