UE4 Chapter 4-3. 몬스터 AI : 몬스터의 공격

Date:     Updated:

카테고리:

태그:

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

몬스터의 공격

🔔 몬스터의 공격 준비

플레이어의 공격 충돌 처리과 비슷하게 구현하면 된다.

사정 거리내에서는 공격 상태로 바꿔주기

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

image

  • 현재 상태가 Idle 일 때 👉 DistancePlayerCharacter <= 500 조건 검사. 👉 True 라면 상태를 FollowChar로 바꾸기
    • Tick 이벤트에 의하여 다음 프레임때는 스위치에서 FollowChar 출력 실행핀이 실행된다.
  • 현재 상태가 FollowChar 일 때 👉 DistancePlayerCharacter <= 160 조건 검사.
    • 👉 True 라면 상태를 AttackChar로 바꾸기
    • 👉 False 라면 몬스터(self)가 플레이어를 쫓아가도록, 플레이어가 있는 방향인 DirToPlayerCharacter 방향으로 1.0 씩 이동하게 한다.


공격 애니메이션

  • 몬스터가 공격할 때 공격 애니메이션을 재생해야하므로, 공격 애니메이션인 “sword_and_shield_slash”로 애님 몽타주 “goblin_slash_Montage”를 생성한다.
    • 공격 애니메이션이 끝나는 시점에 어떤 이벤트를 발생시켜야 한다.
      • 공격이 끝나는 시점에 아래와 같은 경우들을 처리해야 하기 때문
        • 우선 IsAttacking을 False로 만들어 주어야 한다. (다시 쫓아가게 해주어야 하니까. 이 처리를 안해주면 IsAttacking은 영원히 True로 남는다.)
        • 플레이어와의 거리가 가깝다면 공격 애니메이션을 다시 재생한다.
          • IsAttacking을 Ture로 다시 만들어 주어야 한다.
        • 플레이어와의 거리가 멀다면 다시 플레이어를 쫓아가기 위해 FollowChar로 상태를 바꾸어야 하는 경우
    • 👉 공격 애니메이션 끝나갈 즈음에 노티파이 이벤트 추가

🚩 “goblin_slash_Montage” 애님 몽타주

image

  • 공격 애니메이션이 끝나갈 즈음에 이 OnAnimEnd_Attack 노티파이 이벤트를 발생시킨다.
  • “goblin_slash_Montage” 몬스터의 공격 애님 몽타주와 “Goblin_Death_Montage” 몬서트어 사망 애님 몽타주‘DefaultGroup’이라는 이름의 그룹이기 때문에
    • “DeaultMonsterAnimBP” 애니메이션 블루프린트의 애님 그래프의 'DefaultSlot'슬롯 노드에서 애니메이션이 재생된다.
      • Idle, Walk 애니메이션이 작성되어 있는 상태 머신을 덮어 쓴다.
      • image

image

공격 속도가 좀 느리게끔 Rate Scale 값을 1.0에서 0.7로 내렸다. Rate Scale은 몽타주 재생 속도이다.


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

AttackChar 상태가 되면 “goblin_slash_Montage” 애님 몽타주를 재생하도록.

image


공격 중일 때 필요한 그밖의 처리들, 정리

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

image

  • 공격 중인지를 체크하는 bool 타입의 IsAttacking 변수를 추가한다. AttackChar와 구분하기
  • FollowChar 상태일 때.
    • 플레이어와의 거리가 160 이내인지를 검사하고
      • 결과가 True라면 AttackChar 상태로 변경한다.
        • 공격 애니메이션을 재생한다. (공격 애님 몽타주 실행)
          • 공격 중이므로 IsAttacking를 True로 바꾼다.
      • 결과가 False라면 플레이어가 있는 방향으로 플레이어를 쫓아 간다.
  • AttackChar 상태일 때.
    • IsAttacking 값을 검사하고
      • 결과가 True라면 별 실행❌. 공격 중일 때는 플레이어를 쫓아가지 않도록 AttackChar 상태 유지.
      • 결과가 False라면 플레이어와의 거리가 180 이상인지를 검사한다. 공격 상태인데 IsAttacking이 False라는 뜻은 방금 전까지 공격 중이 아니였는데 이제 막 공격 상태가 된 것이다.
        • 결과가 True라면 플레이어를 다시 따라가든, 공격을 다시 실행하든 하도록 FollowChar 상태로 변경한다.

image

  • On Anim End Attack 이벤트가 발생하면
  • IsAttacking을 False 값으로 변경한다. 공격 애니메이션이 끝났으므로.
  • 플레이어와의 거리가 180 을 넘는지 검사한다.
    • 결과가 True라면 FollowChar 상태로 변경한다. 공격도 끝났고 거리도 차이가 나니까 다시 플레이어를 쫓아가도록
    • 결과가 False라면 공격 애니메이션을 재생한다. (공격 애님 몽타주 실행) 거리가 가까우니 공격을 또 반복하기 위하여
      • 다시 공격 중이므로 IsAttacking를 True로 바꾼다.


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

image

  • AnimNotify_OnAnimEnd_Attack 👉 “DefaultMonsterBP”로 형변환
    • 공격 애님 몽타주에 추가해주었던 노티파이 이벤트가 발생하면
    • Speed 구할 때 사용했었던 Try Get Pawn Owner 노드를 사용하여 이 애니메이션 블루프린트의 주인인 “DefaultMonsterBP”를 가져온다.
  • “DefaultMonsterBP”로 형변환 👉 On Anim End Attack
    • “DefaultMonsterBP”의 커스텀 이벤트인 On Anim End Attack 이벤트를 발생시킨다.

