2019. 6. 30. 23:16ㆍ프로그래밍/Unity [게임]
- 게임 이름 : Wolf and Rabbit
- 개발 기간 : 2019.04.29 ~ 2019.06.18
- 개발 인원 : 1명
- 개발 엔진 : Unity3D
A* 알고리즘과 FSM을 주로 이용해 만든 늑대와 토끼 게임입니다.
처음 게임 컨셉은 동물들을 키우는 게임인 타이니팜에서 영감을 받아 비슷하게 만들어 보려 했지만 문득 동물을 키우고 성장시키는 것이 아닌 자유롭게 풀어 놓고 생태계를 관찰하는 게임을 만들면 어떨까 하는 생각에 만들게된 게임입니다.
늑대는 토끼를 발견하면 토끼를 잡아먹고 토끼는 늑대를 피하며 배가 고플 때마다 당근을 먹는 게임입니다. 늑대는 일정 시간마다 나오고 토끼와 당근은 우측 상단의 버튼을 클릭해 배치할 수 있습니다.
1) 특징
Garbage Collector의 사용을 줄이기 위해 동물과 음식은 object pooling을 사용해 관리하고 있습니다. object pool은 Stack을 사용해 추가와 삭제를 효율적으로 이용하고 있으며 그 object pool을 Dictionary로 관리해 더 편리하게 접근할 수 있습니다.
Unit들은 특정 object를 찾아갈 때는 A* 알고리즘을 이용해 찾아갑니다. 만약 길을 찾아가는 도중에 장애물이 설치되고 그 장애물이 현재 자신의 경로와 겹친다면 경로를 재검색해 새로운 길을 찾을 수 있도록 만들었습니다.
A* 알고리즘의 성능을 올리기 위해 Heap정렬 알고리즘을 사용했습니다. 많은 정렬 알고리즘 중에서 Heap정렬을 선택한 이유는 정렬한 모든 값을 필요로 하는 것이 아닌 가장 작은 값 몇 개만을 필요로 하기 때문에 제가 사용하는 A* 알고리즘에서 가장 효율적인 정렬 방법이라 생각하고 사용했습니다.
여러 명에게 각각 다른 A*의 path를 전달해주기 위해 RequestPathManager Class를 사용고 있습니다. A* 알고리즘의 사용을 요청한 Unit들을 Queue로 관리해 요청한 순서대로 path를 전달해 주는 역할을 하는 Class입니다.
A* 알고리즘으로 이동하고 있는 Unit들을 HashSet으로 관리하는데, 만약 장애물이 설치됐을 때 다시 path를 재검색하는 데 사용이 됩니다.
2) 상태
모든 동물은 StateMachine을 가지고 있습니다. StateMachine은 이전 상태, 현재 상태, 전역 상태를 가지고 있는데 이 상태들을 이용해 동물의 상태를 바꿔 주고 있습니다.
상태는 genericgeneric interface로 만들었으며, Enter(), Excute(), Exit(), OnMessage()를 가지고 있고 각각 상태가 시작했을 때, 상태가 실행될 때, 상태가 끝날 때, message를 전달 받았을 때 호출되는 함수입니다.
messager는 MessageDispatcher를 통해 주고받을 수 있습니다. 이 message를 통해 누가 공격을 했는지 누가 공격을 받았는지를 서로가 알 수 있게 해줍니다. 만약 message에 delay를 줘야 하면 coroutine을 사용해 일정 시간 뒤에 message를 보내주도록 만들었습니다.
3) 토끼
토끼는 배고픔 수치가 있으며 배고픔을 느끼게 되면 field에 음식이 있는지를 판단하고 있다면 A* 알고리즘을 이용해 음식을 향해 이동합니다. 이동 중에 더 가까운 곳에 음식이 배치되면 즉시 경로를 바꿔 가까운 곳으로 이동합니다.
토끼는 전방, 우측, 좌측 세 개의 Ray를 발사해 장애물이 있는지를 판단합니다.
토끼의 전방 Ray에 장애물이 감지됐을 경우는 Ray가 감지된 벽을 뚫은 길이 만큼 진행 방향의 반대 방향으로 힘을 주고 토끼의 전방 벡터와 감지된 벽의 법선 벡터로 외적을 구해 왼쪽으로 회전할지 오른쪽 회전할지를 결정합니다.
4) 늑대
A* 알고리즘을 이용해 obstacle을 피해 무작위 위치의 Node로 지나다니며 토끼를 발견할 때까지 반복합니다. 토끼를 발견하면 마찬가지로 A* 알고리즘을 이용해 쫒아가고 일정 시간 내에 잡지 못하면 힘이 빠져 쫓아가지 못합니다. 잡을 경우 토끼에게 잡았다는 message를 보냅니다.
5) 저장
게임을 나가게 되면 토끼와 늑대의 위치 정보를 저장하도록 만들었습니다. 저장은 BinaryFormatter를 이용한 직렬화 방법을 사용했습니다.
여러 마리의 위치를 저장해야 하기 때문에 List에 동물의 위치 정보를 저장했습니다.
아직은 위치 정보만 저장하고 있기 때문에 다른 상태들도 저장할 수 있는 기능을 더 추가해야합니다.
이 게임을 만들면서 A* 알고리즘, 저장과 불러오기 등 많은 공부를 할 수 있었기 때문에 개인적으로 정말 재밌게 만든 게임입니다. 앞으로도 더 많은 기능을 추가해 게임의 재미를 높일 것입니다.
<모든 코드>
UserUk/Unity-WolfAndRabbit
Contribute to UserUk/Unity-WolfAndRabbit development by creating an account on GitHub.
github.com
'프로그래밍 > Unity [게임]' 카테고리의 다른 글
Unity 게임 [The snake game] (0) | 2019.07.10 |
---|---|
Unity 모바일 게임 [Mirror Ball] (1) | 2019.06.23 |
Unity 공포게임 [Doll's Night] (1) | 2019.06.22 |
Unity VR공포게임 [Hang] (0) | 2019.06.20 |