이득우의 언리얼 C++ 게임 개발의 정석 언리얼 엔진은 SaveGame이라는 클래스를 통해 게임 데이터를 저장하고 로딩하는 기능을 제공한다. 윈도우, 맥, 안드로이드 등 각 플랫폼별로 알맞은 최적의 장소에 데이터가 저장되며, 에디터 모드에서는 Saved/SaveGames 폴더에 .sav 파일로 저장된다. CoreMinimal.h를 ArenaBattle.h로 변경한다. 게임 데이터에 레벨, 경험치, 플레이어 이름, 최고 점수를 저장시킨다. 각 데이터의 기본값을 지정한다. 이 기본값들은 저장된 게임 데이터가 없을 경우 초깃값으로 사용된다. 게임 데이터를 저장하고 불러오기 위해서는 고유의 슬롯 이름이 필요하다. 슬롯을 여러 개 만들어 세이브 데이터를 여러 개 만들 수 있다. 각 슬롯은 플레이어 번호를 통해 여..
이득우 교수님의 책을 보며 공부하다가 아래와 같은 코드를 작성했다. 섹션(혹은 던전)에서 AI를 하나 생성하고 OnDestroyed 델리게이트에 던전을 COMPLETE 상태로 전환하는 함수를 등록했다. 그런데 의문점이 하나 생겼다. OnDestroyed Event triggered when the actor has been explicitly destroyed. docs.unrealengine.com 공식 문서를 보면 OnDestroyed 델리게이트는 액터가 명시적으로 소멸됐을 때 발동한다고 한다. Implicitly(암시적)이었으면 아.. GC가 실행되기 전이라서 가능한 거구나..할텐데, 명시적으로 액터가 소멸되었는데 그 안에 있는 델리게이트를 발동하고 심지어 소멸된 액터를 함수에서 사용하다니.. 아래..
이득우의 언리얼 C++ 게임 개발의 정석 현재 레벨을 다른 이름으로 새로운 레벨로 저장한다. 새로운 레벨에서 테스트를 위해 시작 섹션에 배치돼 있는 캐릭터와 아이템 상자를 모두 제거한 후 NavMeshBoundsVolume을 충분히 크게 만들어준다. 새로운 레벨을 생성한 후에는 필요에 따라 Project Settings > Maps & Modes에서 기본 레벨을 지정해주는 것을 잊지 말아야 한다. 시작 섹션에서 0점으로 시작해 문을 통과하면 새로운 섹션이 생성된다. 새로운 섹션에서 AI를 처치하면 1점을 획득한다. 이 게임은 싱글 플레이이기 때문에 플레이어의 점수가 곧 게임 스코어라고 할 수 있다. 멀티 플레이의 경우 두 개가 같지 않을 수 있다. 1번 플레이어는 왼쪽 지역을 탐험하고 2번 플레이어는 오..
이득우의 언리얼 C++ 게임 개발의 정석 HUD UI에 경험치 데이터를 바인딩해본다. AI를 죽이면 AI에게서 얻을 수 있는 경험치를 플레이어에게 전달하고 축적해 레벨업하는 기능을 구현한다. 캐릭터 스탯 컴포넌트에서는 죽일 시 얻을 수 있는 경험치를 제공해야 하고, 캐릭터 클래스에서 캐릭터 스탯 컴포넌트를 통해서 가져올 수 있어야 한다. 플레이어 스테이트에는 플레이어의 축적 경험치를 보관하도록 설계해야 한다. 캐릭터가 죽을 때 AI가 플레이어에게 죽은 것인지 검사하고, 플레이어 컨트롤러를 통해 플레이어 스테이트를 갱신하는 로직을 추가해야 한다. 우선, 플레이어 스테이트에서 경험치 비율을 반환하는 함수와 경험치를 축적하는 함수를 선언한다. 게임 인스턴스의 ABCharacterTable에서 레벨에 해당하는 ..
이득우의 언리얼 C++ 게임 개발의 정석 현재 UI_HUD 위젯 블루프린트의 모습은 다음과 같다. 플레이어의 이름과 HP 정보 등이 표시돼야 하므로, 플레이어 스테이트와 캐릭터 스탯 컴포넌 둘 모두에 바인딩해야 한다. 플레이어 스테이트에 상태가 변경되었을 때 발동할 멀티캐스트 델리게이트를 선언한다. 캐릭터 스탯 컴포넌트에는 OnHPChanged 델리게이트가 이미 선언되어 있다. HUD UI에서 두 곳에 있는 델리게이트에 위젯을 갱신하는 함수를 등록해 바인딩할 것이다. 캐릭터 스탯 컴포넌트와 플레이어 스테이트의 델리게이트에 함수를 등록해 바인딩하는 선언한다. 두 델리게이트에 바인딩 할 UI 갱신 함수도 선언한다. NativeConstruct() 함수는 UI 생성이 완료된 후 위젯을 초기화하는 시점에 호출된..
이득우의 언리얼 C++ 게임 개발의 정석 예제 폴더의 Resource > Chapter14 > Book > UI 폴더에 있는 UI_HUD.uasset 파일을 복사해 프로젝트의 Content > Book > UI 폴더에 붙여넣는다. 위젯 블루프린트 에셋이다. UI_HUD의 부모 클래스로 지정할 새로운 UserWidget 클래스를 만든다. CoreMinimal.h를 ArenaBattle.h로 변경해준다. UI_HUD 위젯 블루프린트를 열어 부모 클래스를 UUserWidget 클래스를 상속한 ABHUDWidget 클래스로 변경해준다. 플레이어 컨트롤러에서 UI_HUD 위젯을 생성하고 화면에 띄워보겠다. 위젯 생성은 플레이어 컨트롤러의 BeginPlay() 함수에서 내부적으로 수행된다. 그러므로, 위젯 생성 코..