
언리얼 좌표계 언리얼은 Z가 위로 향하는 왼손 좌표계를 사용한다. X축(Roll): 이미지의 빨간색 부분. 왼손의 검지에 해당한다. Y축(Pitch): 이미지의 초록색 부분. 왼손의 중지에 해당한다. Z축(Yaw): 이미지의 파란색 부분. 왼손의 엄지에 해당한다.
열거형 및 구조체 선언 언리얼은 열거형과 구조체를 데이터 에셋의 형태로 저장할 수 있다. 이렇게 선언한 데이터 에셋은 블루프린트에서 타입의 형태로 변수를 추가할 수 있다. 과제 구현 블루프린트를 활용해서, 다음과 같은 문제를 구현하면 되었다. (아래는 조금 요약된 부분) Weapon 구조체를 활용해서, Rifle/Shotgun/Pistol 무기를 구...

UE 5.1에서 기본으로 지원하는 언리얼 입력 방식으로, 복잡한 입력 로직을 코드 수정 없이 유연하게 관리할 수 있게 만든 시스템이다.Enhanced Input은 주로 4가지 키워드로 분류 된다.Input Action(IA) \- 해당 액션이 발생했을 때, 어떠한 값

애니메이션 블루프린트(Animation Blueprint)는 게임 플레이 중 캐릭터의 애니메이션을(정확히는 Skeletal Mesh의 애니메이션을)제어하는 도구이다.애니메이션 블루프린트의 초기 사진Result에는 Animation 에셋 자체를 넣을 수 있지만, 조건에
오늘 일정은 따로 새로 배운 내용이라던가 복습할 내용이 없었기 때문에, 이전에 미뤄두었던 그래픽스 공부를 하였다.공부 내용은 공개로 보여주기는 어렵지만, 블룸 처리/좌표계 변환 등 기본기를 다지는 내용을 학습하였다.학습 내용은 1시간 분량 밖에 안되었는데, 공부 시간은

간단히 말해, 한 객체를 복사하여 다른 객체로 붙이는 생성자이다.복사 생성자가 호출되는 경우는 3가지로 분류된다.객체 복사(Pass by Value)Value의 형태로 결과값 반환기존 객체를 기반으로 새로운 객체 생성복사 생성자의 기본 구조는 다음과 같다.참조자(&)가
스마트 포인터 C++에서 new/delete 키워드를 사용해서 동적할당을 하면, Dangling Pointer나 Memory Leak등 자원 관리가 안되는 경우를 볼 수 있다. Dangling Pointer : 이미 해제된 메모리를 가리키고 있는 포인터 Memory
이번에 부트캠프에서 주어진 과제를 구현하다가 전방 선언에 대해 실수한 부분이 있다보니 이 부분에 대해서 바로 잡아보려고 한다.전방 선언(Forward Declaration)은 "컴파일러에게 이런 클래스(또는 구조체, 함수 등)가 있으니 알아만 둬!" 라고만 말하고 크기

개인적으로 언리얼 인벤토리 시스템 강의를 들었을 때, 코드를 Source 내에서 작성하는 것이 아닌 Plugin을 제작하는 방식으로 진행했다.아직은 간단하게 Plugin에 대해서 알아보고 생성하는 것만 남겨보려고 한다.플러그인(Plugin)은 엔진의 핵심 코드를 직접

오늘 개인적으로 위젯 블루프린트 클래스를 할당하는 과정에서 TSubClassOf<>를 사용했는데, 다른 포인터와 달리 어떠한 특징이 있는지 살펴보았다.TSubClassOf는 클래스 정보의 타입 안정성을 보장하기 위해 나온 템플릿 클래스이다.우리가 일반적으로 선언하
오늘은 개인적으로 Unreal Inventory System을 학습하였고, 주로 Widget Binding 및 배치에 대해서 공부하였다.Widget을 다루는 부분은 예전에 공부했었으나, Inventory System 특성 상 위젯의 분할이 많았고 이를 바인딩 하는데 있
이번에도 개인적으로 인벤토리 시스템을 공부하는 데 있어, FastArraySerializer라는 개념이 나와 정리해보려고 한다. Fast Array Serializer 언리얼의 복제 시스템은 변수 단위로 이루어진다. TArray로 공간을 100개를 할당했다고 가정했
Stack 후입선출(Last In First Out)의 구조를 지니는 자료구조이다. 마치 상자 안에 있는 물건들을 정리할 때, 맨 위에서부터 먼저 빼서 정리하는 것과 유사하다. 아래는 간단하게 표현한 스택 과정이다. STL에서 제공하는 stack 라이브러리를 활용

