33
1 범범범범범 범범범 AI 범범범 범범 (GEM1- 3.0 범 ) 2005 년 1 년년 년년년

범용적이고 견고한 AI 엔진의 설계 (GEM1- 3.0 장 )

  • Upload
    rollo

  • View
    28

  • Download
    0

Embed Size (px)

DESCRIPTION

범용적이고 견고한 AI 엔진의 설계 (GEM1- 3.0 장 ). 2005 년 1 학기 조경은. 범용적이고 견고한 AI 엔진의 설계 (1). AI 엔진 이벤트 주도적 방식 대 객체의 폴링 메시지라는 개념 상태 기계 메시지를 이용한 이벤트 주도적 상태 기계 상태 기계의 메시지 전달 구조 게임 객체의 삭제. 범용적이고 견고한 AI 엔진의 설계 (2). 개선된 알고리즘들 메시지의 범위를 정의 모든 메시지 활동과 상태 변화를 기록 상태 기계의 교체 복수의 상태 기계들 상태 기계들의 큐 - PowerPoint PPT Presentation

Citation preview

Page 1: 범용적이고 견고한  AI 엔진의 설계  (GEM1- 3.0 장 )

1

범용적이고 견고한 AI 엔진의 설계 (GEM1- 3.0 장 )

2005 년 1 학기

조경은

Page 2: 범용적이고 견고한  AI 엔진의 설계  (GEM1- 3.0 장 )

2

범용적이고 견고한 AI 엔진의 설계 (1)

AI 엔진 이벤트 주도적 방식 대 객체의 폴링 메시지라는 개념 상태 기계 메시지를 이용한 이벤트 주도적 상태 기계 상태 기계의 메시지 전달 구조 게임 객체의 삭제

Page 3: 범용적이고 견고한  AI 엔진의 설계  (GEM1- 3.0 장 )

3

범용적이고 견고한 AI 엔진의 설계 (2)

개선된 알고리즘들 메시지의 범위를 정의 모든 메시지 활동과 상태 변화를 기록 상태 기계의 교체 복수의 상태 기계들 상태 기계들의 큐

코드 외부의 스크립트로 행동 방식을 정의

Page 4: 범용적이고 견고한  AI 엔진의 설계  (GEM1- 3.0 장 )

4

AI 엔진 AI 엔진

게임이 할 수 있는 것들과 할 수 없는 것들에 대한 여러 가지 규칙

수년의 개발 과정에서 게임이 발전함에 따라 AI 엔진 역시 계속 발전됨

엔진을 매번 고치는 수고를 감당하는 것보다 애초부터 범용성과 안전에 대한 예방 조치를 염두에 두고 엔진을 설계하는 것이 여러모로 유리( 버그 방지 , 혹은 생길 수 있는 버그들을 잡아내는 데 도움됨 )

Page 5: 범용적이고 견고한  AI 엔진의 설계  (GEM1- 3.0 장 )

5

AI 엔진

이상적인 AI 엔진이 주는 도움 게임 객체들 사이의 의사소통을 가능하게 함 AI 행동의 구현에 대한 범용적이고 이해하기 쉬운

해결책을 제공 “ 모든” 이벤트들을 기록하고 분석할 수 있는 수단

제공 ( 디버깅에 도움 )

Page 6: 범용적이고 견고한  AI 엔진의 설계  (GEM1- 3.0 장 )

6

이벤트 주도적 방식 대 객체의 폴링 (1)

게임의 AI 엔진의 특정한 패턴 게임의 틱 (tick : 게임 메인 루프가 한 바퀴 도는

것 ) 마다 게임 객체들의 로직을 갱신해야 한다 객체들이 다른 객체들과 서로 통신할 수 있어야

한다

Page 7: 범용적이고 견고한  AI 엔진의 설계  (GEM1- 3.0 장 )

7

이벤트 주도적 방식 대 객체의 폴링 (2)

객체와 게임 환경 ( 세계 ) 과 상호작용 방식

(1) 폴링 (polling) : 객체가 주도적으로 세계를 인식하는 것

(2) 이벤트 주도 (event-driven) : 객체가 세계로부터의 소식을 기다리게 하는 것

