Coding

    [C++ Primer Plus] 2. Setting Out to C++

    출처: C++ Primer Plus 6th Chapter 2 대답해야 하는 질문들 Function Header는 어떤 정보를 담고 있나요? #include는 빌드에서 어떻게 작동하나요? Namespace는 왜 사용하나요? The Function Header Funtion Header는 해당 함수를 호출하기 위한 인터페이스를 알려준다. Return Type은 Called function이 끝나서 Calling function으로 돌아갈 때, 어떤 정보가 들어오는 지 알려준다. argument list 또는 parameter list는 Calling funtion에서 Called function으로의 정보 흐름을 알려준다. void main() main 함수를 선언하는 여러 방법이 있다. main() // ..

    [C++ Primer Plus] 1. Getting Started with C++

    출처: C++ Primer Plus 6th Edition Chapter 1 대답해야 하는 질문들 C와 C++의 역사를 간략히 설명하세요. Procedural Programming과 Object Oriented Programming을 비교하세요. C++가 어떻게 C에 Object-Oriented Programming 컨셉을 구현했는지 설명하세요. C++가 어떻게 C에 Generic programming 컨셉을 구현했는지 설명하세요. Program은 어떻게 만들어지나요? Learning C++: What Lies Before You C++는 Procedural Programming(=C), Object-Oriented Programming, Generic Programming의 교차점에 있다. 그렇기에 만약..

    Replication

    출처: https://youtu.be/JOJP0CvpB8w Net Mode Net Mode는 World의 상태다. 4가지 상태 중 하나여야 한다. 플레이 가능한가? 월드에 권한이 있는가? 다른 사용자를 받을 수 있는가? NM_Standalone O O X NM_DedicatedServer X O O NM_ListenServer O O O NM_Client O X X 게임이 시작되면 UGameEngine 가 생기고 그 밑에 UGameInstance 와 ULocalPlayer 가 생긴다. 그러면 우리는 브라우저에 URL을 통해 해당 게임 서버에 접속할 수 있다. 이 때, Net Mode도 함께 입력해야 한다. 예를 들어, NM_Client라면 게임을 플레이할 수 있지만 월드에 대한 전적인 권한은 가질 수 없..

    #22: Multi-cell(Jigsaw) Inventory System

    Multi Cell Inventory 디아블로나 이스케이프 프롬 타르코프처럼 인벤토리가 2차원 모눈종이 상에 아이템을 보관하는 방식을 의미한다. 사진 출처 보통 이런 인벤토리 방식은 난이도와 리얼리티를 더해준다. Inventory 구성 요소 InventoryComponent : UActorComponent 메인 캐릭터에 붙어 있는 액터 컴포넌트. 인벤토리의 논리적 기능 (아이템 추가, 제거 등)을 담당한다. InventoryWidget : UUserWidget 인벤토리 UI에 해당하는 위젯 InventoryGridWidget : UUserWidget 인벤토리 UI에서 아이템 그리드를 그리는 위젯 ItemWidget : UUserWidget InventoryComponent가 가지고 있는 아이템들의 UI에..

    언리얼에서 낮 밤 만들기 (+시간 시스템)

    결과물 1. 시간 시스템 만들기 (GameState) 시간 시스템은 두 개 변수가 필요하다. 하나는 하루의 길이, 다른 하나는 현재 게임 시간이다. 이 때, 현재 시간은 런타임(게임이 실행되고 있을 때)에 어디서든 쉽게 접근할 수 있어야 한다. 쉽게 접근하기 위해 해당 코드는 GameState에 구현하도록 한다. Create Blueprint를 하고 Parent Class를 GameStateBase로 한다. 그리고 안에 변수를 두 개 만든다. MinPerDay(float) : 게임의 하루가 현실의 몇분인지 CurrentDateTime(DateTime) : 현재 게임의 시간 * CurrentDateTime은 계산의 편의성을 위해, UE에서 정의한 FDateTime으로 저장했다. Tick은 다음과 같이 구현..

    #21: 전투 시스템 개선

    분석 게임의 코어 시스템만 만든 채로 테스트 플레이를 해봤는데, 문제가 많았다. 물리엔진 오류(서로 부딪히면 적이 날라가버림)이나 일정 경우에 페이탈 에러가 뜨기도 했다. 해본 결과 가장 문제는 "전투가 재미없다"였다. 왜 그럴까? 다크소울3와 엘든링을 플레이하며 분석을 해봤다. 크게 2가지 문제로 나누었다. 위협적이지 않은 AI AI는 굉장히 방어적이다. 문제는 방어적이면 방패라도 들고 있던가해서 플레이어가 무턱대고 공격하지 못하도록 해야 하는데, 아직 방패 구현이 되어 있지 않아서 그냥 샌드백이었다. 이를 위해서 AI를 좀더 공격적으로 만들 필요가 있다. 리스크가 없는 공격 플레이어의 공격 모션이 적에 비해서 아주 빨라서 공격하기가 너무 쉽고, 적은 어떤 공격이라고 맞으면 휘청거리니 가까이 다가가서 ..

    UE4: Delegate

    Delegate 정의 Delegate는 대리인이라는 의미다. 무엇을 대리한다는 걸까? Delegate가 대리하는 것은 함수다. 그러니까 특정 함수를 직접 부르는 대신, Delegate를 사용해서 대리 실행할 수 있다. Delegate의 소용 1: 클래스 간 결합도 낮추기 대리 실행이 왜 필요할까? 그 첫번째 이유는 클래스 사이 의존성을 약화시킬 수 있기 때문이다. 클래스 A가 대리인 MyDele_A가 있다고 가정하자. MyDele_A는 클래스 A의 멤버함수 PrintOne()의 대리자다. 그러니까 MyDele 보고 너 실행해!라고 말하면 실제로는 PrintOne()이 실행된다는 뜻이다. // 클래스 A를 나타낸 의사코드 class A { public: FDelegate MyDele_A; protected..

    #19 테스트 레벨 제작

    테스트 맵 테스트 맵은 Geometry Brush로 빠르게 제작했다. 미로를 만들어야 해서 Maze Generator를 사용했다. 나중에는 Mesh Generation을 C++로 구현해야 할 것이다. 어떤 방식으로 할지는 고민해봐야겠다. 메인 메뉴 제작 구색을 맞추기 위해 시작 - 나가기만 구현된 메인 메뉴를 만들었다. 이 때, 잘 쓰는 블루프린트 노드는 AddViewport / Set Input Mode / Set Show Mouse Cursor 등이 있다. 재시작 구현 플레이어가 죽으면, 재시작을 할 수 있다는 Widget을 띄어야 한다. 이게 생각보다 코드로 나타내기 난감한데, 양은 적다. // Header class TSubclassOf RestartWidgetClass; // cpp if (Re..