오토체스에서 체스 말(이하 유닛)은 별도의 플레이어 조작 없이 자동으로 전투를 한다.
FSM을 사용해서 자동 전투 AI를 구현해보았다.
- FSM으로 상태 관리
우선 유닛이 가질 수 있는 상태를 생각해보자.
평상시, 이동, 공격, 사망이 있을 수 있다.
이후 스턴 상태가 추가될 수도 있지만 우선은 이렇게 4가지로 생각했다.
유닛의 상태를 나타내는 Enum을 선언해준다.
나는 직관성과 관리의 용이함을 위해 Unit 클래스 내부에 선언해주었다.
각 상태에는 다음과 같이 발생해야 할 3가지 이벤트가 있다.
1. 상태 진입
2. 상태 유지
3. 상태 탈출
각 상태들의 이벤트를 다른 스크립트에서 관리하기 위해 인터페이스를 선언한다.
하나의 스크립트에서 해결할 수 있지만 코드가 길어지기면 복잡해지기 때문에 다른 스크립트에서 관리하기로 했다.
Enter() : 상태 진입시 한번 실행
Stay() : 상태 유지시 Update문에서 매 프레임 실행
Exit() : 상태 탈출시 한번 실행
이제 각 상태들의 이벤트를 구현하기 위해서 스크립트를 만들어준다.
위에는 죽었을 때 이벤트를 구현할 DeadState.cs이다.
이런 식으로 4가지 상태 모두 스크립트를 만들었다.
이제 궁극적으로 해당 이벤트를 실행할 Unit 클래스로 돌아가서 나머지 작업을 해준다.
_ISates라는 Array 변수에 각 상태 클래스를 저장해두었다.
이제 유닛의 상태를 나타내는 변수를 선언해준다.
위의 코드를 통해 현재 상태 탈출 이벤트 실행 -> 상태 변화 -> 새로운 상태 진입 이벤트 실행 을 한다.
Update함수에서 Stay함수를 매 프레임 호출한다.
- 가까운 적 찾기
구조
Unit이 Idle 상태이면 가장 가까운 적을 검색
적을 찾으면 적을 향해 이동, Move 상태로 변화
못찾으면 Idle 상태를 유지, 검색 범위를 넓혀가면서 계속 검색
IdleStae.cs // Stay함수에서 매프레임 타겟 검색
Unit.cs // Update문에서 검색 범위 증가
- 적을 향해 이동
구조
Unit이 Walk 상태로 타겟을 향해 이동
타겟이 공격 범위안에 들어오면 이동을 멈추고 공격, Attack 상태로 전환
이동 중이나 공격 중 타겟이 죽으면 Idle 상태로 전환하여 다시 가장 가까운 적 검색
MoveState.cs
AttackState와 DeadState에도 각각 공격할 떄, 죽었을 떄 일어날 이벤트들을 구현하면 된다.
'Unity' 카테고리의 다른 글
[Unity] Microsoft Visual C++ Runtime Library 에러 (1) | 2021.08.11 |
---|---|
[DeVlog] Unity로 Auto Chess 개발하기 3. 스킬 설명 UI (0) | 2020.10.24 |
[Unity] Google Spread Sheet로 게임 데이터 관리 QuickSheet (2) | 2020.10.24 |
[Unity/UI] UI 요소를 콘텐츠 크기에 맞추는 방법 (0) | 2020.10.24 |
[DeVlog] Unity로 Auto Chess 개발하기 1.서버+DB 연동, 로그인/회원가입 시스템 (0) | 2020.10.19 |