Unity

0624 GameAI FSM Programming

피곤핑 2019. 6. 24. 10:09

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) 코드작성 - 회전하고 그방향으로 나아가도록

화살표 키 입력으로 상하좌우(8방향)컨트롤 하기 : 물리 적용 안함

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) 코드 작성

InitMoveIdle() 함수
OnMoveIdle() 함수

 

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) 코드 작성

변수
OnMove() 함수 정의

 3) EnemyAI.cs 에 코드 추가하기 (Chase 상태)

 

7. Idle, Chase의 Transition 완성하기 (조건 생성)

 1) EnemyState_Idle.cs 스크립트 코드 추가

추적으로 바뀌는 조건 

 2) EnemyState_Chase.cs 스크립트 코드 추가

 3) 실행화면

 

 

8. 적 상태별 색상 변환 - 각 스크립트에 코드 추가

 1)

EnemyState_Idle.cs
EnemyState_Chase.cs

 2) 실행화면

9. 공격하는 적 만들기

 1) EnemyState_Attack.cs 스크립트 생성 후 코드작성

attack 상태가 되면 material이 red로 변경되도록 하는 함수
attack에 대한 transition

 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 상태로 변경됨