3 분 소요

🌝 공지 사항 이 포스트는 인프런의 입문자를 위한 UE5-Part2. 언리얼 엔진 2D 게임 개발 입문 강의를 통해 학습한 내용의 요약입니다. 자세한 내용은 해당 강의를 참고해주세요.

#

지금까지 학습해오면서 상황에 따라 이런 저런 코드들을 추가하고 변경했었기 때문에, 현 시점에 어떻게 동작하고 있는지 정리를 한 번 해봄.

Level의 구성

  1. 타일맵Tilemap
    • Texture file -> TileSet -> TileMap 세 파일로 변형시켜서 레벨에 배치
    • TileSet에서는 어떤 타일에 Collider를 붙일 수 있는지 설정할 수 있다.
    • 벽 타일에 충돌 설정 후, TileMap에서 두 layer를 구성해서 맵을 만들어 배치함.
  2. Skeleton과 PlayerStart 배치
    • 벽 타일과 겹치지 않게 배치해둔 상태

BP_Class의 구성

Creature

Object -> Actor -> Pawn -> Character -> PaperCharacter 를 상속받음. 즉 레벨에 배치할 수 있고, 빙의될 수 있으며, 움직임과 관련된 기능이 붙어있고, SkeletalMesh 대신 Flipbook을 쓸 수 있음.

  • 실행 시 CreatureDateTable에서 정보를 받아와서 Hp와 MaxHp 세팅
  • UpdateLogic 에서 state가 move일 때 Add Movement Input을 통해서 Direction에 따라 이동 image-20240413073404901
  • UpdateAnimation

    • 측면 애니메이션이 하나밖에 없으므로, 먼저 Direction이 Left일 때 Set Relative Rotation을 이용해서 Z축을 180도 회전시켜 준다. 그래서 이 이후부터는 up, down, side만 설정하면 됨. image-20240413073633549
    • 각 상태에 따라서 Set Flipbook으로 지정해주는데, 어떤 방향이냐에 따라서 지정할 flipbook의 종류가 다르다. Data에 각 방향/행동에 대한 flipbook을 모두 저장해두고, State/Direction에 따라 각각의 flipbook을 Set 해준다. image-20240413073919059
  • BeginAttack

    • Creature가 공격에 들어가게 되는 경우 실행되는 Custom Event

    • Custom Event이므로 호출될 때 실행된다.

    • 상태가 ( Idle, Move )인 경우 Skill 상태로 변경하고, Update Animation실행해서 Attack Flipbook을 재생한다. 이후 Process Attack(밑에 설명)을 실행한다.

    • 마지막에는 Get Flipbook Length를 통해서 현재 재생되는 Flipbook의 전체 재생시간을 받아오고, 그 시간만큼 Delay해서 충분히 재생될 수 있도록 한다. 공격이 종료되면 State를 Move로 변경한다.

    • ProcessAttack

      • BP_Creature는 Viewport에서 sprite 산하에 3개의 공격범위 충돌체를 가지고 있다.

      • 각 Direction에 따라서 충돌체를 select 한 다음, Get Overlapping Actors 를 통해서 현 시점에 겹치는 BP_Creature들을 Array로 가져온다. image-20240413074943330

      • 가져온 배열을 for each로 하나하나 처리하는데, 현재 Array의 Element는 Actor Class이므로 BP_Creature로 캐스팅 해준 다음 OnDamaged 함수를 실행한다. 이때, OnDamaged는 Damage와 Attacker를 매개변수로 받는데, Damage는 Data에서 가져오고 Attacker는 self(자신)로 설정한다.

        • OnDamaged

          • Damage를 입는 주체가 Attacker가 아닐 때만 실행한다.

          • (Hp - Damage)를 구해서 Hp를 Set 하는데, 그 수치는 0부터 MaxHp 사이에 있어야 한다(Clamp). image-20240413075703329

          • 이후 HpBar 수정을 위해서 현재 Hp와 MaxHp의 비율을 Hp Ratio에 저장한다. UI로 만들어둔 WBP_HpBar는 바로 밑에 설명.

          • 이 또한 Creature의 component로 붙어있는 HpBarWidget을 가져와서 Widget Object로 불러오고, WBP_HpBar로 캐스팅 해주는 작업이 필요하다. (WBP_HpBar 안에 있는 HpRatio를 가져와서 Set 하기 위해서)

            image-20240413080213386