fetch 로컬 리포지토리에 있는 내용을 원격 리포지토리로 보내려면 push를 해줘야 하고 원격 리포지토리에 있는 내용을 로컬 리포지토리로 가져오려면 pull을 해주면 된다. 하지만, 팀 협업의 경우 원격 리포지토리의 내용과 로컬 리포지토리의 내용이 다른 경우가 많
이번에는 인벤토리 시스템을 공부하는 도중 FInstancedStruct에 대한 내용이 나와서 추후에 자주 사용될 것 같아 정리해보려고 한다. FInstancedStruct FInstancedStruct는 UE5부터 제공하는 USTRU
오늘 한 내용 > - C++ 코드카타 UE5 C++ 인벤토리 시스템(개인 공부) 매일 코드카타를 진행하면서 문자열 처리 관련 알고리즘 문제들을 풀게되면 꼭 문자열 처리 함수들을 검색하는 나를 보게된다. 계속 함수 검색을 해가면서 하는 것도 옳지 않은 방법이기 때문에

오늘 한 내용 > - C++ 코드카타 UE5 C++ 인벤토리 시스템(개인 공부)

오늘의 한 일
🔗 [학습 날짜 인증(주제와 무관)](https://velog.velcdn.com/images/cloure3504/post/b1e8e072-fdfd-454b-99ec-fec26625fe86/image.png ) 오늘 한 내용 > - C++ 코드카타 C++ 팀 프로젝트 인벤토리 시스템 구현 인벤토리 삭제, 사용 구현 사실상 어제의 노력으로 인해 틀은 ...

🔗 학습 날짜 인증(주제와 무관) 오늘 한 내용 > - C++ 코드카타 C++ 팀 프로젝트 인벤토리 시스템 리팩토링 및 상점 시스템 구현 상점 시스템 구현 상점 시스템은 단순한 목적으로만 구현하기 때문에, 인벤토리 시스템에 비해서 상대적으로 구현하기 쉬웠다. 흐름은 ShopScene에서 Shop 객체를 할당 -> 전투 종료 후 상점에 진입하면 In...

🔗 [학습 날짜 인증(주제와 무관)](https://velog.velcdn.com/images/cloure3504/post/146bbc3c-c3e5-4b88-a1c7-fe55204b53d5/image.png ) 오늘 한 내용 > - C++ 코드카타 C++ 팀 프로젝트 인벤토리/상점 시스템 리팩토링 이번에는 테스트 과정에서 간단한 리팩토링만 수행해서 팀...
🔗 학습 날짜 인증(주제와 무관) 오늘 한 내용 > - C++ 코드카타 C++와 Unreal Engine으로 3D 게임 개발 강의 수강 언리얼 C++ 인벤토리 시스템 강의 수강 이번에는 새로운 챕터 3이 발제가 되었다. 종합적으로 강의들을 수강하기도 했지만, 제일 기억에 남았던 문제에 대해서 작성해보려고 한다. 코드카타 문제 '프로그래머스 - 피로...
🔗 [학습 날짜 인증(주제와 무관)]( ) 오늘 한 내용 > - C++ 코드카타 C++와 Unreal Engine으로 3D 게임 개발 강의 수강 언리얼 C++ 인벤토리 시스템 강의 수강 이번에는 새로운 챕터 3이 발제가 되었다. 종합적으로 강의들을 수강하기도 했지만, 제일 기억에 남았던 문제에 대해서 작성해보려고 한다. 코드카타 문제 '프로그래머스...

🔗 학습 날짜 인증(주제와 무관) 오늘 한 내용 > - C++ 코드카타 C++와 Unreal Engine으로 3D 게임 개발 강의 수강 언리얼 C++ 인벤토리 시스템 강의 수강(개인적) 이번에도 여태 했던 대로 공부하는 중이었고, 아직 내 기준에서 "C++와 Unreal Engine으로 3D 게임 개발" 강의에서 새로 배운 내용은 없었기 때문에 코드카...
🔗 [학습 날짜 인증(주제와 무관)](https://velog.velcdn.com/images/cloure3504/post/a78d64ff-5771-415e-a807-bc4e7278311e/image.png ) 오늘 한 내용 > - C++ 코드카타 C++와 Unreal Engine으로 3D 게임 개발 강의 수강 TA 강의 수강 안티 앨리어싱(Anti-...

🔗 학습 날짜 인증(주제와 무관) 오늘 한 내용 > - C++와 Unreal Engine으로 3D 게임 개발 강의 수강 AI 3D Model 생성 3D Model 생성 TA 과제 겸, AI 3D Model 사이트에서 생성한 모델이 쓸만한지 혹은 잘 동작하는 지 확인해보기 위해 내용을 작성해보려 한다. 먼저 사용한 사이트는 다음과 같다. Meshy ...

🔗 학습 날짜 인증(주제와 무관) 오늘 한 내용 > - C++ 코드카타 C++와 Unreal Engine으로 3D 게임 개발 강의 수강 TA 강의 수강 언리얼 C++ 인벤토리 시스템(개인적) 언리얼 머터리얼 머터리얼(Materials)란 물체의 표면의 색, 질감 등등을 결정하는 재질을 의미한다. 언리얼에서 Material을 생성하면 다음과 같은 기본...
🔗 학습 날짜 인증(주제와 무관) 오늘 한 내용 > - C++ 코드카타 C++와 Unreal Engine으로 3D 게임 개발 강의 수강 TA 과제 주제 선정 TA 과제로 이전의 내용을 기반으로 "나만의 마법 구체 만들기"를 주셨다. 내가 직접적으로 마법 구체를 만드는 것보다 인게임에서 사용되는 마법 구체를 레퍼런스로 삼는 것이 좀 더 도움이 될 것...

🔗 학습 날짜 인증(주제와 무관) 오늘 한 내용 > - C++ 코드카타 C++와 Unreal Engine으로 3D 게임 개발 강의 수강 AI Model 캐릭터 생성 코드카타 문제 프로그래머스 - 롤케이크 자르기 : https://school.programmers.co.kr/learn/courses/30/lessons/43165 간단히 말해서 롤케...
🔗 학습 날짜 인증(주제와 무관) 오늘 한 내용 > - C++ 코드카타 언리얼 C++ 빌드 파이프라인 분석 AI Model 캐릭터 적용 및 로직 구현 리플렉션 리플렉션(Reflection)은 프로그램이 실행 중(Runtime)에 자기 자신의 구조와 속성을 관찰하고 제어할 수 있는 능력 을 의미한다. 사실 해당 내용만 보는 건 이해하기 어려우므로,...

오늘 한 내용 > - C++ 코드카타 Ch3 개인 프로젝트 구현 TA 프로시듀얼 쉐이더 과제 구현 프로시듀얼 쉐이더로 무늬 만들기 프로시듀얼 쉐이더는 이미지를 사용하지 않고 특정한 무늬, 패턴을 매 프레임마다 계산해서 화면에 보여주는 방식이다. 프로시듀얼 쉐이더를 구현하는 뼈대로 다음 5단계의 규칙을 따른다. UV 가져오기 → 중심 이동 → 거리 계...

오늘 한 내용 > - C++ 코드카타 Ch3 개인 프로젝트 구현 래퍼런스 이번 챕터에서는 간단한 플랫포머 게임을 만들어보기로 했는데, 나는 레퍼런스 게임으로 AltF4를 모작해보려고 한다. 또한, 다른 에셋을 사용하지 않고 오직 AI로만 게임 개발을 시도해보고 싶어서 고른 래퍼런스이기도 하다. AltF4는 중세 카툰 풍이 더 강하기 때문에, 모델 ...

오늘 한 내용 > - C++ 코드카타 Ch3 개인 프로젝트 구현 알고리즘 수업 수강 다락문 함정 수정 이미지를 보다 시피, 위와 같이 다락문 함정이 세팅되었었다. 하지만, 이 다락문 함정의 경우 문제는 다락문의 피벗이 루트로 되어있다는 점이었다. 계층 구조는 다음과 같이 되어있었다. 루트 컴포넌트의 경우, 월드 좌표계를 기준으로 잡기 때문에 피벗을...

오늘 한 내용 > - C++ 코드카타 Ch3 개인 프로젝트 구현 게임 수학 강의 수강 언리얼 마스터 반 과제 수행 UI 제작 오늘은 마스터 반 과제를 해결하기 위해 조금 시간을 썼다. 구현 내용은 다음과 같았다. 1. 가방은 TArray를 통해서 만든다. 2. TMap은 TArray에 담긴 아이템들을 확인하게 되면 그 아이템 정보를 Key값으로 아이...
오늘 한 내용 > - C++ 코드카타 언리얼 Collision, Trace, Damage 강의 수강 Ch3 개인 프로젝트 코드카타 문제 오늘의 코드카타 문제는 다음과 같다. 프로그래머스(택배상자): https://school.programmers.co.kr/lea

오늘 한 내용 > - C++ 코드카타 TA 강의 수강 Ch3 개인 프로젝트 UV 노드 활용 UV를 따로 마스킹을 해서 추출하면 다음과 같은 화면이 나타난다. (Mask 노드로 특정 값만 빼올 수 있다.) 여기서 R을 마스킹 한 것과 G를 마스킹 한 것에 대한 색상이 같은데, 그 이유는 R->G->B 순서로 레이어가 쌓이기 때문이다. 그리고 자세히 ...
오늘 한 내용 > - C++ 코드카타 TA 복습 Ch3 개인 프로젝트 텍스처 종류 Diffuse, Albedo, BaseColor - 일반적인 외관을 표현해주는 명칭으로, 일반적으로 'D' 접미사를 붙인다. Normal - 빛의 반사를 표현해주는 텍스처로, 보라색을 띄며 일반적으로 'N' 접미사를 붙인다. 노멀이 있는 버전과 없는 버전은 다음과...

오늘 한 내용 > - C++ 코드카타 물리 강의 수강 Ch3 개인 프로젝트 코드카타 문제 오늘의 코드카타 문제는 다음과 같다. 프로그래머스(연속된 부분 수열의 합) : https://school.programmers.co.kr/learn/courses/30/lessons/178870 문제를 요약하자면, 오름차순으로 정렬된 시퀀스 중, 부분 수열의 합...
오늘 한 내용 > - C++ 코드카타 Ch3 팀프로젝트 기획 Ch3 개인 프로젝트 장애물 추가 장애물로, 회전 통나무와 회전 도끼 시스템을 추가하려고 한다. 먼저 회전 통나무는 다음과 같이 동작한다. 모든 회전 통나무는 Tick으로 회전값을 갱신해줄 수 있지만, RotatingMovementComponent를 활용해서 코드를 좀 더 간결하게 유지했...
배운 내용 요약 결과 반환 방식에 따른 Trace 종류 Single : 트레이스 경로를 따라가다가 가장 먼저 부딪힌 객체의 정보만 반환하며 Block만 인식 Multi : 가장 먼저 부딪힌 객체에서 멈추지 않고, 경로를 관통하며 부딪힌 모든 객체의 정보를 배열 형태로 반환하고 Overlap도 인식하며 마지막 Block을 감지 시 멈춤 Async Sing...
오늘 한 내용 > - C++ 코드카타 알고리즘 세션 강의 수강 Ch3 팀 프로젝트 Common UI 기존의 전통적인 방식의 문제점을 개선하기 위해 나타난 플러그인이다. 기존의 UMG를 사용하는 방식과의 차이는 다음과 같다. 기존 UMG Create Widget -> Add To Viewport로 사용 -> Hard Reference 입력의 제어를 수...

오늘 한 내용 > - C++ 코드카타 물리 강의 수강 Ch3 팀 프로젝트(Stat UI 반영) 코드카타 문제 오늘의 코드카타 문제는 다음과 같다. 프로그래머스(연속된 부분 수열의 합) : https://school.programmers.co.kr/learn/courses/30/lessons/77485 문제를 요약하자면, 1 ~ N까지의 원소가 차례대...
오늘 한 내용 > - C++ 코드카타 언리얼 인터페이스/델리게이트 세션 강의 수강 Ch3 팀 프로젝트 Common UI -> UMG 원래는 Common UI 방식으로 가기로 했었으나, 튜터님의 권유로 인해 1달 프로젝트/키보드, 마우스만 사용/뼈대 복잡성 때문에 UMG로 갈아타기로 결정했다. UMG 방식은 앞서 설명했듯, Create Widget -...
목표 만들어보자 하는 마스터 머터리얼은 원형 ProgressBar이다. Fab에서 제공되는 무료 원형 ProgressBar는 질이 좀 떨어지는 편이어서 퀄리티는 조금 신경 쓰면서 과하지 않은 ProgressBar 머터리얼을 만들고 싶었다. 그럼 왜 원형으로 ProgressBar를 만드는 것인가 하면, 선형 ProgressBar는 가로로 UI 화면을 너...

Stamina & Hunger & Thirst 우리 팀 프로젝트에서는 위 3가지의 스탯 + 부위 별 체력 스탯을 담당하고 있기 때문에 어제 만들었던 마스터 머터리얼 기반으로 디자인을 해보려고 한다. 먼저 위 3가지 스탯은 스크린 중 HUD의 부속품이기 때문에 다음과 같은 관계를 지니게 된다. PDAttributeBar : 속성 바의 기본 클래스. 스탯...
텍스처 구하기 위 사진처럼 타르코프의 체력 시스템을 모방하려고 한다. 우리 프로젝트에서는 머리 + 몸통 + 팔 2개 + 다리 2개 총 6개의 파츠로 분류되어 있고 이를 기반으로 6개로 분리된 이미지 소스를 구해야 한다. 먼저 캐릭터는 간단하게, 언리얼 Manny 마네킹을 기반으로 정면 Idle 상태의 이미지를 따왔다. 이를 NanoBanana에게 6...

텍스처 찾기 이번엔 디버프 아이콘을 추출하려고 하나, 배경은 각자의 프롬프트가 달라서 일관성 없게 유지될 것 같아서 아이콘만 이미지로, 배경은 머터리얼로 구현하기로 했다. 먼저 "팔 부상"에 관련된 아이콘을 작성해달라고 했는데, 다음과 같이 구현해주었다. 텍스처 질감이라거나 표현 등은 아는 지식이 없다보니 프롬프트가 빈약한데, 이 정도면 괜찮은 것 같...

코드카타 문제 오늘의 프로그래머스 코드카타 문제는 다음과 같다. 마법의 엘리베이터 - https://school.programmers.co.kr/learn/courses/30/lessons/148653 문제를 요약하자면, 특정 목표 위치에 10의 배수로만 +/-로 이동했을 때의 최소 이동 횟수를 구하는 것이었다. 문제의 테스트 케이스가 1억까지 올 수...

머터리얼 구성 다음은 디버프 아이콘에서 사용할 배경 이미지를 만들어주기 위해 머터리얼을 구성하는 단계이다. 1. 둥근 모서리 계산 UV 좌표계의 중심을 0으로 맞추기 위해 0.5를 빼주고, 4개의 모서리를 동시에 동일하게 계산할 수 있도록 Abs를 적용해 모든 사분면의 좌표를 양수[0.0 ~ 0.5]로 대칭화했다. 이후 사각형의 평면 구간과 곡선 구간...

액션 프롬프트 Optional한 부분이지만, 게임의 가이드 용도로 아래와 같이 특정 기능이 어떠한 키와 바인딩 되었는지 보여주는 GUI가 존재하기도 한다. 오늘은 UI 가시화만 한다는 목표로, 디자인보다 구현에만 집중을 하였다. 클래스 설계 클래스의 구조를 그려보면 다음과 같다. 이전에 설계했던 아이템이 컨테이너에 할당되고 HUD에 보여지는 Deb...
사망/탈출 결산 시스템 --- 이제 플레이어가 죽었을 때, 따로 애니메이션이 출력되면서 결산 내용을 보이게 하도록 하는 것이 목표이다. 전체 흐름은 다음과 같다. APDGameMode: 사망/탈출 양쪽의 합류 지점. 게임이 종료될 때 호출되는 이벤트 함수인 EndRaid가 존재 UPDRaidEndTransitionWidget: 게임 종...

위젯 제작 레퍼런스는 배틀필드 6의 엔딩 스크린으로 삼았고 이를 변형하는 형태로 제작하려고 한다. 먼저 결과만 보여주자면 다음과 같이 동작한다. WBP_PDRaidEndTransitionWidget 은 C++ UPDRaidEndTransitionWidget을 상속한다. C++ 쪽에서 BindWidget / BindWidgetOptional 로 위젯 핸...

코드카타 문제 오늘의 코드카타 문제는 다음과 같다. 프로그래머스(쿼드압축 후 자르기) - https://school.programmers.co.kr/learn/courses/30/lessons/68936 간단하게 요약하면, $$2^n * 2^n$$의 그리드에 0과 1로 값이 채워져있으나, $$2^m * 2^m$$ 형태로 똑같은 값이 묶여있으면 하나의 값...
언리얼 멀티플레이 모델 멀티플레이는 다음 2가지의 유형이 존재한다. Local Multiplayer: 한 PC 에서 분리된 화면으로, 2대 이상의 입력 장치를 사용하는 형태. 네트워크 불필요 True Multiplayer: 두 대 이상의 PC에서 각각 게임 인스턴스가 돌고, 변화 정보를 네트워크로 주고받는 형태 통상적으로 불리는 멀티플레이 유형은 Tru...

액터 복제 이번에는 앞서 언급만 했던 복제(Replication)에 대해 코드로 구현해보려고 한다. 이를 한 문장으로 정리하면 다음과 같다. > "중요한 게임플레이는 서버가 권위를 갖고 처리하고, 그 결과를 클라이언트에 복제한다." ① 액터 복제 → ② 권위/역할 → ③ 어태치먼트 복제 → ④ 변수 복제 → ⑤ RepNotify → ⑥ 복제 조건 → ...

RPC(Remote Procedure Call) 지금까지의 복제(Replication) 는 서버가 가진 변수의 상태를 클라이언트로 내려보내는 서버 → 클라 한 방향 동기화였다. 하지만 게임을 만들다 보면 그 반대 방향, 즉 클라이언트가 서버에게 무언가를 요청하거나 서버가 특정 클라이언트에게만 명령을 내려야 하는 순간이 온다. 이때 사용하는 것이 RPC(R...
언리얼 게임플레이 프레임워크의 핵심 클래스들인 GameMode / GameState / PlayerState / PlayerController / Pawn·Character 은 각각 멀티플레이어에서 존재하는 위치가 다르다. 이번에는 이 클래스들의 복제와 존재 여부를 알아보려고 한다. GameMode — 서버 전용 규칙 관리자 GameMode 는 게임의...

Object Pooling 게임에서 액터를 동적으로 생성하고 파괴하는 작업은 생각보다 비용이 크다. 새 오브젝트를 만들 때는 메모리를 할당하고 초기화하는 과정을 거치고, 파괴할 때는 시스템이 사용하던 메모리 공간을 정리해야 한다. 총알처럼 동일한 형태의 오브젝트가 짧은 시간에 대량으로 생성·파괴되는 상황이라면 이 과정이 계속 반복되면서 CPU에 부하가 ...

코드카타 문제 오늘의 코드카타 문제는 과거 백준 문제인 치킨 배달이다. 문제를 요약하자면, N×N 도시에 흩어진 치킨집 중 최대 M개만 남겼을 때, 도시의 치킨 거리가 최소가 되도록 고르는 것이었다. 여기서 한 집의 치킨 거리는 그 집에서 가장 가까운 치킨집까지의 맨해튼 거리고, 도시의 치킨 거리는 모든 집의 치킨 거리를 전부 더한 값이다. 즉, "어...
코드카타 문제 오늘의 코드카타 문제는 백준에 있었던 문제인 12869번 뮤탈리스크다. 문제를 요약하자면, 뮤탈리스크 1마리가 SCV N개(최대 3개)를 전부 파괴하는 데 필요한 최소 공격 횟수를 구하는 것이었다. 한 번 공격하면 서로 다른 세 SCV에게 각각 9, 3, 1의 피해를 준다. 이때 9/3/1을 어느 SCV에 꽂을지는 마음대로 정할 수 있고...
주제 선정 이번 Ch4의 주요 주제는 데드 바이 데이라이트(이하 데바데) 의 비대칭 구도에 리썰 컴퍼니의 수집·납품 메커니즘을 덧붙인 구조로 결정되었다. 생존자는 맵 곳곳의 수집품을 모아 양쪽 납품소에 일정 가치 이상 납품한 뒤 탈출한다. 살인마는 생존자를 추격·처치하며 수집과 탈출을 방해한다. AI와 GAS 요소는 팀원 간 경험이 부족해 이번 범위에...
생존자 상태(State) 설계 생존자는 게임 내내 여러 상태를 오간다. 이 상태들을 열거형으로 먼저 정의했다. 멀티플레이에서 생존자의 상태는 나만 아는 정보가 아니기 때문에 살인마도 "저 생존자가 다운됐는지" 봐야 하고, 다른 생존자도 "구출하러 가야 하는지" 알아야 한다. 그래서 상태는 모든 클라이언트에 동기화되어야 한다. 단순 Replicated가...
상태 효과 적용 지난 편에서 ESurvivorState와 리플리케이션을 처리하고 각 State에 따른 분기를 처리하는 함수인 ApplyStateEffects로 모아주는 구조까지 잡았다. 오늘은 이 함수를 채워주려고 한다. 먼저 이동속도 같은 수치는 코드에 박지 않고 데이터 애셋(SurvivorData)에서 읽기 때문에 에셋 할당 여부를 체크해주고 그 이...

수집품 납품 지난 편에서 수집품을 줍고 들고 다니는 것까지 만들었다. 이제 이 수집품을 납품소(ASPDeliveryStation)에 제출하는 걸 처리한다. 납품소도 결국 상호작용 대상이라, ISPInteractable를 구현하는 것이 가장 첫 번째 목표이다. 납품도 줍기처럼 서버 권위 + 시전 시간(2.5초) 을 갖는다. 시전이 끝나면 들고 있던 수집...
탈출구 구상 지난 편에서 수집품을 납품처에 제출하는 것까지 만들었다. 이제 두 납품소가 목표치를 다 채우면 열리는 탈출구(Escape Gate)를 구현할 차례이다. 탈출구는 먼저 다음과 같이 동작한다. 납품소 A·B가 둘 다 목표치를 채운다 그 순간 모든 탈출구가 "개방 가능" 상태가 된다 (Collision 활성화) 생존자가 상호작용하면 일정 시간 ...
코드카타 문제 오늘의 코드카타 문제는 백준에 있었던 문제인 게리맨더링이다. 문제를 요약하자면, N개의 구역을 두 개의 선거구로 나눌 때 두 선거구의 인구 차이를 최소로 만드는 것이었다. 조건은 세 가지다. 모든 구역은 두 선거구 중 정확히 하나에 속하고, 두 선거구 모두 비어 있으면 안 된다. 같은 선거구에 속한 구역들은 서로 연결되어 있어야 한다. ...
캐릭터 다이어트 탈출구까지 구현하고 나니 ASurvivorCharacter가 500줄을 훌쩍 넘어 있었다. 이동 속도 계산, 상호작용 대상 탐지, 채널링 타이머, 수집품 운반 등, 다른 일들이 한 클래스에 뒤엉켜 있었다. 그래서 기능 별로 분리하기 위해 두 컴포넌트로 이동하려고 한다. USPInteractionComponent — 상호작용 탐지·실행·...

수집품을 인벤토리에서 HUD로 이전에는 수집품은 소켓에 붙여 한 개만 들고 다녔다. 이번엔 이걸 4칸 인벤토리로 바꾸고, HUD에 노출한 뒤, 1~4 키로 원하는 슬롯을 골라 버리거나 납품하는 것까지 수행해보려고 한다. 저장 구조와 표시 구조를 나누기 가장 먼저 고민한 건 인벤토리가 들고 있는 데이터와 UI가 그리는 데이터를 같은 걸로 쓸 것인가였는데...
코드카타 문제 오늘의 코드카타 문제는 백준에 있었던 문제인 가르침(1062번)이다. 문제를 요약하자면, 알파벳 26개 중 K개만 배워서 최대한 많은 단어를 읽을 수 있도록 하는 것이었다. 조건은 다음과 같다. 모든 단어는 "anta"로 시작해서 "tica"로 끝난다. 그래서 a, n, t, i, c 5개 문자는 모든 단어에 공통으로 등장한다. 배울 수...

흔적 남기기 데드 바이 데이라이트에는 생존자가 달리면 바닥에 붉은 긁힌 자국이 남고, 살인마만 그걸 보고 추적하는 시스템이 있다. 이번엔 이걸 그대로 간단한 형태로만 카피해보려고 한다. 정리하면 목표는 세 가지다. 달릴 때만 흔적이 남는다 살인마 화면에만 보인다 시간이 지나면 사라진다 흔적 생성 위치 수집품 인벤토리처럼, 흔적도 결국 서버가 판정하고...

레버 애니메이션 비대칭 생존 게임에서 생존자는 목표를 다 채우면 탈출구 레버를 당겨 문을 열 수 있도록 했는데, 이번엔 그 "레버를 당기는 상호작용"을 붙였다. 몽타주 하나 재생하는 단순한 작업처럼 보였는데, 실제로 붙여보니 챙길 게 꽤 많았다. 정리하면 목표는 이

상호작용 진행바 이번에는 상호작용(줍기·납품·구출·탈출구)이 얼마나 진행됐는지 보여주는 진행바 UI를 붙였다. 예전 프로젝트처럼 노드를 하나씩 처리하는 과정이 너무 어려울 것 같아서, Custom(HLSL) 노드 하나로 처리하고 바깥은 파라미터만 노출했다. Pro

케이지 구출 이번엔 살인마가 다운된 생존자를 케이지에 가두고, 다른 생존자가 다가가 구출하는 전 과정을 작성했다. 정리하면 이번 목표는 이렇다. 케이지를 상호작용 대상으로 만들어 조준·구출이 되게 한다 구출은 완전 회복이 아니라 부상 상태로 풀어준다 서버·클라 사이에 갇힌 모습이 똑같이 보이게 한다 케이지 상호작용화 현재 케이지는 상호작용 대상으로 ...

관전자(Spectator) 처리 이번에는 플레이를 마친 생존자가 남아 있는 팀원의 화면을 볼 수 있도록 멀티플레이 관전자 시스템을 구현했다. 구현 목표는 다음과 같았다. 다음·이전 플레이어로 관전 대상을 전환한다 대상의 이동은 따라가되, 카메라 Look은 관전자에게 맡긴다 플레이할 때와 관전할 때의 Look 감각을 동일하게 유지한다 관전 대상이 사망하...

상호작용 가능한 소모품과 인벤토리 이번엔 기존에 치료 기능으로만 존재하던 Medkit을 월드 아이템으로 변경하고, 새로운 소모품인 Speed Potion을 추가했다. 정리하면 이번 목표는 이렇다. Medkit과 Speed Potion을 맵에 배치하고 직접 줍거나 버릴 수 있게 한다 기존 수집품과 소모품이 같은 4칸 인벤토리를 사용하게 한다 동일한 소모...

문제 상황 이번에 FPS 내용을 공부하다가, 새로운 애니메이션 개념을 학습하게 되어서 작성하게 되었다. Aim Offset을 적용하면 조준 방향에 따라 상체와 오른손, 그리고 오른손에 부착된 무기가 함께 움직인다. 하지만 왼손은 기존 애니메이션 포즈만 따라가기 때문에 무기의 손잡이에서 떨어질 수 있다. 무기와 조준 각도마다 별도의 애니메이션을 만드는 ...