🔔 몬스터에게 무기 적용하기

🚩 “DeaultMonsterBP” 블루프린트 뷰포트

  • 원하는 무기 Static Mesh 파일을 “DeaultMonsterBP” Mesh의 자식으로 넣어주었다.
    • 무기 Mesh 는 이제 “DeaultMonsterBP”의 Mesh에 붙어 있게 된다.
    • 오른 팔 뼈대에 붙어 같이 애니메이션 될 수 있도록 부모 소켓을 Right Hand로 설정해준다.
  • 무기 Mesh를 알맞는 자리에 위치시킬 수 있도록 트랜스폼을 조정해준다.
    • 애니메이션을 꺼야 쉽게 조정할 수 있으므로 “DeaultMonsterBP” Mesh의 Animation 컴포넌트로 가서 애니메이션의 재생 속도를 나타내는 Global Anim Rate Scale 값을 잠시 동안만 0.0으로 해두자. (조정 다한 후 다시 1.0으로 되돌리기)

image

image

성공적으로 칼을 오른팔에 붙였다. 오른 팔의 애니메이션에 따라 같이 잘 붙어서 움직인다.


🔔 몬스터 칼의 충돌 감지

몬스터 칼에 Collision 달아 주기

🚩 “DeaultMonsterBP” 블루프린트 뷰포트

image

image

칼에 Capsule Collision 컴포넌트를 붙여주었다. 몬스터에 무기 적용한 것 처럼 칼에 알맞게 배치해주었다.


자기 자신과의 충돌은 처리가 되지 않게

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

image

  • 자기 자신과의 충돌은 처리가 되지 않게
    • 칼의 Capsule Collision의 On Component Begin Overlap 이벤트를 드래그 해주었다. 칼의 캡슐 충돌체에 어떤 충돌이 일어나면 자동으로 발생하는 이벤트다. 충돌한 대상(Ohter Actor)이 자기 자신(self)이 아닐 경우에만 처리하도록 할 것이다.


충돌 처리는 공격 중일 때만 되게끔

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

image

  • 공격 애니메이션이 시작될 때 OnCollStart_Attack 이벤트를 발생 시키고
    • 칼의 Collision인 Capsule을 Enabled 활성화 시킬 것이다.
  • 공격 애니메이션이 끝나갈 때 OnCollEnd_Attack 이벤트를 발생 시키고
    • 칼의 Collision인 Capsule을 No Collision 비활성화 시킬 것이다.


🚩 “goblin_slash_Montage” 공격 애님 몽타주

image

공격 애니메이션이 시작될 때 OnCollStart_Attack, 공격 애니메이션이 끝나갈 때 OnCollEnd_Attack 이렇게 두 노티파이 추가하기.


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

image

두 노티파이 이벤트가 발생할 때 “DeaultMonsterBP”의 커스텀 이벤트인 OnCollStart_Attack, OnCollEnd_Attack 이벤트를 발생시킨다.


칼의 충돌체 설정

image

  • 콜리전 프리셋을 Custom으로 바꿔준다.
    • 모두 ‘겹침’으로 해주자. 칼이 어떤 곳에 닿든 물리적으로 튕겨나오지 않고 관통 되도록.
    • No Collision을 디폴트 값으로 설정. 공격 상태가 아닐 땐 충돌처리를 하지 않아야 해서.


🔔 몬스터의 칼이 플레이어에게 데미지 입히기

플레이어가 몬스터에게 데미지를 입힌 것과 비슷하게 구현하면 된다.

몬스터 입장

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

image

  • 공격 이벤트가 발생하면 On Component Begin Overlap
  • 충돌 감지된 대상이 자기 자신이 아닐 때 Branch
  • 충돌 감지된 대상에게 데미지를 가한다. Apply Damage
    • 데미지를 입힐 대상은 충돌 감지된 대상인 Other Actor
    • 데미지양은 Atk
      • Atk 변수를 추가해주었고 기본값을 10으로 설정했다.
    • 데미지를 가하는 행위자는 몬스터(자기 자신self)


플레이어 입장

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

image

  • 데미지가 들어오는 이벤트가 발생하면 Apply Damage
  • HP를 HP - Damage 로 새롭게 세팅한다. Set HP
    • 플레이어의 HP 변수를 추가했고 기본값은 20 이다.
  • Mesh의 Material 색깔을 바꾸는 이벤트를 호출한다. Change Damage Color
    • 아래 참고
  • HP < 0 조건을 검사한 후 참이면 죽는 처리를 할 것이다. Branch (다음 포스트 참고)

image

🙋‍♀️ 플레이어도 몬스터로부터 맞을 때마다 빨갛게 변하게 하자. 이에 대한 설명과 Material Instance에 대한 더 자세한 설명은 링크 참고

  • 커스텀 이벤트인 Change Damage Color 이벤트가 발생하면
  • “MoveCharBP”의 Mesh의 Material을 “Pladin_MAT_Instance”로 설정한다. Set Material
    • 빨갛게 만든다.
    • “Pladin_MAT”은 현재 “MoveCharBP”의 Mesh의 Material 파일이다. 이에 색상 파라미터(Vector Parameter)를 붙여 인스턴스를 만들고 빨간색 버전의 “Pladin_MAT”로 만든게 “Pladin_MAT_Instance”이다.
      • image
  • 0.2초의 지연시간을 가진다. Delay
  • “MoveCharBP”의 Mesh의 Material을 “Pladin_MAT”로 설정한다. Set Material
    • 다시 원래대로 되돌린다.


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

맨 위로 이동하기

댓글남기기