블로그 이미지
평범하게 살고 싶은 월급쟁이 기술적인 토론 환영합니다.같이 이야기 하고 싶으시면 부담 말고 연락주세요:이메일-bwcho75골뱅이지메일 닷컴. 조대협


Archive»


 

'게임 개발'에 해당되는 글 2

  1. 2016.11.01 첫번째 게임을 만들어 보다
  2. 2010.08.09 Windows Phone7의 게임 개발 환경 (XNA) 리뷰 (1)
 

첫번째 게임을 만들어 보다

IT 이야기 | 2016.11.01 09:24 | Posted by 조대협

첫번째 게임을 만들어보다.


조대협 (http://bcho.tistory.com)


요즘 게임 개발이 워낙 인기 있는 분야이고, 유니티로 게임을 개발하기가 워낙 쉽다고 해서, 언젠가 한번 게임을 개발해봐야하겠다는 막연한 생각만 가지고 있었는데, 게임 로그 수집 및 분석을 테스트할 기회가 되서, 아예 게임을 만들어보기로 하였다.


유니티 개발환경의 편리함


대략 10월10일 부터 시작해서, 개발이 끝난게 대략 10월 말 경이니까는 2~3주 정도 걸린것 같다.

유니티 개발이 처음이라서, 책부터 사보고 남는 시간 짬짬이 개발을 했는데, 아마 집중해서 했으면 일주정도면 되지 않았을까 한다.


유니티로 게임을 개발하면서, 먼저 느낀것은 개발 환경이 참 잘 짜야져 있다는 것이다. 객체를 정의한 후, 각 객체에 객체를 컨트롤하기 위한 코드를 짜서, 객체에 드래그앤 드롭을 하면 코드가 적용되고, 각 객체를 Prefab이라는 형태로 쉽게 라이브러리 하여 다시 불러 쓸 수 가 있다. 또한 충돌 처리나, 지형에 따른 이동 처리등이 아주 쉽게 가능하다. 대학교때 다이렉트X를 이용해서 게임을 개발할때를 생각하면 정말 많이 쉬어졌다.




게임을 만들기 위한 사운드나 그래픽 에셋, 그리고 각종 특수 효과도 유니티 에셋 스토어에서 어렵지 않게 구할 수 있었다.


유니티는 멀티 플랫폼을 지원하는데, 같은 코드로 빌드 환경을 바꿔서 윈도우/맥 환경에서 부터 안드로이드,IOS용 게임 까지 쉽게 빌드가 가능하다.(거의 신세계와 같은 느낌)


전체적인 느낌은 게임 뿐 아니라, 일반 프로그래밍 환경이 궁극적으로 가야하는 환경이 아닌가 싶다. 멀티 플랫폼 지원, 에셋 스토어, 그리고 객체에 코드를 넣는 부분은 객체지향형의 개념을 가장 잘 구현한 케이스가 아닌가 싶다. (나중에 개발 플랫폼을 만든다면, 이 개념을 차용하고 싶다.)

유니티 개발 생태계

유니티로 개발하면서 재미있었던 점 중의 하나가 개발자 생태계가 아주 발전되어 있다. 왠만한 질문은 구글링을 하면 유니티 커뮤니티에 답이 대부분 있고, 유니티 개발환경이 아무래도 화면 위주다 보니, 글로 쓴 문서 보다는 동영상이 따라하기 훨씬 편리했는데, 유니티 튜토리얼 관련 컨텐츠가 유투브에 아주 풍부하였다.

또한 유니티에서 제공하는 튜토리얼 문서 역시 쉽고 체계적이었다.

아마 이렇게 유니티가 유행하게 된 요인중 하나는 플랫폼이 쉬울뿐 아니라, 개발자 생태계를 잘 가꾼 유니티 회사에 있지 않나 싶다.


게임 개발의 어려움


막상 게임을 개발해보니, 프로그래밍 자체 보다는 캐릭터의 배치, 시나리오의 작성, 난이도 조절, UX 등이 더 큰 어려움으로 다가왔다. 아무래도 사용자의 재미를 위주로 하는 애플리케이션이다 보니 코딩 이외에도 신경을 써야할 부분이 매우 많았다.


결론은

그래서 결론은, 게임 개발은 아무나 하는 것이 아니라는 것… 지금도 게임 개발하고 계시는 게임 개발자 분들 존경합니다.

유니티의 개발환경은 에셋 스토어와, 객체 지향형 개념등 한 단계 앞서 있는 개념으로 배울게 많다는 것. 그리고 개발 플랫폼이 메이져가 되기 위해서는 생태계 형성이 중요하고, 동영상 컨텐츠가 중요하다는 것 등이었다.






Learning Kit에 들어가 있는 간단한 게임(갤럭시같은..) 튜토리얼을 따라해보고 리뷰를 올립니다.
먼저 이글을 올리기전에 제 백그라운드에 대해서 소개할 필요가 있는데,
94~97년정도까지 게임 개발을 했습니다. MS-DOS상에서 인라인어셈블리와 C/C++을 이용해서 2D 게임을 만들고, Direct-X 초창기 버전과 Direct 3D등으로 게임을 만들어본 경험이 있습니다.
시절이 10년은 지났으니, 결과적으로 게임 프로그래밍에 대해서 기본 개념은 있지만, 요즘 최신 게임 프로그래밍 기법에 대해서는 정보가 부족한 상황임을 미리 이야기 해둡니다.

사실 윈폰7의 게임 개발 프레임웍쪽에는 아주 기대가 컸습니다. 게임 이라는 컨텐츠가 스마트폰의 킬러앱중의 하나이고, 특히 윈폰7에서 XNA를 기반으로 개발된 게임은 X-BOX에서도 수정없이 포팅되서 돌아갈 수 있기 때문에, 개발자 입장에서는 같은 컨텐츠로 콘솔 게임과 스마트폰 게임 시장 양쪽을 모두 공략할 수 있다는 장점을 가지고 있습니다. 그리고 타 스마트폰 플랫폼과 다르게 전용 게임 플랫폼을 제공한다는 것이 매우 흥미로웠습니다.
일전에 개발자 컨퍼런스에서 윈폰7 XNA를 이용한 3D 게임 개발 데모를 본적이 있었는데, Collision 처리 (충돌처리-두개의 개체가 충돌하였다는 것을 알려주는 처리-예를 들어 총알에 맞았다. 이런거..)가 API하나로 해결되고, 각종 3D 이펙트(먼지가 난다거나, 샤방샤방 별가루가 떨어지는 처리등)이 아주 쉽게 개발되는 것들이 아주 신기했기 때문에, 나름 기대를 하고 튜토리얼에 접했습니다. 사실 제가 게임 개발했을때는 이런건 다 날코딩으로 만들어야 했습니다. 심지어 Direct X 이전에는 애니메이션을 표현하기 위한 스프라이트 처리 엔진 조차 인라인 어셈블리로 다 만들어야 했으니까요.

아래는 예제로 따라서 만든 게임 스냅샷입니다.

따라 해보시면 아시겠지만, 상당히 간단합니다.
2D 게임이라서 그런지, 몬가 대단한것이 있을거라는 기대(?)에 몬가 대단한것은 나오지 않았습니다. (그도 그럴것이 2D 게임에 필요한 프레임웍들이 뻔하니..)

몇가지 특이한것만 집어 보겠습니다.

리소스 로딩
게임에 필요한 음성,캐릭터 이미지,백그라운드 이미지들을 로딩하고 관리해야 합니다. 보통 파일을 열어서 일일이 읽어서 메모리에 적재하고, 필요한 파일들도 배포할때, 묶어서 배포해야 하는데, 이부분이 상당히 편리합니다. 다른 스마트폰 플랫폼에서도 될것 같긴한데... 구닥다리 게임 개발자의 시야에서는 신기하더군요.
필요한 리소스들을 비주얼 스튜디오에서 레퍼런스 부분에 Import만 하면됩니다.
리소스들을 사용할때는

이렇게 Load만 해주면 됩니다.
마치 자바의 리소스 번들과 같은 느낌입니다. 배포할때는 모든 리소스들이 함께 패키징 되니까는 상당히 편리하져.

3 스크린 지원
MS의 전략중에 강력한 전략중 하나가, 3 스크린이라는 전략이 있습니다. TV-PC-모바일을 모두 지원하고, 하나의 플랫폼처럼 지원하겠다는 겁니다. VOD 서비스를 TV-PC-모바일을 통해서 각 장점을 통해서 하겠다 모.. 그런건데..
XNA기반의 게임 역시 이 전략의 연장선산에 있습니다.
위에서도 언급했듯이, XNA기반의 게임은 윈폰뿐만 아니라, X-BOX는 물론이고 PC용 윈도우에서도 작동됩니다.
이를 가능하게 하려면, XNA로 개발한 게임을 해당 타겟 플랫폼에 맞게 빌드하면됩니다.
위에 스크린샷에도 보면 알 수 있듯이 Windows와 X-Box 360용 프로젝트로 만들어서 컴파일이 됩니다.

게임 처리 프레임웍
게임 개발 플랫폼에서 당연한것이겠지만, 게임의 실행 사이클에 맞는 프레임웍을 제공합니다.
게임은 보통 하나의 화면 단위로 진행되고, 하나의 화면은 리소스 로딩후, [ 입력을 받고, 캐릭터의 위치나 충돌 처리등과 같은 계산을 하고, 계산 결과에 따라서 화면과 음성으로 출력] 하는 루프를 반복합니다. 이런 프레임웍들이 내부적으로 다 구현되어 있습니다.
예를 들어 화면 처리 패턴은
class GameplayScreen : GameScreen
이런식으로, 상위 클래스로 지정되어 있구요. :)
스프라이트 처리 패턴을 보면 다음과 같습니다.
SpriteBatch.Draw(tankTexture, player.Position, Color.White);
이런식으로요. 상당히 편리하져.
아직 전체 프레임웍을 다 본게 아니라서 모라 말하기는 어렵지만, 일단 게임 개발의 생산성을 높이고, 게임 개발 패턴을 위한 상당히 성숙된 프레임웍을 갖추고 있습니다.