★ 게임 안에서는 수백 개의 객체들이 동시에 움직이기 마련이므로 가능한 한 이벤트 주도적 방식을 적용하는 것이 합리적

Page 8: 범용적이고 견고한  AI 엔진의 설계  (GEM1- 3.0 장 )

8

이벤트 주도적 방식 대 객체의 폴링 (3)

( 예 ) 미사일이 폭발해서 그 주변에 있는 십여 개의 유닛들의 피해를 입는 경우

폴링 : 폭발 주변의 유닛들이 자신의 환경을 매 틱마다 조사해서 스스로 폭발을 알아채고 피해치를 처리하는 것

이벤트 주도적 방식 : 폭발한 미사일이 주변의 유닛들에게 폭발이 일어나 사실과 피해치를 알려주는 방식

★ 개념적으로는 게임 객체들이 스스로 주변을 인식하고 반응하는 방식이 더 멋있게 느껴질 수 있겠지만 , 최종적인 결과는 같다 .

=> 결과가 같을 경우에는 간단하고 빠른 쪽이 더 유리 ( 이벤트 주도적 방식을 선호하는 이유 )

Page 9: 범용적이고 견고한  AI 엔진의 설계  (GEM1- 3.0 장 )

9

메시지 (1)

이벤트 주도적 시스템의 핵심 메시지들이 객체들 사이에서 효과적이고 안정적으로 돌아다니게

하는 것 메시지

게임 세계 안에서 일어난 일을 알려주는 전보 역할 메시지가 가져야 할 중요한 요소

메시지의 이름 메시지를 보낸 쪽의 이름 메시지를 받는 쪽의 이름 메시지의 내용 메시지가 전달될 정확한 시간

Page 10: 범용적이고 견고한  AI 엔진의 설계  (GEM1- 3.0 장 )

10

메시지 (2)

관리자 객체 여러 개의 다른 게임 객체들을 소유한 하나의 객체 떠다니는 수 많은 메시지들 중에서 자신이 가지고 있는

자식들에게 온 메시지들만 골라 자식들에게 넘겨 줄 수 있는 기능

메시지 전달 시간 필드 특정 시간이 지난 후에 전달 : 재미있는

특수 효과 구현 가능 ( 현실의 사람이나 생물의 반응시간 흉내 ) 난수 개념 도입 :

게임 속 객체들의 자연스러운 행동 양식 구현

Page 11: 범용적이고 견고한  AI 엔진의 설계  (GEM1- 3.0 장 )

11

상태 기계

비교적 간단하지만 , 매우 강력한 AI 개념 하나의 게임 객체가 서로 다른 여러 개의 상태들을 가지도록

한 다음 각 상태마다 서로 다른 방식으로 행동하게 함 게임 객체의 행동을 다루기 쉬운 크기의 조각들로 구분할 수

있게 하고 , 게임의 어떠한 객체가 현재 의도하고 있는 것이 무엇인지도 쉽게 알 수 있게 해줌

상태 기계를 만들려면 -> 객체의 행동 방식을 개별적인 여러 개의 상태들로 구분 가능해야 함

( 예 ) 축구 게임의 공격수 객체 : 위치선정 , 헤딩 준비 , 발리슛 준비 , 골 세레모니 등의 상태

Page 12: 범용적이고 견고한  AI 엔진의 설계  (GEM1- 3.0 장 )

12

메시지를 이용한 이벤트 주도적 상태 기계 (1)

이벤트 , 메시지 , 상태 기계라는 3 가지 중요한 개념들을 하나로 통합 강력한 AI 엔진의 기반 객체의 개별적인 행동들은 상태 기계를 통해서

표현되며 , 모든 의사 소통과 이벤트 통지들은 메시지를 통해서 이루어짐

Page 13: 범용적이고 견고한  AI 엔진의 설계  (GEM1- 3.0 장 )

13

메시지를 이용한 이벤트 주도적 상태 기계 (2)

