게임에서 적의 AI를 구현하는 방식은 매우 다양하다.
우리 게임에서 어떤 방식으로 구현해야 적합할지 모르겠어서 우선 행동 양식을 분석했다.
그런데... 더 알 수가 없어져서 튜터님 조언을 받고 일단은 Behavior Tree로 구현하기로 했다.
Behavior Tree...
공부하면 할수록 스스로 불러온 재앙이라는 느낌을 지울 수 없는데 이왕 하기로 한거 열심히 해보는 수밖에!
그리고 분석하고 설계하는데 너무 많이 고민할 필요는 없고, 이정도면 일단 구현을 해보면서 수정하고 방향을 잡아가는게 좋을 것 같다고 말씀해주셔서 내일부터는 본격적으로 구현에 들어갈 예정이다.
이론적으로 좋은 설계와 이상향을 목표하고 시작해도 작업하다보면 어쩔 수 없이 처음 계획과 다르게 수정되기 때문에 너무 처음부터 각잡고 이렇게 해야겠다고 생각하기보다는 구현하고 리팩토링하는 방법을 권장하셨다.
사실 나도 개인 프로젝트할 때는 수시로 코드와 구조를 뒤엎는 스타일로 작업해서 리팩토링과 과감한 변경 시도 오히려 좋아한다! 그런데 장기간 팀프로젝트를 진행한다고 하니까 너무 사려서 처음부터 잘하려고 욕심내지 않았나싶다 ㅠㅠ 중용을 실천하려 노력해보자!
인간 행동 분석
- 분석한 인간 행동 종류(구버전)
Idle: 기본 상태(스폰 되고 웨이브 시작 전까지 맵 밖에서 대기)
Walk: 맵의 이동 가능 범위를 따라 거점 구역으로 이동하는 상태
Run: 인간이 현재 위치에서 맵의 시작위치(스폰된 초기 지점)으로 돌아가는 상태
@Battle: 몬스터의 탐지 범위 내에 들어온 상태(SubState)
몬스터가 마을로 돌아가거나 플레이어의 공포 수치가 max면 전투 종료
Move: 몬스터 중심으로 이동 가능한 범위 내에 공격 대형을 맞추는 상태
Surprise: 몬스터의 공격을 받아 놀라는 상태, 인간의 두려움 수치가 높아짐
Attack: 인간이 몬스터를 공격하는 상태
Wait: 공격 쿨타임이 찰 때까지 대기하는 상태
=> HFSM으로 구현?
문제점! 맵 모양에 따라서 Walk Animation이 각각 다르게 전환되어야함
- 분석한 인간 행동 종류(신버전)
Idle: 기본 상태(스폰 되고 웨이브 시작 전까지 맵 밖에서 대기)
@Walk: 맵의 이동 가능 범위를 따라 거점 구역으로 이동하는 상태(SubState)
걸어가는 방향에 따라 상하좌우로 애니메이션 전환 필요 (UpWalk, DownWalk, LeftWalk, RightWalk)
@Run: 인간이 현재 위치에서 맵의 시작위치(스폰된 초기 지점)으로 돌아가는 상태(SubState)
걸어가는 방향에 따라 상하좌우로 애니메이션 전환 필요 (UpWalk, DownWalk, LeftWalk, RightWalk)
@Battle: 몬스터의 탐지 범위 내에 들어온 상태(SubState)
몬스터가 마을로 돌아가거나 플레이어의 공포 수치가 max면 전투 종료
Move: 몬스터 중심으로 이동 가능한 범위 내에 공격 대형을 맞추는 상태
Surprise: 몬스터의 공격을 받아 놀라는 상태, 인간의 두려움 수치가 높아짐
Attack: 인간이 몬스터를 공격하는 상태 Wait: 공격 쿨타임이 찰 때까지 대기하는 상태
Walk와 Run 속도와 목표 이동 지점이 다름
Walk: 스폰 지점 → 거점
Run: 현재 위치 → 스폰 지점
+ Run 상태일 때는 Battle 상태로의 전환 x
구현 방법 종류
일반 상태 패턴
- Unity 숙련 주차 강의(3D RPG) 에서 NPC(곰) 행동 구현에 사용한 상태 패턴을 참고하여 구현
- 간략히 설명하면 Enum 타입으로 상태를 구분하고 SwithCase로 상태 전환
장점: 구현 난이도 낮음
단점: 낮은 확장성, 유지보수 어려움
HFSM
장점: 잘 설계하면 BT보다 성능 좋음, 따로 플러그인 설치 필요 X
단점: 상태가 너무 많아지면 구조 복잡해짐, 전이가 자주 발생하는 경우 오버헤드 발생, BT보다 확장에 제한적
Behavior Tree
장점: 높은 확장성, 한번 잘 설계하면 유지보수 간편
단점: 높은 구현 난이도, FSM처럼 비주얼스크립팅하려면 유료 플러그인 설치 필요, 잘못 설계할 경우 오히려 성능 저하를 일으킴
'내일배움캠프 > TIL' 카테고리의 다른 글
| [내배캠][Unity6기][TIL] Behavior Tree 구조 설계 (2) (0) | 2024.11.30 |
|---|---|
| [내배캠][Unity6기][TIL] Behavior Tree 구조 설계 (1) (0) | 2024.11.29 |
| [내배캠][Unity6기][TIL] ObjectPool (0) | 2024.11.27 |
| [내배캠][Unity6기][TIL] 최종 프로젝트 기획 (0) | 2024.11.26 |
| [내배캠][Unity6기][TIL] 11.15 최종 프로젝트 시작 전, 알아두면 좋을 것들 특강(스탠다드) (1) (0) | 2024.11.25 |