다음에 시간이 되면 3D 게임쪽을 찾아서 한번 봐야 겠습니다. 3D 게임쪽에서 다른 스마트폰 플랫폼들과 차이가 많이 날것 같네요. 혹시 아이폰이나 안드로이드에서 게임쪽 프로그래밍 하신분 계시면 피드백 환영합니다.


=== 추가 ===

충돌 처리 로직
위에서도 잠깐 언급했었는데, 게임 프로그래밍에서는 충돌 처리 로직이 필요합니다.두개의 객체가 충돌했을때를 감지하는 로직인데, 위의 예제에서는 별도 API를 안쓰고, X,Y 좌표축만으로 해서 몰랐는데, 다른 예제를 보니까는 충돌 처리 API가 있네요.

        void CheckForCollision()
        {
            BoundingBox bb1 = new BoundingBox(new Vector3(spritePosition1.X - (sprite1Width / 2), spritePosition1.Y - (sprite1Height / 2), 0), new Vector3(spritePosition1.X + (sprite1Width / 2), spritePosition1.Y + (sprite1Height / 2), 0));
            BoundingBox bb2 = new BoundingBox(new Vector3(spritePosition2.X - (sprite2Width / 2), spritePosition2.Y - (sprite2Height / 2), 0), new Vector3(spritePosition2.X + (sprite2Width / 2), spritePosition2.Y + (sprite2Height / 2), 0));
            if (bb1.Intersects(bb2))
            {
                soundEffect.Play();
            }
        }

BoundingBox라는 사각형 공간을 정의하고 두 공간간에 충돌을 intersects라는 함수로 비교합니다.
잘 보시면 아시겠지만, BoundingBox를 정의하는것을 두개의 벡터로 정의합니다. 각각의 벡터는 3개의 좌표를 가지고 있습니다. X,Y,Z축 입니다. 즉!! 3D에서 충돌처리를 지원하기 위한 함수라는 것입니다. 위의 예제는 2D의 예제라서 Z축을 0으로 했네요.