상태 기계가 갖추어야 할 능력 임의의 개수의 상태 쉽게 정의하고 설정 하나의 상태로 진입하는 시점에서 임의의 초기화 코드를 수행 하나의 상태로부터 나오는 시점에서도 임의의 마무리 코드 수행 어떠한 메시지에 대한 반응으로 임의의 코드를 수행 게임 갱신 틱에 대한 반응으로 임의의 코드 수행 메시지에 대한 투명한 반응 상태 전이 및 그것을 야기한 메시지의 투명성 특정 상태뿐 아니라 모든 상태들에 대해 전역적으로도 메시지 처리 자기 자신을 포함한 임의의 개체에게 메시지 ( 또는 지연 메시지 ) 전송 상태 기계의 실행에 따른 수행 성능상의 부담 최소화

Page 14: 범용적이고 견고한  AI 엔진의 설계  (GEM1- 3.0 장 )

14

메시지를 이용한 이벤트 주도적 상태 기계 (3)

Page 15: 범용적이고 견고한  AI 엔진의 설계  (GEM1- 3.0 장 )

15

의사코드로 쓰여진 간단한 상태 기계

Page 16: 범용적이고 견고한  AI 엔진의 설계  (GEM1- 3.0 장 )

16

상태 기계의 메시지 전달 구조

1

2

3

같은 방식으로 행동하는 객체들이라면 동일한 상태 기계 공유 ( 가능 이유 : 모든 변수들과 상태 정보가 상태 기계 자체가 아니라 게임 객체 안에 존재하므로 )

Page 17: 범용적이고 견고한  AI 엔진의 설계  (GEM1- 3.0 장 )

17

게임 객체

Page 18: 범용적이고 견고한  AI 엔진의 설계  (GEM1- 3.0 장 )

18

메시지 객체

Page 19: 범용적이고 견고한  AI 엔진의 설계  (GEM1- 3.0 장 )

19

하나의 상태 변화가 요청 시 호출되는 코드

메시지 전송

Page 20: 범용적이고 견고한  AI 엔진의 설계  (GEM1- 3.0 장 )

20

지연 메시지 전송

Page 21: 범용적이고 견고한  AI 엔진의 설계  (GEM1- 3.0 장 )

21

게임 객체의 삭제 상태 기계 안에서 게임 객체를 삭제하는 것은 까다롭다 게임 객체는 상태 기계를 소유하므로 상태 기계 안에서

코드가 수행되는 동안에는 객체를 삭제할 수 없다 해결책 : 삭제되어야 함을 가리키는 하나의 플래그 설정

실행의 흐름이 상태 기계에서 벗어난 후에는 객체를 삭제할 수 있으므로 상태 기계의 외부에서 플래그를 점검해서 객체를 삭제하면 됨

Page 22: 범용적이고 견고한  AI 엔진의 설계  (GEM1- 3.0 장 )

22

개선된 알고리즘들

(1) 메시지의 범위를 정의(2) 모든 메시지 활동과 상태 변화를 기록(3) 상태 기계의 교체(4) 복수의 상태 기계들(5) 상태 기계들의 큐

Page 23: 범용적이고 견고한  AI 엔진의 설계  (GEM1- 3.0 장 )

23

(1) 메시지의 범위를 정의

어떤 경우 하나의 메시지가 특정한 상태 안에서만 의미를 가지도록 해야 할 필요가 생김

Page 24: 범용적이고 견고한  AI 엔진의 설계  (GEM1- 3.0 장 )

24

STATE_Alive 상태가 메시지 MSG_TimeOut 을 받아서 반응하기 전에 MSG_Dead 를 받는다면 , STATE_Alive 가 자신에게 보낸 MSG_TimeOut 을 엉뚱하게 STATE_Dead 상태가 받아버린다

=> 해결책 : 메시지가 어떤 상태에서 유효한지를 표시한 다음 메시지 전달 시점에서 해당 상태가 활성화되어 있지 않으면 메시지를 폐기시켜 버림

Page 25: 범용적이고 견고한  AI 엔진의 설계  (GEM1- 3.0 장 )

25

Page 26: 범용적이고 견고한  AI 엔진의 설계  (GEM1- 3.0 장 )

26

(2) 모든 메시지 활동과 상태 변화를 기록

게임 객체별로 개별적으로 모든 메시지 활동과 상태 변화를 그것이 일어난 시간과 함께 리고하는 것이 이상적 ( 본격적인 디버깅을 위해 )

사용되는 함수 (p.313 참조 ) LogMessage() LogStateChange()

