UE4 Chapter 4-3. 몬스터 AI : 몬스터의 공격
카테고리: UE4 Lesson 1
태그: UE4 Game Engine
인프런에 있는 황대희님의 언리얼 엔진4 3D 횡스크롤 게임 만들기 강의를 듣고 정리한 필기입니다. 😀
언리얼 엔진 공식 문서 https://docs.unrealengine.com/ko/index.html
몬스터의 공격
🔔 몬스터의 공격 준비
플레이어의 공격 충돌 처리과 비슷하게 구현하면 된다.
사정 거리내에서는 공격 상태로 바꿔주기
🚩 “DeaultMonsterBP” 블루프린트 이벤트 그래프
FollowChar
인 상태에서 플레이어와의 거리가- 1.6 m 이내면
AttackChar
공격 상태로 바꿔 주기. - 1.6 m 보다 크면 이전 포스트처럼 플레이어를 따라가기
- 1.6 m 이내면
- 현재 상태가
Idle
일 때 👉DistancePlayerCharacter
<= 500 조건 검사. 👉 True 라면 상태를FollowChar
로 바꾸기- Tick 이벤트에 의하여 다음 프레임때는 스위치에서
FollowChar
출력 실행핀이 실행된다.
- Tick 이벤트에 의하여 다음 프레임때는 스위치에서
- 현재 상태가
FollowChar
일 때 👉DistancePlayerCharacter
<= 160 조건 검사.- 👉 True 라면 상태를
AttackChar
로 바꾸기 - 👉 False 라면 몬스터(self)가 플레이어를 쫓아가도록, 플레이어가 있는 방향인
DirToPlayerCharacter
방향으로 1.0 씩 이동하게 한다.
- 👉 True 라면 상태를
공격 애니메이션
- 몬스터가 공격할 때 공격 애니메이션을 재생해야하므로, 공격 애니메이션인 “sword_and_shield_slash”로 애님 몽타주 “goblin_slash_Montage”를 생성한다.
- 공격 애니메이션이 끝나는 시점에 어떤 이벤트를 발생시켜야 한다.
- 공격이 끝나는 시점에 아래와 같은 경우들을 처리해야 하기 때문
- 우선
IsAttacking
을 False로 만들어 주어야 한다. (다시 쫓아가게 해주어야 하니까. 이 처리를 안해주면IsAttacking
은 영원히 True로 남는다.) - 플레이어와의 거리가 가깝다면 공격 애니메이션을 다시 재생한다.
IsAttacking
을 Ture로 다시 만들어 주어야 한다.
- 플레이어와의 거리가 멀다면 다시 플레이어를 쫓아가기 위해
FollowChar
로 상태를 바꾸어야 하는 경우
- 우선
- 공격이 끝나는 시점에 아래와 같은 경우들을 처리해야 하기 때문
- 👉 공격 애니메이션 끝나갈 즈음에 노티파이 이벤트 추가
- 공격 애니메이션이 끝나는 시점에 어떤 이벤트를 발생시켜야 한다.
🚩 “goblin_slash_Montage” 애님 몽타주
- 공격 애니메이션이 끝나갈 즈음에 이 OnAnimEnd_Attack 노티파이 이벤트를 발생시킨다.
- “goblin_slash_Montage” 몬스터의 공격 애님 몽타주와 “Goblin_Death_Montage” 몬서트어 사망 애님 몽타주는 ‘DefaultGroup’이라는 이름의 그룹이기 때문에
- “DeaultMonsterAnimBP” 애니메이션 블루프린트의 애님 그래프의 'DefaultSlot'슬롯 노드에서 애니메이션이 재생된다.
- Idle, Walk 애니메이션이 작성되어 있는 상태 머신을 덮어 쓴다.
- “DeaultMonsterAnimBP” 애니메이션 블루프린트의 애님 그래프의 'DefaultSlot'슬롯 노드에서 애니메이션이 재생된다.
공격 속도가 좀 느리게끔 Rate Scale 값을 1.0에서 0.7로 내렸다. Rate Scale은 몽타주 재생 속도이다.
🚩 “DeaultMonsterBP” 블루프린트 이벤트 그래프
AttackChar
상태가 되면 “goblin_slash_Montage” 애님 몽타주를 재생하도록.
공격 중일 때 필요한 그밖의 처리들, 정리
🚩 “DeaultMonsterBP” 블루프린트 이벤트 그래프
- 공격 중인지를 체크하는 bool 타입의
IsAttacking
변수를 추가한다. AttackChar와 구분하기 - FollowChar 상태일 때.
- 플레이어와의 거리가 160 이내인지를 검사하고
- 결과가 True라면 AttackChar 상태로 변경한다.
- 공격 애니메이션을 재생한다. (공격 애님 몽타주 실행)
- 공격 중이므로
IsAttacking
를 True로 바꾼다.
- 공격 중이므로
- 공격 애니메이션을 재생한다. (공격 애님 몽타주 실행)
- 결과가 False라면 플레이어가 있는 방향으로 플레이어를 쫓아 간다.
- 결과가 True라면 AttackChar 상태로 변경한다.
- 플레이어와의 거리가 160 이내인지를 검사하고
- AttackChar 상태일 때.
IsAttacking
값을 검사하고- 결과가 True라면 별 실행❌. 공격 중일 때는 플레이어를 쫓아가지 않도록 AttackChar 상태 유지.
- 결과가 False라면 플레이어와의 거리가 180 이상인지를 검사한다. 공격 상태인데 IsAttacking이 False라는 뜻은 방금 전까지 공격 중이 아니였는데 이제 막 공격 상태가 된 것이다.
- 결과가 True라면 플레이어를 다시 따라가든, 공격을 다시 실행하든 하도록 FollowChar 상태로 변경한다.
- On Anim End Attack 이벤트가 발생하면
IsAttacking
을 False 값으로 변경한다. 공격 애니메이션이 끝났으므로.- 플레이어와의 거리가 180 을 넘는지 검사한다.
- 결과가 True라면 FollowChar 상태로 변경한다. 공격도 끝났고 거리도 차이가 나니까 다시 플레이어를 쫓아가도록
- 결과가 False라면 공격 애니메이션을 재생한다. (공격 애님 몽타주 실행) 거리가 가까우니 공격을 또 반복하기 위하여
- 다시 공격 중이므로
IsAttacking
를 True로 바꾼다.
- 다시 공격 중이므로
🚩 “DeaultMonsterAnimBP” 애니메이션 블루프린트 이벤트 그래프
- 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으로 되돌리기)
성공적으로 칼을 오른팔에 붙였다. 오른 팔의 애니메이션에 따라 같이 잘 붙어서 움직인다.
🔔 몬스터 칼의 충돌 감지
몬스터 칼에 Collision 달아 주기
🚩 “DeaultMonsterBP” 블루프린트 뷰포트
칼에 Capsule Collision 컴포넌트를 붙여주었다. 몬스터에 무기 적용한 것 처럼 칼에 알맞게 배치해주었다.
자기 자신과의 충돌은 처리가 되지 않게
🚩 “DeaultMonsterBP” 블루프린트 이벤트 그래프
- 자기 자신과의 충돌은 처리가 되지 않게
- 칼의 Capsule Collision의 On Component Begin Overlap 이벤트를 드래그 해주었다. 칼의 캡슐 충돌체에 어떤 충돌이 일어나면 자동으로 발생하는 이벤트다. 충돌한 대상(Ohter Actor)이 자기 자신(self)이 아닐 경우에만 처리하도록 할 것이다.
충돌 처리는 공격 중일 때만 되게끔
🚩 “DeaultMonsterBP” 블루프린트 이벤트 그래프
- 공격 애니메이션이 시작될 때 OnCollStart_Attack 이벤트를 발생 시키고
- 칼의 Collision인
Capsule
을 Enabled 활성화 시킬 것이다.
- 칼의 Collision인
- 공격 애니메이션이 끝나갈 때 OnCollEnd_Attack 이벤트를 발생 시키고
- 칼의 Collision인
Capsule
을 No Collision 비활성화 시킬 것이다.
- 칼의 Collision인
🚩 “goblin_slash_Montage” 공격 애님 몽타주
공격 애니메이션이 시작될 때 OnCollStart_Attack, 공격 애니메이션이 끝나갈 때 OnCollEnd_Attack 이렇게 두 노티파이 추가하기.
🚩 “DeaultMonsterAnimBP” 애니메이션 블루프린트 이벤트 그래프
두 노티파이 이벤트가 발생할 때 “DeaultMonsterBP”의 커스텀 이벤트인 OnCollStart_Attack, OnCollEnd_Attack 이벤트를 발생시킨다.
칼의 충돌체 설정
- 콜리전 프리셋을 Custom으로 바꿔준다.
- 모두 ‘겹침’으로 해주자. 칼이 어떤 곳에 닿든 물리적으로 튕겨나오지 않고 관통 되도록.
- No Collision을 디폴트 값으로 설정. 공격 상태가 아닐 땐 충돌처리를 하지 않아야 해서.
🔔 몬스터의 칼이 플레이어에게 데미지 입히기
플레이어가 몬스터에게 데미지를 입힌 것과 비슷하게 구현하면 된다.
몬스터 입장
🚩 “DeaultMonsterBP” 블루프린트 이벤트 그래프
- 공격 이벤트가 발생하면 On Component Begin Overlap
- 충돌 감지된 대상이 자기 자신이 아닐 때 Branch
- 충돌 감지된 대상에게 데미지를 가한다. Apply Damage
- 데미지를 입힐 대상은 충돌 감지된 대상인 Other Actor
- 데미지양은
Atk
Atk
변수를 추가해주었고 기본값을 10으로 설정했다.
- 데미지를 가하는 행위자는 몬스터(자기 자신self)
플레이어 입장
🚩 “MoveCharBP” 블루프린트 이벤트 그래프
- 데미지가 들어오는 이벤트가 발생하면 Apply Damage
HP
를 HP - Damage 로 새롭게 세팅한다. Set HP- 플레이어의
HP
변수를 추가했고 기본값은 20 이다.
- 플레이어의
- Mesh의 Material 색깔을 바꾸는 이벤트를 호출한다. Change Damage Color
- 아래 참고
- HP < 0 조건을 검사한 후 참이면 죽는 처리를 할 것이다. Branch (다음 포스트 참고)
🙋♀️ 플레이어도 몬스터로부터 맞을 때마다 빨갛게 변하게 하자. 이에 대한 설명과 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”이다.
- 0.2초의 지연시간을 가진다. Delay
- “MoveCharBP”의 Mesh의 Material을 “Pladin_MAT”로 설정한다. Set Material
- 다시 원래대로 되돌린다.
🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄
댓글남기기