UE4 Chapter 4-2. 몬스터 AI : 플레이어를 쫓아 가는 AI, Enum

Date:     Updated:

카테고리:

태그:

인프런에 있는 황대희님의 언리얼 엔진4 3D 횡스크롤 게임 만들기 강의를 듣고 정리한 필기입니다. 😀
언리얼 엔진 공식 문서 https://docs.unrealengine.com/ko/index.html

몬스터가 플레이어를 따라가게 하기

플레이어가 자기 자신(몬스터)와 가까이 있으면 플레이어를 따라가게 만들기.

🔔 플레이어와의 거리 구하기

플레이어가 자기 자신(몬스터)과 가까이 있으면 따라가야 하므로 매 프레임마다 플레이어와의 거리를 체크해야 한다.

🚩 “DeaultMonsterBP” 블루프린트 이벤트 그래프

image

  • Tick 👉 Set DistancePlayerCharacter 👉 Set DirToPlayerCharacter
    • 매 프레임마다 변수 DistancePlayerCharacterDirToPlayerCharacter의 값을 세팅한다.
  • (플레이어(Player Index 0)의 위치 - 몬스터(self)의 위치) 결과 벡터의 Y 방향에서의 거리만 취한다.
    • 횡스크롤 게임이기 때문에 X 축(앞, 뒤)는 쓰지 않고 Y 축(왼쪽, 오른쪽)만 따질 것이다. 따라서 플레이어와 몬스터와의 거리를 Y 방향에서의 거리만 따진다.
      • Break Vector
        • 입력으로 들어온 Vector의 X, Y, Z 성분을 각각 출력한다.
        • (플레이어(Player Index 0)의 위치 - 몬스터(self)의 위치)의
      • Make Vector
        • 입력으로 들어온 X, Y, Z 성분으로 Vector를 만들어 리턴한다.
        • (플레이어(Player Index 0)의 위치 - 몬스터(self)의 위치) 결과 벡터의 Y 값만 취한 후 이 Y 값으로 (0, Y, 0) 벡터를 만든다.
        • 이 리턴 결과가 바로 몬스터(자기 자신)과 플레이어와의 거리로 사용할 값이다. Y 방향에서의 거리.
  • DistancePlayerCharacter 👉 몬스터(자기 자신)과 플레이어와의 Y 방향에서의 거리(float)
    • Make Vector의 리턴값을 Set DistancePlayerCharacter에 연결
  • DirToPlayerCharacter 👉 몬스터(자기 자신)과 플레이어와의 Y 방향 벡터
    • Make Vector의 리턴 벡터를 Normalize 하여 방향 벡터(단위 벡터)로 만든다.
    • 이를 Set DirToPlayerCharacter에 연결


🔔 플레이어가 가까이 오면 플레이어를 쫓아가게 하자.

Enum 정의

언리얼에서 Enum을 생성하는 방법은 콘텐츠 브라우저 - 우클 - 블루프린트 - Enumeration을 클릭하면 된다. 이곳에서 Enum을 관리할 수 있다. Enumeration을 생성하고 이름은 “MonsterState”으로 해주자. 몬스터의 상태를 정의할 것이다.

image

  • 3 가지 상태를 정의해주자
    • Idle 👉 정지
    • FollowChar 👉 캐릭터(플레이어)를 쫓아 가는 상태
    • AttackChar 👉 캐릭터(플레이어)를 공격하는 상태


쫓아가게 만들기

🚩 “DeaultMonsterBP” 블루프린트 이벤트 그래프

image

DistancePlayerCharacter(거리)와 DistancePlayerCharacter(방향)을 설정해주는 노드 흐름들을 SaveDistAndDir이라는 커스텀 이벤트가 발생하면 실행되도록 묶어서 빼두었다. Tick 매프레임마다 👉 SaveDistAndDir 이벤트를 발생시킴. (거리와 방향을 변수에 저장)

