UE4 Chapter 4-2. 몬스터 AI : 플레이어를 쫓아 가는 AI, Enum
카테고리: UE4 Lesson 1
태그: UE4 Game Engine
인프런에 있는 황대희님의 언리얼 엔진4 3D 횡스크롤 게임 만들기 강의를 듣고 정리한 필기입니다. 😀
언리얼 엔진 공식 문서 https://docs.unrealengine.com/ko/index.html
몬스터가 플레이어를 따라가게 하기
플레이어가 자기 자신(몬스터)와 가까이 있으면 플레이어를 따라가게 만들기.
🔔 플레이어와의 거리 구하기
플레이어가 자기 자신(몬스터)과 가까이 있으면 따라가야 하므로 매 프레임마다 플레이어와의 거리를 체크해야 한다.
🚩 “DeaultMonsterBP” 블루프린트 이벤트 그래프
Tick
👉Set DistancePlayerCharacter
👉Set DirToPlayerCharacter
- 매 프레임마다 변수
DistancePlayerCharacter
와DirToPlayerCharacter
의 값을 세팅한다.
- 매 프레임마다 변수
- (플레이어(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 방향에서의 거리.
- 횡스크롤 게임이기 때문에 X 축(앞, 뒤)는 쓰지 않고 Y 축(왼쪽, 오른쪽)만 따질 것이다. 따라서 플레이어와 몬스터와의 거리를 Y 방향에서의 거리만 따진다.
DistancePlayerCharacter
👉 몬스터(자기 자신)과 플레이어와의 Y 방향에서의 거리(float)Make Vector
의 리턴값을Set DistancePlayerCharacter
에 연결
DirToPlayerCharacter
👉 몬스터(자기 자신)과 플레이어와의 Y 방향 벡터Make Vector
의 리턴 벡터를Normalize
하여 방향 벡터(단위 벡터)로 만든다.- 이를
Set DirToPlayerCharacter
에 연결
🔔 플레이어가 가까이 오면 플레이어를 쫓아가게 하자.
Enum 정의
언리얼에서 Enum을 생성하는 방법은 콘텐츠 브라우저 - 우클 - 블루프린트 - Enumeration을 클릭하면 된다. 이곳에서 Enum을 관리할 수 있다. Enumeration을 생성하고 이름은 “MonsterState”으로 해주자. 몬스터의 상태를 정의할 것이다.
- 3 가지 상태를 정의해주자
Idle
👉 정지FollowChar
👉 캐릭터(플레이어)를 쫓아 가는 상태AttackChar
👉 캐릭터(플레이어)를 공격하는 상태
쫓아가게 만들기
🚩 “DeaultMonsterBP” 블루프린트 이벤트 그래프
DistancePlayerCharacter
(거리)와 DistancePlayerCharacter
(방향)을 설정해주는 노드 흐름들을 SaveDistAndDir
이라는 커스텀 이벤트가 발생하면 실행되도록 묶어서 빼두었다. Tick
매프레임마다 👉 SaveDistAndDir
이벤트를 발생시킴. (거리와 방향을 변수에 저장)
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
출력에 달린 실행핀이 실행된다. ✨✨
- 플레이어와의 거리가 5 미터 이하면 상태를
CurState
값이FollowChar
일 때- Add Movement Input 노드를 실행시킨다.
- 자기 자신(몬스터, self)을
DistancePlayerCharacter
방향으로 1.0 (Scale Values)만큼 움직인다.- 매 프레임마다 1 cm씩 움직이는 꼴이 됨.
- 자기 자신(몬스터, self)을
- Add Movement Input 노드를 실행시킨다.
- 즉, 플레이어와의 거리가 5 미터 이하면 플레이어가 있는 방향으로 매 프레임마다 1.0 움직이게 된다.
- Enum 스위치
속도에 따라 Idle, Walk 애니메이션
몬스터의 속도가 0.1 보다 크면 Walk 애니메이션을 재생하게 하고, 0.1 보다 작으면 Idle 애니메이션을 재생하도록 한다.
🚩 “DeaultMonsterAnimBP” 애니메이션 블루프린트 이벤트 그래프
애니메이션이 업데이트 될 때마다 몬스터의 속도를 받아와 이를 Speed
변수에 저장해야 한다. float 타입의 Speed
변수를 추가했다.
Blueprint Update Animation
👉Set Speed
- 애니메이션 블루프린트에서는 매프레임마다
Speed
변수 값을 세팅한다.- 이 애니메이션 블루프린트의 주인(“DefaultMonsterBP”)의 속도의 크기를
Speed
에 담는다.- Try Get Pawn Owner : 애니메이션 블루프린트의 주인을 리턴
- Get Velocity : 입력으로 들어온 액터의 속도 벡터를 리턴
- Vector Length : 입력으로 들오온 벡터의 크기를 리턴
- 이 애니메이션 블루프린트의 주인(“DefaultMonsterBP”)의 속도의 크기를
- 애니메이션 블루프린트에서는 매프레임마다
🚩 “DeaultMonsterAnimBP” 애니메이션 블루프린트 애님 그래프
- Idle 애니메이션 👉 Walk 애니메이션 : (
Speed
> 0.1) 일 때 발생 - - Walk 애니메이션 👉 Idle 애니메이션 : (
Speed
<= 0.1) 일 때 발생
기타 설정
- 문제점
- 플레이어를 쫓는 속도가 너무 빠름 👉 속도 줄이기
- 플레이어와 충돌하면 튕겨져 나옴 👉 충돌시 플레이어를 관통하기
- 애니메이션이 버벅거림 👉 Walk 애니메이션 자체에 이동값이 있어서 그런 것이므로 루트 모션 잠금
- 그리고 향하는 방향에 따라 회전하기
속도를 줄임
🚩 “DeaultMonsterBP” 블루프린트
Character Movement
컴포넌트 클릭
“DeaultMonsterBP”의 최대 속도를 110으로 줄였다.
충돌되지 않게
🚩 “DeaultMonsterBP” 블루프린트
Capsule Component
(몬스터 자체의 Collision) 컴포넌트 클릭
“DeaultMonsterBP” 자체의 Collision은 Pawn 에 대해서는 관통하도록 체크했다. (이게 가능하려면 Custom으로 바꿔주어야 함) 플레이어와 몬스터들은 Character이므로 Pawn이니까 몬스터는 플레이어와 본인과 같은 몬스터들에 대해서만 관통할 것이다.
루트 모션 잠금
🚩 “sword_and_shield_walk” 애니메이션 파일
걷는 애니메이션 자체가 앞으로 걷는 애니메이션이라 이동 값이 존재한다. 제자리에서만 진행되는 애니메이션이 아니다. 따라서 속도 위치 값을 계산하는데에 영향을 주기 때문에 루트 모션을 잠궈 애니메이션이 영향 주지 않게끔 한다.
방향에 따라 회전하기
🚩 “DeaultMonsterBP” 블루프린트
Character Movement
컴포넌트 클릭
회전 속도도 증가시켜 주었다.
🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄
댓글남기기