[이득우 언리얼 C++] 14. 게임 플레이의 제작
- 📕 Book/이득우 언리얼 C++
- 2022. 3. 10.
💻 Code : https://github.com/tedison7/ArenaBattle
캐릭터의 스테이트 설정
플레이어 캐릭터와 AI 캐릭터의 기능을 체계적으로 관리하기 위해 캐릭터에도 스테이트 머신 모델을 구현해 보자
- PREINIT 스테이트 : 캐릭터 생성 전의 스테이트, 캐릭터와 UI를 숨겨둔다
- LOADING 스테이트 : 선택한 캐릭터 애셋을 로딩하는 스테이트, AI인지 플레이어인지 구분 가능, 로딩이 완료될때 까지 조종을 비활성화
- READY 스테이트 : 캐릭터 애셋 로딩이 완료된 스테이트, 숨겨둔 캐릭터와 UI를 보여주며, 이때부터는 대미지 처리가 가능하며 캐릭터를 조종할수 있다.
- DEAD 스테이트 : 캐릭터가 HP를 소진하여 사망하는 스테이트, 죽는 애니메이션을 재생하고 UI를 끄는 한편 충돌을 없애고 대미지를 입지않도록 설정, AI인 경우 로직을 중지
4.27에서 변화된 점이 있다면 bCanBeDamaged는 Private로 더이상 접근이 불가능하며 SetCanbeDamaged()와 CanBeDamaged() 함수로 접근 하도록 변경되었다. 그리고 위와 같이 스테이트 기본구성을 끝냈다면 AI 컨트롤러의 구조를 변경하자.
컴파일후 플레이를 해보면 NPC가 사망하면 AI를 멈추고 레벨에서 퇴장하는 것을 확인 할 수 있다. 플레이어가 죽으면 해당 레벨을 다시 시작한다.
플레이어 데이터와 UI 연동
언리얼 엔진은 플레이어의 정보를 관리하기 위한 용도로 PlayerState 클래스를 제공하낟. PlayerState를 상속받은 ABPlayerState 클래스를 생성하자.
컴파일후 플레이를 해보면 플레이어블 캐릭터는 5레벨로 설정된다. 이제 HUD UI를 부착해보자 예제에서 UI_HUD.uasset 파일을 프로젝트에 복사하였다. 그리고 UserWidget을 상속받는 ABHUDWidget 클래스를 생성하였다.
ABHUDWidget 이외에도 코드 작업이 있지만 내용이 많아 생략하였다. 코드 작성후 플레이를 해보면 캐릭터의 스탯 정보가 HUD에 연동되어있음을 확인할 수 있다.
이어서 플레이어 데이터에 경험치 정보를 표시하도록 해보자. NPC를 처치하면 경험치를 얻고 레벨업하는 기능을 구현한다.
책의 예제 코드를 따라 ABPlayerState에 Exp 변수를 추가하고 Exp가 획득 로직을 추가하였다. 코드를 작성하고 플레이후 NPC를 처치하면 경험치 항목이 업데이트 되는것을 확인할 수 있다.
게임 데이터의 관리
다음으로 UI 오른쪽 상단의 스코어 부분을 구현해보자 현재 레벨을 GamePlay 라는 이름으로 저장하고 해당 레벨로 시작레벨을 설정하고 NavMesh영역을 충분히 크게 설정해준다. 그리고 GameStateBase 클래스를 상속받는 ABGameState 클래스를 생성하자.
예제를 따라 생성한 ABGameState 클래스를 다른 클래스에 적용한 코드들을 작성하였고, 컴파일후 NPC를 제거후 스코어 점수가 올라갔음을 확인 할 수 있었다.
요약
- 캐릭터 스테이트 설정 관리
- 플레이어 데이터를 UI에 연동