image

  • CurState 변수 추가
    • Enum 타입이다. 위에서 몬스터의 상태들을 추가했던 “MonsterState” Enumeration.
  • Tick 👉 SaveDistAndDir
    • 매 프레임마다 SaveDistAndDir 이벤트를 발생시킨다. (거리와 방향을 변수에 저장하는 과정)
  • SaveDistAndDir 👉 Monster State에 따른 스위치
    • Enum 스위치
      • CurState 값이 Idle 일 때
        • 플레이어와의 거리가 5 미터 이하면 상태를 Idle에서 FollowChar로 바꾼다.
          • (DistancePlayerCharacter(거리) <= 500.0) 조건식을 실행한다.
            • 거리가 5 미터 이내라면 True 리턴. 언리얼에서는 100 이 1미터다. cm 단위라서.
          • 조건식이 참이라면 Set CurState 노드를 실행시킨다.
            • Cur State 값을 Idle에서 FollowChar로 설정한다.
        • FollowChar로 상태가 바뀌었으니, Tick이벤트에 의해 실행되는 다음 프레임의 스위치 실행 때는 FollowChar 출력에 달린 실행핀이 실행된다. ✨✨
      • CurState 값이 FollowChar 일 때
        • Add Movement Input 노드를 실행시킨다.
          • 자기 자신(몬스터, self)을 DistancePlayerCharacter 방향으로 1.0 (Scale Values)만큼 움직인다.
            • 매 프레임마다 1 cm씩 움직이는 꼴이 됨.
      • 즉, 플레이어와의 거리가 5 미터 이하면 플레이어가 있는 방향으로 매 프레임마다 1.0 움직이게 된다.


속도에 따라 Idle, Walk 애니메이션

몬스터의 속도가 0.1 보다 크면 Walk 애니메이션을 재생하게 하고, 0.1 보다 작으면 Idle 애니메이션을 재생하도록 한다.

🚩 “DeaultMonsterAnimBP” 애니메이션 블루프린트 이벤트 그래프

애니메이션이 업데이트 될 때마다 몬스터의 속도를 받아와 이를 Speed 변수에 저장해야 한다. float 타입의 Speed 변수를 추가했다.

image

  • Blueprint Update Animation 👉 Set Speed
    • 애니메이션 블루프린트에서는 매프레임마다 Speed 변수 값을 세팅한다.
      • 이 애니메이션 블루프린트의 주인(“DefaultMonsterBP”)의 속도의 크기를 Speed에 담는다.
        • Try Get Pawn Owner : 애니메이션 블루프린트의 주인을 리턴
        • Get Velocity : 입력으로 들어온 액터의 속도 벡터를 리턴
        • Vector Length : 입력으로 들오온 벡터의 크기를 리턴

🚩 “DeaultMonsterAnimBP” 애니메이션 블루프린트 애님 그래프

image

  • Idle 애니메이션 👉 Walk 애니메이션 : (Speed > 0.1) 일 때 발생 -image
  • Walk 애니메이션 👉 Idle 애니메이션 : (Speed <= 0.1) 일 때 발생
    • image


기타 설정

  • 문제점
    • 플레이어를 쫓는 속도가 너무 빠름 👉 속도 줄이기
    • 플레이어와 충돌하면 튕겨져 나옴 👉 충돌시 플레이어를 관통하기
    • 애니메이션이 버벅거림 👉 Walk 애니메이션 자체에 이동값이 있어서 그런 것이므로 루트 모션 잠금
  • 그리고 향하는 방향에 따라 회전하기

속도를 줄임

🚩 “DeaultMonsterBP” 블루프린트 Character Movement 컴포넌트 클릭

image

“DeaultMonsterBP”의 최대 속도를 110으로 줄였다.

충돌되지 않게

🚩 “DeaultMonsterBP” 블루프린트 Capsule Component(몬스터 자체의 Collision) 컴포넌트 클릭

image

“DeaultMonsterBP” 자체의 Collision은 Pawn 에 대해서는 관통하도록 체크했다. (이게 가능하려면 Custom으로 바꿔주어야 함) 플레이어와 몬스터들은 Character이므로 Pawn이니까 몬스터는 플레이어와 본인과 같은 몬스터들에 대해서만 관통할 것이다.

루트 모션 잠금

🚩 “sword_and_shield_walk” 애니메이션 파일

걷는 애니메이션 자체가 앞으로 걷는 애니메이션이라 이동 값이 존재한다. 제자리에서만 진행되는 애니메이션이 아니다. 따라서 속도 위치 값을 계산하는데에 영향을 주기 때문에 루트 모션을 잠궈 애니메이션이 영향 주지 않게끔 한다.

image

방향에 따라 회전하기

🚩 “DeaultMonsterBP” 블루프린트 Character Movement 컴포넌트 클릭

image

회전 속도도 증가시켜 주었다.



🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우 
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄

맨 위로 이동하기

댓글남기기