FSM : 적을 만들 때 가장 많이 쓰는 AI
오늘은 기본적인것을 배울 것 -> 끝나고 플젝시점에 향상된거를 가르쳐 줄 것임.
FSM (finite-state machine : 유한상태기계)
- 전자공학 등에서 사용하는 수학적 모델과 유사하나 게임 프로그래밍 만의 특징이 존재.
- 게임 프로그래밍에서는 아주 오래된 AI기법
- 게임 캐릭터의 AI를 처리하는 가장 일반적인 방법
- 클라이언트 파트의 AI의 기본요소
- 게임 장르를 불문한 보편적인 AI이지만, 특히 MMORPG게임에서 적 캐릭터의 상태를 표현하는 방법.
-> 약간 디자인 패턴같은 느낌이 들 수 있음.
=> 실제로 여러가지 분야에서도 사용.
대기 OR 배회 -> 플레이어가 범위 내에 들어오면 -> 인식 -> 플레이어가 먼저 공격하면 -> 공격 -> 플레이어가 범위 밖으로 가면 -> (무한 순회)
특징
- 객체는 무조건 하나의 state만을 가짐
- state에서 state로의 변경을 Transition이라고 함.
- 일반적인 함수
* OnBegin() : state가 변경되면 한 번 호출.
* OnTick() : 현재 state의 update() 함수
* OnEnd() : state가 변경되면, 변경된 state의 OnBegin() 호출전에 한 번 호출.
1. 유니티에서 FSM 적용하기
4) Materials 폴더 생성 후 mGround 이름의 material 생성 후 연동.
5) 색상과 albedo 설정
6) tiling x:10 y:10 설정
2. Player 만들기
1) capsule object 생성후 "Player" 이름 설정
2) position X : 0 Y : 1 Z : 0
3) mPlayer material 생성 성 후 연동
4) 색상 설정
5) Add component -> Rigidbody 추가
6)
7) 태그설정
8) Player의 자식으로 cylinder 생성 - 회전하는 기준을 정하기 위해
9) 설정
10) cylinder의 Box collider 비활성화
11) PlayerController.cs 스크립트 생성후 연동
12) 코드작성 - 회전하고 그방향으로 나아가도록
3. 카메라 세팅하기
1) 위에서 내려다 보도록 세팅
2) CameraController.cs 만들고 MainCamera와 연동.
3) 코드 작성
4) Player 오브젝터를 연동.
4. 적만들기
1) capsule object 생성 - "Enemy"
2) position - 0 1 20 세팅
3) mEnemy material 생성 후 연동
4) RGBA (0, 255, 0, 255) (상태확인 위해서 임의로 초록색으로 지정.)
5) rigidbody component 추가
6) 물리에 의해 움직이지 않게끔
7) Player와 똑같이 cylinder 생성 후 세팅값도 똑같이 (실린더가 z축을 향하도록)
8) EnemyAI.cs 스크립트 생성 후 Enemy와 연동
9) 코드 작성
5. FSM Core 클래스 만들기
1) StateMachine.cs 스크립트 생성
2) 코드 작성
3) EnemyState_Idle.cs 스크립트 생성
4) EnemyAI.cs 코드작성
5) EnemyState_Idle.cs
6. 적상태 Chase 만들기
1) EnemyState_Chase.cs 스크립트 생성
2) 코드 작성
3) EnemyAI.cs 에 코드 추가하기 (Chase 상태)
7. Idle, Chase의 Transition 완성하기 (조건 생성)
1) EnemyState_Idle.cs 스크립트 코드 추가
2) EnemyState_Chase.cs 스크립트 코드 추가
3) 실행화면
8. 적 상태별 색상 변환 - 각 스크립트에 코드 추가
1)
2) 실행화면
9. 공격하는 적 만들기
1) EnemyState_Attack.cs 스크립트 생성 후 코드작성
2) Chase, idle 과 같은 방법으로 EnemyAI.cs에 열거형과 AddState를 추가해줌.
3) EnemyState_Chase.cs 의 OnTrasition()에 조건문 추가
4) 실행된 화면
* 계속 조건문으로 하는 것보다 소단위의 FSM을 자주 사용하는 것이 좋음
- Transition이 많아지면 매우 복잡해짐
[응용하기] - 겁쟁이상태
- attak상태에서 초당 1번의 공격에서 10%의 확률로 "겁쟁이 상태"가 됨.
- player와 5m 거리를 유지하면서 도망감.
- player와의 거리가 멀어졌다고 굳이 달려올 필요는 없음.
- player와의 거리가 10m이상이 되면 Idle 상태로 변경
친구불러오기
- attack 상태에서 초당 1번의 공격에서 10% 확률로 친구 불러오기 상태가 됨
- 플레이어에서 5m 거리로 떨어짐
- 플레이어 주위 반경 10m의 친구를 불러옴(반경 안에 있는 친구는 부른 친구한테 달려옴)
- 친구를 부른 적은 3초 후 Idle 상태로 변경됨
'Unity' 카테고리의 다른 글
0625 Projectile 만들기 (발사체) (0) | 2019.06.25 |
---|---|
0625 CameraShake (0) | 2019.06.25 |
0621 캐릭터 옷입히기 (0) | 2019.06.21 |
0621 Movement Touch Point (0) | 2019.06.21 |
0620 Scene Loading (0) | 2019.06.20 |