카테고리

언리얼 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 계층을 실습으로 확인한 뒤, 메시 복사본의 머티리얼 슬롯을 갈아 끼우기까지.