WBP_HpBar

  • User Interface > Widget Blueprint로 생성함.
  • 내부에는 UI와 관련된 많은 component들이 이미 준비되어 있음. ProgressBar를 만들고 HpRatio변수를 선언해둔다.
  • Detail에서 HpRatio를 Binding 해두면 이후 해당 변수 변화에 따라서 자동으로 Progress가 설정된다.

BP_Knight

image-20240415222326376

  • BP_Creature를 상속받음.
  • Event BeginPlay
    • Get Data Table Row 를 통해서 Knight에 대한 정보를 받아와서 Creature.Data 변수에 저장한다.
    • 이 변수를 이용해서 Creature의 BeginPlay에서 Hp, MaxHp 등 변수의 값을 세팅한다.
  • Event Tick : Update Logic과 Update Animation이 실행될 수 있도록 Parent: Tick을 실행한다.
  • InputAction Attack : Knight는 버튼을 눌렀을 때 공격이 실행되어야 하므로, Creature.BeginAttack() 이 실행되도록 연결해둔다.

BP_Monster - BP_Skeleton

  • 사실 현재로서는 Monster가 딱히 하는게 없다.
  • Skeleton에서는 Knight와 마찬가지로 DataTable에서 Skeleton의 데이터를 Data 변수에 저장한다.

AI와 Controller

BP_PlayerController

  • 캐릭터의 움직임과 관련된 로직이 실행된다.
  • 현재 게임이 실행되면 Knight 하나가 바로 플레이어로 지정되는 상태이다. 따라서, 플레이어의 상태를 제어하기 위해서 “현재 컨트롤하고 있는 Pawn”을 BP_Knight MyPlayer 변수에 저장한다. image-20240415223207171
  • Update Input
    • MyPlayer 의 State에 따라서 실행된다. 공격 중일 때에는 움직일 수 없으므로 Idle과 Move 상태일 때에만 실행.
    • 순서대로 시퀀스 0, 1, 2가 실행된다.
      • seq 0 : MoveUp과 MoveRight의 value가 0이 아닐 때에만 state를 move로 변경한다. image-20240415223452246
      • seq 1, 2 : 각각 MoveUp, MoveRight이 양수냐 음수냐에 따라서 Direction을 지정한다. image-20240415223715113
      • 이때 지정된 방향에 따라서 Creature에서 Update Logic이 실행되면서 이동이 실행된다.

BP_AIController

  • Skeleton에 Detail > Pawn > AIController 에 BP_AIController를 설정해두면 해당 pawn의 움직임이 이 컨트롤러를 따르게 된다.
  • 따라서 BP 내부에서 Get Controlled Pawn을 찾으면 이녀석이 BP_Monster이므로 casting해서 My Monster 변수에 저장해준다. image-20240415225324700
  • UpdateAI
    • PlayerController의 UpdateInput과 마찬가지로, 상태와 방향을 지정해주어야 한다.
    • 마찬가지로 이동은 Creature에서 공통으로 제어하고 있음.
    • 먼저 MyMonster는 Idle 상태에서 BP_Knight를 찾고, BP_Monster.Target Enemy 변수에 저장한 다음 상태를 Move로 변경한다.
    • Move 상태에서는 Target과 나와의 거리를 빼서 Chase Direction을 구하고, 이 거리값의 X, Z 절대값에 따라서 이동할 방향을 지정해준다.
    • Chase Direction이 300 미만일 때에는 Creature.BeginAttack() 이벤트를 호출한다.

카테고리:

업데이트:

댓글남기기