도파민조아 MYPI

도파민조아
접속 : 4421   Lv. 51

Category

Profile

Counter

  • 오늘 : 116 명
  • 전체 : 143400 명
  • Mypi Ver. 0.3.1 β
[Unity Engine] 유니티로 타워 디팬스 게임 만들기 - part4 (5) 2014/08/25 PM 06:16
게임프로그래머들의 백과사전 gpgm(game programming gems) 1권의 첫장은 데이터주도적 프로그래밍이다.
대충 내용을 한문장으로 요약하면

주인공의 공격력을 1 낮췄다고 다시 컴파일 하지마! 라고 할 수 있다.

게임의 복잡한 로직 외의 부분 주로 기획과 관련된 부분은
프로그램 외부에서 텍스트 파일등으로 만들어진 데이터를 읽어와서 로딩시간에
데이터 기반의 객체들을 생성하면 일을 기획자에게 떠넘길 수 있다는 것이다!
구지 프로그래머가 코드를 수정하지 않아도 게임을 수정하는 것이 가능해진다.
[코드 수정 -> 재빌드 -> 재실행] 보다는 [스크립트 수정 -> 재실행] 이 더 빠른것은 당연한 것이다.
뭐, 재실행도 아까우면 스크립트 내용을 실시간으로 적용시키거나 게임내에서
적용 버튼따위를 만들어서 [수정->버튼 클릭] 하는 방법도 존재한다.


아무튼 여기서 필자는 몇가지 계획을 세웠다.
1. 타워,적,총알 등의 Prefab들을 불러올때 처음 초기화 과정에서 공격력, 공격속도, 가격 등의 스팩은
텍스트 파일에서 불러와 초기화를 한다.
2. 스테이지 구성을 파일로 구성해서 불러오게 만든다.

만약 이런식으로 구성이 완료되면 일을 기획자에게 떠넘기고 휴가를 갈 수있게 된다.
기획자는 자신의 생각대로 게임을 구성하고 관리할 수 있게 될 것이다.
혼자서 만드는 게임이 아닌이상 이런 협업을 위한시스템 구축은 매우 중요하다.(고 한다 ^^;)
뭐, 혼자서 게임을 만들더라도 이편이 더 생산성이 높을 것이다.(아마도 그렇다.)

추가적으로 이런 일을 플러그인을 써서 lua같은 스크립트로 하는 방법도 있다고는하는데
용량이 너무크고(4MB?) 뭐 구지 이런거까지 라는 생각이 드니
대충 스크립트를 흉내만 내는 걸로 따로 만들어보자.

기본적인 구조는 다음과 같다.


맵을 구성하는 정보는 텍스트파일(.txt)으로 저장되어 있고
StageReader는 이 맵정보파일을 받아서 Stage를 구성할 것이다.

맵데이터는 크게 지형과 이벤트로 나눌것이다.
지형에관한 예시는 다음과 같다.

FileName : Stage1
Plane Count : 1

Plane number : 1
Plane normalVector : 0,0,1
Size : 10x10
.E....S..
...........
...........
.2......1.

스테이지는 여러개의 Plane(이하 평면)으로 되어 있고
여러개의 평면을 선언한 다음에 붙이는 방법을 쓰고자 한다.

이벤트 정보는 스테이지가 시작되고난 후에 차례대로 실행되는 명령들을
적어놓는 곳이다. 필요한 것들을 생각나는 대로 나열해보자...
- 몬스터 젠
- UI 메세지
- 대기
- 제어문(if,loop,...)
- 카메라 이동,막기,허가
- Random
- 화면흔들림....
- 기타 등등

여기서 최대한 많은 인터페이스를 제공하는 것도 중요하지만
설계단계에서 많은 협의와 토론후에 무엇을 구현해야할 지를
정하는 것이 제일 중요할 것이다.
물론 위에것을 다 구현하지 않을 것이다. 예로든 것일 뿐 실제로 구현할 것은
위에 세개정도?

일단 튜토리얼과 똑같은 구성의 스테이지 구성파일을 다음과
같이 작성해 보았다.


맨위에 "@This is 잘자염's blah blah" 은 이 택스트 파일이 이 게임에서 사용하는
mapData임을 확인하는 부분이다. 이것을 읽고 맵초기화를 거쳐 @event로 가서
이벤트들을 실행하면 된다.

라인이 '*'으로 시작되면 주석이라는 소리고 ':'은 변수같은 의미로 사용했다.
맵데이터는 따로 서식으로 정해져 있어서 비전문가가 봐도 알 수 있게 했다.

이제 스크립트를 파싱할 StageReader클래스를 작성하기전에 텍스트파일에서
불러올 데이터들을 저장할 클래스들을 선언하자 스크립트 전체 파일을 불러온뒤에
'/n'으로 문자열을 Split으로 나눈뒤에 각 라인에 맞게 초기화를 시켰다.
약간 노가다적인 부분임으로 자세한 설명은 코드를 보면 필자가 얼마나 무식하게짰는지
알 수 있을 것이다.

추상클래스에 대한 List<> 맴버를 Serialize를 하기 위해서 아래 링크를참조했다.
http://blogs.unity3d.com/2012/10/25/unity-serialization/

일단 위에서 보는것에서 StageTextFile -> StageReader부분만
구현한 상태이다. 따로 동영상은 첨부하지 않고 Inspector에서 올라간 부분만 첨부한다.


소스코드 : https://github.com/geniikw/CubeRushReBoot/


ps. c#은 유니코드를 지원한다고 들어서 한글로 해보았다아아아....


...다음부턴 그냥 영어로 쓰자...
그나저나 거의 1주일 전에 쓴걸 지금 올리네요ㅠㅠ

신고

 

곰익는 마을    친구신청

잘보고 갑니다. :)

crazysoo    친구신청

gpgm이 뭔지 좀 설명 해주실래요?

졸려박    친구신청

game programming gems 겠죠 아마
http://www.aladin.co.kr/search/wsearchresult.aspx?SearchTarget=All&SearchWord=game+programming+gems&x=0&y=0

잘자염    친구신청

게임프로그래머들의 백과사전 같은 책이죠.
내용추가할께요.

crazysoo    친구신청

오 감사~ 내용좋네요ㅎ
X