[UE5] Assassin24 - Boss Enemy(1)

윤정민·2023년 7월 26일
0

[Unreal Project]Assassin

목록 보기
25/26
post-thumbnail

1. 개요

현재 프로젝트에 적 캐릭터는 한 종류밖에 없다. 프로젝트를 완성하기 위해 적 캐릭터 부분을 확장시켜야 하기 때문에 적 부분을 확장 가능하도록 리팩토링한 뒤, Boss 캐릭터를 만들어보자.
고려해야 되는 부분은 크게 Character 부분과 Controller부분 그 이외에 Animation& BT & BB를 고려하면 된다.

2. 클래스 구조

  • Character
    • Enemy Character클래스에서 Enemy들이 공통적으로 수행하는 행위(죽으면 AIController의 IsDead 키값을 true로 변경하는 등)를 작성
    • 하위 클래스에서는 해당 클래스에서만 실행되는 기능을 작성
  • Controller
    • AIControllerBase에서는 모든 AI가 사용하는 BBKey값을 작성하고 시각 정보를 위한 컴포넌트를 만들어 줌
    • 하위 MeleeAI에서는 청각 컴포넌트를 추가

3. Behavior Tree

보스는 일반 적과 달리 전투 능력이 높아야 한다. 이를 위해 다양한 스킬을 구사하도록 할 수 있지만 게임을 현실기반으로 하고있으니, 다양하고 화려한 스킬은 이질감이 들 수 있다. 그러니 플레이어 캐릭터가 행할 수 있는 행위들을 추가하여 보스의 전투능력을 향상 시키자. 일반 적과 플레이어 캐릭터의 차이점은 원거리 공격, parry, dodge가 있다.

일단 이번시간은 근거리 공격을 위주로 구현할 것이니 parry와 dodge를 적절히 실행하도록 해주자.

3.1. Dodge

  • BT의 service를 사용해 구현

  • 플레이어와 캐릭터가 지정한 거리보다 가까히 있다면 뒤로 dodge를 실행

  • AI State가 holding일 때 service를 실행하도록 해줌

  • attack시 너무 가까운 거리에서 공격을 하게되면 콜리전이 겹치면서 캐릭터가 날아가는 문제가 발생해 attack시 가깝게 붙어있다면 dodge를 실행하도록 서비스를 붙여줌

3.2. parry

  • parry가 구현되어 있는 내용(플레이어 만들면서 구현해뒀음)
    • TryParry()를 호출하면, IsParry = true가 되고 1초 뒤 다시 false가 됨
    • 공격을 받았을 때 IsParry == true라면 적의 공격에 맏는 막기 애니메이션을 출력

  • BT에서 CanSeePlayer==true일 때 TryParry()를 호출하는 서비스를 실행

3.3. 결과

4. Strafe를 위한 EQS

이전에 일반 적을 구현하면서 strafe를 구현했는데 주변 위치중 random으로 한 위치를 골라 해당 위치로 이동하는 방식을 사용했다. 하지만 이 방법의 아쉬운 점이 내가 설정한 위치들 중 랜덤한 한 위치를 선택하는 방식이 아닌 특정 범위 내의 한 점을 선택할 수 밖에 없다는 것이다. 이를 해결하기 위해 EQS를 사용할 수 있다.

EQS는 환경의 특정 위치들에 질문을 던져 점수를 계산하고 가장 높은 점수를 얻은 위치를 결과로 반환하는 형식이다. 여기서 특정 위치들에 질문을 던질 수 있다는 점이 위의 문제를 해결할 수 있게된다. 심지어 위치들의 개수, 모양, 범위 등등을 다양하게 설정할 수 있다는 점도 장점이다. 또한 구현도 매우쉽다. 아마 프로그래머가 아니라도 쉽게 구현 가능할 것 같다.


  • BT_Task로 구현한 strafe

  • EQS로 구현한 strafe

EQS

  • Environment Query Context: 지점의 기준이 되는 것
    • 나는 Enemy에서 eqs를 실행하지만 지점은 Player주변의 지점을 고려할 것이기 때문에 custom으로 만들어 주었음(프로그래밍 필요)
    • 플레이어를 기준으로 지점을 원형으로 생성
  • 조건
    • 해당 지점에 도달 가능한가
      • 해당 지점의 환경 주변에 enemy가 위치할 수 있는 환경인지 확인
    • 거리가 가까운가
      • 거리가 먼 지점을 선택하게 되면 player를 가로질러 갈 수 있기 때문에 현재있는 지점에서 어느정도 떨어진 지점을 선택하도록 만듦
      • 너무 가까운 지점을 선택하는 것도 방지할 수 있음

profile
그냥 하자

0개의 댓글