Page 27: 범용적이고 견고한  AI 엔진의 설계  (GEM1- 3.0 장 )

27

상태 기계의 교체 복잡한 캐릭터의 경우에는 하나의 상태 기계로 그 캐릭터의 모든 행동을 정의하기 힘듬

해결책 좀 더 관리하기 쉽고 특수화된 여러 개의 상태 기계

만듬 상황에 가장 적합한 상태 기계를 현재의 상태 기계로

만듬 한 객체에 쓰이는 여러 상태 기계들의 교체를 관리하는 “관리자’ 상태 기계 만듬 ( 메시지와 이벤트를 통해 작동됨 )

Page 28: 범용적이고 견고한  AI 엔진의 설계  (GEM1- 3.0 장 )

28

복수의 상태 기계들 하나의 게임 객체가 한 시점에서 오직 하나의 상태

기계만을 사용한다는 법은 없음

실제로 하나의 AI 캐릭터가 여러 개의 상태 기계들을 동시에 돌리는 것이 더 현실적임

( 예 ) 하나의 상태기계는 캐릭터의 두뇌역할 , 다른 하나의 상태 기계는 목표 지점을 향한 이동을 제어 : 두뇌 상태 기계가 메시지를 통해서 이동 상태 기계를 제어 ( 즉 , 두뇌 상태 기계가 주어진 상황에 가장 적합한 이동 상태 기계를 선택하게 하자는 것임 )

Page 29: 범용적이고 견고한  AI 엔진의 설계  (GEM1- 3.0 장 )

29

상태 기계들의 큐 (1)

여러 가지 이동 상태 머신들을 선택적으로 사용하는 개념의 확장

상태 기계들을 큐에 쌓게 함 큐에 여러 개의 상태 기계들을 쌓아 놓은

다음 가장 최상위에 있는 것만 활성화되고 , 나머지 것들은 일시적으로 비활성화되도록 함

Page 30: 범용적이고 견고한  AI 엔진의 설계  (GEM1- 3.0 장 )

30

상태 기계들의 큐 (2)

( 예 ) RTS 게임 게이머가 세 개의 웨이포인트들을 지정해 유닛에게 이동을 명령했다고 할 때 , 이러한 큐방식이 유용하게 사용될 수 있음 ( 각각의 웨이포인트마다 개별적인 이동 상태 머신들을 큐에 쌓아두고 , 첫번째 상태 기계가 목표점에 도달하면 , 자신을 제거 , 그 다음 상태 기계가 반복적으로 활성화 )

Page 31: 범용적이고 견고한  AI 엔진의 설계  (GEM1- 3.0 장 )

31

상태 기계들의 큐 (3)

( 예 ) 순찰이라는 행동 - 일련의 지점들을 차례로 이동하는 행동을 계속 반복하는 것 - 각 지점에 대한 이동 상태 기계를 큐에 쌓아 두고 , 차례로

활성화시키되 , 마지막지점에 도달하면 다시 큐를 원래대로 복구 (원형큐 사용가능 )

( 실습 문제 ) 이러한 접근방식은 RTS 처럼 게이머가 내리는 명령들의 수가 너무 많아서 문제가 생기는 경우에 대한 해결책이다 . 실제 RTS 게임 상황을 하나 정하여 , 상태 기계 큐를 모델링 해보시오 .

Page 32: 범용적이고 견고한  AI 엔진의 설계  (GEM1- 3.0 장 )

32

코드 외부의 스크립트로 행동 방식을 정의

외부 데이터로 객체의 행동 방식에 영향을 미칠 숭 있는 통로 역할 어떠한 상태 기계의 동작에 영향을 미치는 수치들 (

공격성 , 공포 등 ) 을 외부 데이터로부터 읽어오게 하여 서로 다른 객체들이 동일한 상태 기계를 통해서도 서로 다른 방식으로 행동하게 만드는 것이 가능

Page 33: 범용적이고 견고한  AI 엔진의 설계  (GEM1- 3.0 장 )

33

코드 분석

목록 3.0.1 메시지 라우터 ( 교재 p.316) 목록 3.0.2 지연 메시지들을 다루는 함수들

( 교재 p.317)