경희대학교 SW융합대학에서 주최하는 해커톤 대회에 처음으로 참여했다.

주제는 'AI와 관련된 모든 것' 이었다.

팀은 나 포함 프로그래머 2명 디자이너 2명으로 총 4명이었다.

회의 끝에 '버거왕 김AI' 게임을 만들기로 결정했다.

 

 

햄버거 조리 AI 개발 외주를 받은 개발왕 김찰리. 그러나 기한 내에 구현에 실패했다...

어쩔 수 없이 자신이 기계 속에 들어가 AI인 척을 하게 된 찰리.

버거왕 김AI가 된 찰리를 도와 진짜 AI보다 빠르고 정확하게 햄버거를 만들자!

 

장르: 2D 캐쥬얼 게임

개발 엔진: Unity

플랫폼: PC, Android

개발 기간: 12시간 (길다면 길지만 짧다면 짧은 시간이었다,,,)

 

결과는 우수상 수상!!

소감을 말하자면 우선 짧은 시간 내에 프로젝트를 '완성'한 점에서 우리 팀에게 큰 점수를 주고싶다.

무엇보다 한땀한땀 모든 이미지 리소스를 그려주신 우리 디자이너분들에게 너무 감사하다.

깃허브로 동시에 작업하다가 중간에 충돌이 몇 번 발생해서 애를 먹기도 했지만 같이 고생한 다른 개발자 친구도 고맙다.

게임도 기대했던 것보다 재밌게 나왔고 완성도도 높아서 매우 만족!!

 

- 플레이 영상

www.youtube.com/watch?v=86xlrEuYzlw

- 프로젝트 설명 영상

www.youtube.com/watch?v=RoxKH3KfNr8

 

직접 플레이 해보세요!!

play.google.com/store/apps/details?id=com.BlackPink.BurgerKingKimAI

 

버거왕 김AI - Google Play 앱

개발자 김찰스는 '햄버거 조리 AI' 개발 외주를 받았지만 기한 내에 개발하지 못하자 자신이 AI가 된다. 버거왕 김AI를 도와 빠르고 정확하게 햄버거를 만드는 게임.

play.google.com

 

오토체스에서 체스 말(이하 유닛)은 별도의 플레이어 조작 없이 자동으로 전투를 한다.

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에도 각각 공격할 떄, 죽었을 떄 일어날 이벤트들을 구현하면 된다.

+ Recent posts