방프리

Unity2D 게임 포트폴리오 개발 일지 D + 5 본문

GameEngine/UnityEngine

Unity2D 게임 포트폴리오 개발 일지 D + 5

방프리 2020. 1. 31. 23:58

이전 연습 프로젝트를 통해 대략 AI를 만드는 방법과 UI 배치 방법에 대해 조금 익숙해졌다.

그래서 이번에는 습작 겸 타이쿤 비슷한 게임을 제작해보기로 했다.

기초적인 플레이어 컨트롤을 만든 후 다른 캐릭터들은 AI가 움직이도록 만들었다.

기존의 switch 방식은 내가 짜면서도 로직이 가끔 헷갈릴 때도 있었고, 

무엇보다도 관리가 너무 힘들었다. 그래서 이번에는 방식을 조금 바꿔보기로 했다.

위와 같이 상태에 관련된 클래스들을 따로 만들고 interface인 State를 상속받게 하였다.

그리고 모든 상태들은 StateMachine이 관리하고 각 캐릭터 객체들은 하나의 StateMachine을 가지며

이 StateMachine을 통해 상태가 바뀌는 행동을 할 수 있다.

Programming Game AI by Example이라는 책을 참고하였는데 이 책은 C++위주로 개발이 되어 있어서

C#으로 바꾸면서 이것저것 조금씩 수정했다. 

특히 State 클래스를 나는 Interface로 바꾸었는데 그 이유는 각 State 클래스에서 유니티에서 제공하는 함수들을 

사용하여 객체의 행동을 정의하고 싶은데 그럴러면 MonoBehaviour를 상속받아야 하기 때문이었다.

하지만 C#에서는 Interface는 다중상속이 가능하지만 클래스는 다중상속이 불가능하기 때문에 Interface로 수정하였다.

IState.cs
StateMachine.cs

제네릭을 사용해 모든 객체들을 받을 수 있게 하였으며 Update 구문에서는 현재 상태의 Execute() 함수를

불러오게 하였다.

다른 분의 포스트를 참고하면서도 제작했는데 그 분의 경우엔 제네릭을 사용하지 않고 캐릭터 컨트롤러에서 

수정하게 만들었다. 

내 생각에는 그럴 경우 현재 StateMachine을 가지고 있는 객체의 주인이 누구인지 모르고

상태마다 객체의 주인을 불러와서 상태를 바꿔주어야 하는 코드를 넣어야 하는데 

그렇게 되면 상태마다 객체 주인을 넣어주어야 하는 작업을 해야해서 제네릭을 사용하여 객체 본인을 받도록 했다.

State_Idle.cs, 상태마다 내가 넣고 싶은 행동만 넣어주면 된다.
State_Run

세팅한 시간만큼 대기한 후 랜덤 위치로 이동, 그리고 다시 대기 후 이동

이 상태기계를 이해하는데는 그리 오래 걸리진 않았지만 적용시키는데는 조금 오래 걸렸다.

(사실 Update 구문보다는 Coroutine을 이용해서 구현하고 싶었는데 도저히 방식이 생각나질 않는다.)

맵은 타일맵을 이용해서 제작하고 싶었는데 버전 오류인지 제대로 작동을 하지 않았다.

팔레트에 스프라이트를 넣었는데 제대로 나오질 않아서 Forum을 뒤져보니 하위 버전에서 나오는 오류인 것 같다.

 

Comments