안녕하세요?


지난번에 계획만 세워놓고서, 익숙하지 않은 일러스트를 그리는 작업을 하려고 하니 시간이 많이 걸리기는 걸렸습니다. 이번 추석 연휴를 통해서 겨우겨우 어떻게 했는데, 그 결과물을 gif파일로 만들어서 한번 보여드리고자 합니다. 



먼저 플레이어 캐릭터인 윳쿠리가 뒤에서 날라오는 대포알에 맞는 애니메이션입니다. 일단 gif파일로 만들면서 보기 편하게 0.2초씩 한장의 그림이 이어지게 하면서 작성한 것입니다.



다음은 윳쿠리가 앞에 있는 장애물에 부딧쳐서 넘어지는 애니메이션이라고 해야 할까요? 일단 이번에는 앞에 있는 장애물 맞고서 쓰러지는 애니메이션을 그리는 데 성공했습니다. 이 역시 이래저래 가지가지 사정으로 인해서 그리는 데 많은 시간이 걸리니는 걸렸습니다.




다음은 윳쿠리가 필드를 뛰면서 아이템이라고 해야 할까요? 스코어링에 필요한 아이템인 먹을 꺼리를 먹는 애니메이션입니다. 



다음은 맨 뒤에 있는 대포가 발사되는 애니메이션입니다. 그런데 이걸 만들고 나서야 깨달았는데, 대포의 포신끝이 조금은 투명하게 처리가 되어서 인지 몰라도, 포구에서 나오는 불꽃이 보이지 말아야 할 곳까지 보인다는 단점이 있습니다. 이래서야 곤란다하는 생각이 듭니다.




이번에는 대포가 발사되고 난 다음에, 포신에서 연기가 나오는 장면입니다. 이 역시 포신끝에 어느정도 문제가 있다는 생각이 드는데, 어떻게 해결을 해야 겠다는 생각이 듭니다.


마지막으로 포탄이 날라가는 애니메이션입니다. 지금은 제자리에서 그냥 뜀뛰기만 하고 있는 것 같지만, 앞으로는 게임상에서 앞으로 나아가면서 바닥에 뒤어 나가는 것이 될 것입니다. 이것으로 애니메이션 2개의 수정만 더 한 다음에, 추가로 아이템이랑 장애물, 그리고 게임의 배경화면을 만든 다음......... 타이틀 화면과 게임오버 화면을 만드는 것이 남아 있다는 생각이 듭니다. 

저작자 표시
신고

안녕하세요?


지난번 유니티5의 독학에서 게임인 Yukku Run의 기획을 올렸는데요, 이번에는 제 손으로 플레이어 캐릭터를 직접 그려서 제 손으로 애니메이션까지 만드는 작업을 해 보았습니다. 당연 이번 포스팅의 내용도 제 손으로 직접 그림을 그려서 애니메이션을 만드는 과정이라고 할 수 있습니다.


우선 가장 먼저 해야 했는 과정은 플레이어 캐릭터인 윳쿠리가 뛰어가는 모양을 만들어야 하기에, 하나의 동작을 4 부분으로 나누어서, 4개의 컷으로 만들기로 했습니다. 



우선 위 그림에서 나온 4개의 그림이 제가 손으로 그려서 만들어낸 화면입니다. 이제 이걸 유니티5에서 애니메이션으로 만드는 과정을 거쳐야 합니다. 우선 이를 위해서 전용으로 프로젝트를 생성하도록 하겠습니다.



언제나 보아왔던 유니티5의 새 프로젝트를 생성합니다. 일단 다른 에셋은 모르겠지만, NGUI는 포함시켜 두도록 합니다.



일단 새로 생성된 프로젝트에 Resource Pictures라는 폴더를 만들어서 이번에 새로 만든 그림 4장을 집어 넣도록 합니다. 




그리고 나서는 애니메이션을 만들고 나서, 저장하기 위해서 animation이라는 폴더를 아래의 그림과 같이 만들어 주는 과정을 거쳐야 합니다.



이제 생성된 애니메이션을 저장하기 위한 폴더도 생성이 되었으니, 이제는 본격적으로 애니메이션을 만들기 위한 작업에 들어가 보도록 해야 겠습니다.



위 그림처럼 Window 항목에 있는 Animation이라는 윈도우를 불러와서 작업을 하려고 했습니다만, 어째서인지 작업이 잘 되지를 않았습니다.



알고 봤더니 게임 오브젝트로 추가를 하고 나서야, 작업이 원활하게 할 수 있는 것이였습니다. 일단 위 그림처럼 크기를 지정하지 않은 채 오브젝트로서 추가를 합니다. 그리고 나서 다시 Window메뉴 안에 있는 Animation메뉴를 열도록 합니다. 



위 그림은 Animation윈도우 안에 4개의 그림을 차례로 올려서, samples 항목에다가 10으로 처음 설정을 했습니다만, 나중에는 5까지 내려서 설정을 하는데 해 보았습니다.



유투브에 올린 윳쿠리가 앞으로 뛰어가기 위한 모션을 애니메이션으로 만들어서 표현한 것입니다. 유니티5에서 플레이 버튼을 누르면, 일단은 제자리에서 뛰는 것을 볼 수 있습니다. 이번 작업으로 얻은 것이라면, 처음으로 제 손으로 한번 캐릭터를 그리는 데 성공했고, 이 캐릭터를 제자리 뛰기지만 움직이게 하는 데는 송공했다는 것에 의의가 있다고 해야 겠습니다.

저작자 표시
신고

안녕하세요?


유니티5를 독학을 시작해서 이제 처음으로 게임을 만들기 위한 기획에 들어가 보고자 합니다. 기획이라고 해서 거창한 것이 있는 것은 아니고, 그저 제 능력으로 가능한 것을 만들어 보고자 합니다. 이 포스팅에 올라온 것은 그저 '기획'일 뿐이며, 완성된 게임은 어떤 모습이 될지는 지금으로서는 자세하게 알 수는 없습니다. 다만 대략적인 모습은 알 수 있으리라 생각합니다.


타이틀 : Yukku Run!

장르 : 횡스크롤 달리기 게임


일단 여기까지는 구상을 한 것에 지나지 않기 때문에, 자세한 그림이 아닌 대충 그림을 그려서 올리고자 합니다. 게임의 내용은 간단합니다. '윳쿠리'라는 가상 캐릭터-왜 이런 캐릭터를 선택했냐 하면, '머리'만 있는 것이기 때문에 상대적으로 그리기가 쉬우리라 생각해서 입니다.-가 뒤에서 날라오는 대포알을 피하면서 앞에 나오는 장애물도 피하고, 그러면서 간식꺼리를 먹어서 스코어를 올린다고 보시면 됩니다.



위 그림은 타이틀 화면을 대충 그린 것입니다. 그림은 뒤에서 날라오는 대포알에 쫓기는 윳쿠리를 그린 것입니다만, 지금 그림의 퀄러티로서는 좀 무리일지는 모르겠다는 생각이 듭니다. 아무튼 간에 아무것도 모르는 상태에서 게임을 만들면 무언가 좀 난감하게 될지도 모르기 때문에, 일단은 '튜토리얼'까지는 메인 메뉴에 포함을 두고자 합니다.





그리고 정말 중요한 것은 게임뷰라고 해서, 타이틀 화면에서 start를 누르면 시작해서 볼 수 있는 화면을 의미합니다. 이 역시 대충 그리기는 했지만, 어디까지나 기획을 하는 단계에서 이러는 것이고, 실제로는 정말 신경써서 배경을 그리거나, 관련된 에셋을 다운로드 받아야 할 듯 합니다.



그래서 이 게임을 위해서 구현해야 하는 기능의 목록은 다음과 같습니다.

  • 자동으로 끝없이 플레이 할 수 있는 스테이지 생성
  • 2D 캐릭터 애니메이션
  • 키보드를 이용한 플레이어 캐릭터 제어
  • 플레이어의 데이터를 저장
  • 최고 점수를 저장할 수 있는 점수 시스템

대충 이렇게 됩니다. 일단 이 게임은 스테이지가 정해져 있어서 목표지점으로 들어가는 것이 아니라, 끝없이 달리는 것을 목표로 하고 있기 때문에, 유니티5의 카메라 밖에서 스테이지를 생성하고, 그 윳쿠리가 지나간 다음 유니티5의 카메라 밖에서 스테이지가 소멸될 필요가 있습니다.


다음은 캐릭터 애니메이션이라고 하면 대단한 것은 아니고, 다음의 동작을 구현해야 합니다.

1)평상시 뛰어 가는 동작

2)음식먹는 동작

3)뒤에서 날라오는 포탄에 맞는 동작

4)앞에 있는 장애물에 맞는 동작


그리고 키보드를 이용한 윳쿠리-플레이어 캐릭터의 제어에 대해서는 간단합니다.

화살표키 상하로 캐릭터가 달리고 있는 트랙을 상하로 바꾸고, 

왼쪽 화살표 키를 누르면 달리는 속도를 줄이며

오른쪽 화살표 키를 누르면 달리는 속도가 일시적으로 빨라집니다.




그리고 점수에 대해서는 플레이어 캐릭터가 달린 거리 + 먹었는 음식의 점수를 합계해서 계산을 하고자 하며, 마지막으로 모든 플레이어 캐릭터가 날라갔을 경우에 뜨는 게임오버 뷰를 올리겠습니다. 물론 실제 게임에서는 이렇게 대충 그린 뷰가 나오지는 않습니다.



일단 WebGL로 빌드해서 웹페이지상에서 설치없이 플레이를 할 수 있도록 만들 계획이며, 화면 해상도는 1024X600을 생각하고 있는 중입니다. 


물론 이건 어디까지나 기획이며, 아마 제작을 하는 과정에서 이래저래 많은 변경이 가해질 것으로 생각이 됩니다. 그리고 저 역시 [유니티5.X와 함께하는 C# 첫걸음]을 보면서 작업하기 때문에 다소 시간이 걸리리라 생각이 듭니다.

저작자 표시
신고

안녕하세요?


이번 포스팅에서는 [유니티5.X와 함께하는 C#첫걸음]이라는 책을 읽고서, chapter7에 해당하는 내용을 알기 쉽도록 정리를 해서 올리고자 합니다. 그럼 먼저 무엇부터 설명해야 하느냐 하면, '객체의 인스턴스화'라는 것을 설명해야 겠습니다. 본격적으로 들어가기 전에 제가 이해하고 정리한 것을 바탕으로 포스팅을 하다보니 사실과 틀린것이 있을 것이라 생각이 듭니다. 그런 오류에 대해서는 댓글로 알려 주시면 감사 하겠습니다.




먼저 위 그림은 클래스의 인스턴스화라고 하는 것을 보여주고 있습니다. 스크립트상에서 클래스라고 'public class 클래스이름'이라고 선언을 하는데, 이건 스크립트상에서 '선언'만 한 것이지, 실제로 이 상태로는 아무런 작업도 하지 않는다고 합니다. 그래서 메모리에 실제로 클래스를 할당한다고 해야 할까요? 정확히는 메모리에 할당할 단위(객체)로 쪼갠다고 해야 할듯 합니다.



그런데 '객체'라는 것으로 일종의 '분신'같은 것을 만든 다음에, 이 객체 하나하나 메모리에 공간을 할당해 주는 일이 남아 있으며, 이렇게 실제 메모리의 공간에 할당을 시키는 것을 두고서 '객체의 인스턴스화'라고 한다고 합니다. 무언가 복잡하지만, 뭐라고 해야 할까요? 스크립트를 유니티5에서 한개 작성해 놓으면, 메모리에 여러번 복제해서 공간을 배정할 수 있다고 보면 될듯 합니다.




아직까지는 이게 왜 중요한지 모르겠지만, 일단 클래스라는 것도 데이터 형식으로 선언을 할 수 있다는 것을 먼저 언급해 둡니다. 그래서 한 스크립트의 클래스를 다른 클래스에서 선언해서 쓸 수 있습니다. 우선 메모리에 객체를 할당시켜서 일을 하게 만들기 위해서는 아래의 형식을 스크립트 상에서 선언하면 됩니다.


new 임의의이름( );


그런데 이런 형식으로 메모리에 공간을 할당하면, 한가지 문제가 생깁니다. new 뒤에 선언한 임의의이름을 스크립트상에서 타이핑을 한다고 해도, C#상에서는 접근을 할 수 없다고 합니다. 그래서 이런 문제 때문에 아래의 문장처럼 변수를 선언해서 메모리에 할당된 공간에 접근할 수 있게 한다고 합니다.


임의의이름 변수 = new 임의의이름 ( );


이런식으로 선언을 하면, 변수.메서드 ( ) 같은 형식을 써서 객체라는 이름으로 메모리에 할당된 공간에 접근할 수 있는 것입니다. 그래서 이런 형식으로 어떻게 실전에서 사용을 하는가 하는 의문이 드실 건데요, [유니티5.X와 함께하는 C#첫걸음]이라는 책에서는 아래의 예시와 같은 것을 제시하고 있었습니다. 우선 유니티에서 스크립트 이름과 클래스 이름이 같아야 하니, 첫번째 스크립트는 ClassNameA라고 지정을 하고, 두번째 스크립트는 ClassNameB라고 지정을 해서 아래와 같이 코딩을 합니다.






먼저 ClassNameA.cs라는 스크립트에서 데이터의 형식을 지정하고, ClassNameB.cs에서 familyName,firstName, age, house라는 항목에 들어갈 내용을 일일히 지정했습니다. 일단 ClassNameA.cs만 보자면, string이라고 문자열 변수는 " "를 지정해서 빈칸으로 두었으며, int라는 정수는 0으로 지정을 했습니다. 이렇게 ClassNameA.cs에서 전체적인 포멧만을 구성하면, ClassNameB.cs와는 어떤 관계인지 아래의 그림에서 알 수 있습니다.


위 그림에서 볼 수 있듯이 ClassNameB.cs에서 변수이름(memberOne, memberTwo, memberThree)을 이용해서 new ClassNameA ( );를 타이핑해서 메모리상에서 공간을 확보합니다. 그런데 위 그림에서 보실 수 있는 것처럼, ClassNameA의 이름으로 메모리상에서 공간을 '여러번 확보'할 수 있는 것입니다. 즉, 자기 스크립트상에서 존재하지 않는 클래스 안의 형식을 빌려서, 메모리상에 공간을 여러번 확보하고, 거기다가 특정한 데이터를 저장할 수 있다는 것입니다.


이러한 형식이 어디에 쓰이냐 하면, 아마 간단히는 여러명의 캐릭터가 나오는 경우에는 프로필을 저장해야 하는 경우에 사용을 할 수 있으리라 생각이 듭니다. 


이제 책의 chaper7에 남아 있던 다른 스크립트에 있는 메서드를 이용하는 법에 대해서도 올려야 하겠지만, 분량이 너무 길어져서 하는 수 없이 여기서 마치도록 해야 겠습니다. 다음 포스팅에서는 다른 스크립트에 있는 메서드를 어떻게 스크립트 상에서 사용할 수 있는지를 다루도록 하겠습니다.

저작자 표시
신고

안녕하세요?


어느덧 [유니티 5.x와 함께하는 C# 첫걸음]이라는 책을 읽으면서 C#을 독학하는 것도 책의 절반을 넘겼다는 생각이 듭니다. 아무튼 이번 포스팅에서는 루프라고 해서 조건이 만족하면 코드블록을 반복해서 처리하는 코딩에 대해서 한번 정리해 보고자 합니다. 


먼저 foreach루프라는 것에 대해서 사용을 하기 위해서는 두가지 조건이 만족되어야 한다고 합니다.

1) 먼저 리스트나 배열을 선언해 놓아야 하며

2) void Start() 메서드에서 리스트나 배열에 요소를 집어 넣어야 합니다.


사용법은 다음과 같습니다. 


foreach(데이터형식 변수이름 in 배열or리스트이름){


메서드(변수이름);

}


사용하는 예시는 아래와 같습니다.

------------------------------------------------------------------------------------------


public class 클래스이름 {

 

public List<string> 리스트이름 = new List<string>();


void Start(){

   리스트이름.Add("A");

   리스트이름.Add("B");

   리스트이름.Add("C");

   리스트이름.Add("D");


foreach(string 변수이름 in 리스트이름)

{

 Debug.Log(변수이름);

}

}

}

------------------------------------------------------------------------------------------


위 예시에서 보면 Debug.Log(변수이름); 이라고 하면, 여기서는 리스트이름 안에 들어가 있는 요소들을 유니티5의 콘솔에서 표시하게 됩니다. 우선 여기서 변수이름 은 foreach안에서 선언되는 것이기 때문에 따로 다른 데서 선언할 필요는 없습니다. 다만 여기서 리스트이름 이 string이라는 데이터 형식이기 때문에, 변수이름 앞에 나오는 데이터의 형식도 string이 되는 것입니다.


그리 골치아프게 생각할 것 없이, 변수이름 은 루프블록이라고 해서 { } 안에 들어가는 메서드가 리스트이름에 접근하기 쉽게 하기 위해서 쓰는 것이라고 보시면 됩니다. 그리고 이 foreach 루프는 눈치 채신 분들도 있을 지도 모르겠지만, 배열, ArrayList, 해시 테이블에도 적용이 가능하다고 합니다.


다음으로는 for루프에 들어가 보도록 해 보겠습니다. 


for (초기화 ; 조건식 ; 증감문) { }


* 초기화 : 값을 대입하는 변수선언이며, 루프를 제어하기 위해서 정수 변수가 필요한 부분입니다. 

            사용예 ) int 변수이름 = 0


* 조건식 : 이 조건식이 참이어야만 { } 안의 부분을 실행합니다.

            사용예 ) 변수이름 < 10


* 증감문 : 루프실행이 될 때마다 초기화에 선언한 변수에 값을 더하거나 뺀다.

            사용예 ) 변수이름++


그리고 이어서 for루프 보다 더 간단해 보이는 것이 하나 있는데, 이게 바로 while루프입니다.


while(조건식) { }


조건식이 참일 때마다 { } 안에 있는 코드를 실행한다고 합니다. 그 사용예는 아래의 코딩과 같습니다.

------------------------------------------------------------------------------------------


public class 클래스명{

int 변수이름=0;


while(변수이름<10)

{

  Debug.Log(변수이름);

  변수이름++;

}

}

------------------------------------------------------------------------------------------


위 예시에서 변수이름이 처음에는 0이라고 선언을 하였고, 조건식은 10 미만이면 '참'이 된다고 합니다. 그럼 참일 때 마다 유니티5의 콘솔에 변수이름을 출력하도록 하고, 그 다음에는 루프마다 1씩 더 증가시키라는 의미가 됩니다. 이 루프는 변수이름이 10이 되는 순간 끝나게 됩니다.


우선 for루프와 while루프의 차이점은 다음과 같다고 합니다. 

for루프는 배열과 리스트를 반복할 때 유용하지만,

while루프는 조건식이 '참'일 때마다 반복해야 할 경우에 정말 유용합니다.


이제 루프를 이용한 예시를 하나 보여드릴까 합니다. 배열에서 요소를 가져와야 하는 경우, 인덱스를 알고 있으면 간단하지만 그렇지 않다면 하나하나 검색해야 할 필요성이 있습니다. 이 경우에는 루프를 사용하는 것이 좋다고 합니다.


------------------------------------------------------------------------------------------


public class 클래스명 : Monobehavier{

 public List<string> 리스트이름 = new List<string>();

 

 void Start(){

   리스트이름.Add("A");

   리스트이름.Add("B");

   리스트이름.Add("C");

   리스트이름.Add("D");

   리스트이름.Add("E");

   리스트이름.Add("F");

   리스트이름.Add("G");

            .

            .

            .

            .

            .

            .

            . 


   int 변수이름1번 = -1;

   for(int 변수이름2번 = 0; 변수이름2번<리스트이름.Count; 변수이름2번++)

   { 

    if(리스트이름[변수이름2번] == "찾고자 하는 문자열")

    { 

      변수이름1번 = 변수이름2번;

      break;

      }

   }

   if(변수이름1번 == -1) { Debug.Log("찾고자 하는 문자열이 없습니다.")}

    else { Debug.Log("찾고자 하는 문자열은 인덱스 번호" + 변수이름1번)}

}

------------------------------------------------------------------------------------------


우선 위 예시에서는 for루프가 사용이 되었습니다. 여기서는 먼저 변수이름1번 은 -1로 선언을 하였는데, 이 것은 리스트이름에서 찾고자 하는 문자열을 찾지 못할 경우에 설정된 값입니다.

즉, 아래의 코드


 if(리스트이름[변수이름2번] == "찾고자 하는 문자열")

    { 

      변수이름1번 = 변수이름2번;

      break;

      }


이 코드에서는 먼저 찾고자 하는 문자열을 찾았을 경우 변수이름1번의 값을 리스트 안의 인덱스 값으로 되어 있는 변수이름2번 으로 교체하고, 그리고 나서 그 즉시 break; 구문을 써서 루프를 중단시키게 됩니다.


그런데 이렇게 찾고자 하는 문자열이 없으면, -1로 선언이 되었는데 찾고자 하는 문자열이 없는 경우에는 그 값이 계속 이어지기 때문에 for루프 구문 밖에는 아래의 if 구문에서 출력되는 문구가 갈리게 됩니다.


 if(변수이름1번 == -1) { Debug.Log("찾고자 하는 문자열이 없습니다.")}

    else { Debug.Log("찾고자 하는 문자열은 인덱스 번호" + 변수이름1번)}


변수이름1번이 계석 -1이라고 하면, if구문의 값을 참이기 때문에, "찾고자 하는 문자열이 없습니다." 를 출력하게 됩니다. 그런데 리스트의 인덱스를 발견하는 데 성공해서 -1이라는 값이 아니라면, 다른 구문을 출력하게 되는 것입니다.



일단 이렇게 간단하게 루프의 사용법에 대해서 정리를 하는 데는 성공했고, 다음 포스팅에서는 객체라는 것에 대해서 이야기를 할까 합니다. 될 수 있으면 알기 쉽도록 설명을 하도록 할 것을 약속드리며, 포스팅을 여기서 마치도록 하겠습니다.



  

저작자 표시
신고

안녕하세요?


[유니티5와 함께하는 C# 첫걸음]이라는 책을 읽고서 유니티5로 게임을 제작하는 것에 있어서 프로그래밍에 대한 부분을 공부하고 있는 중입니다. 일단 책의 챕터5까지는 읽고서 중요하다고 생각한 내용을 정리하였고, 이번 포스팅에서는 그렇게 정리한 내용을 다시 한번 더 정리해서 포스팅에 들어가고자 합니다.


먼저 변수에 관해서 이야기를 해야 겠습니다. 책에서 소개가 되어 있는 것은 카멜 표기법(camel casing)이라는 것을 속개하고 있는데, 변수의 이름을 정하는 규칙인데... 아래의 예제와 같이 첫단어를 소문자로 시작하고, 두번째 단어부터 시작하는 알파벳을 대문자로 시작한다고 보시면 됩니다.


firstSecondThirdForth


이런 식으로 작성을 해서, 띄워쓰기가 없는 한단어로 만들어야 한다고 합니다. 왜 이렇게 변수의 이름을 길게 만드냐고 하면, 너무 포괄적이고 구체적이지 않은 이름을 쓰면, 자기가 만든 변수라고 해도, 이 변수가 무엇을 의미하는 지를 알 수 없어서 후회하는 사태가 벌어진다고 합니다. 그래서 아래처럼 '톰아저씨의 핫도그 갯수'를 의미하는 변수라면 다음과 같은 이름을 지어야 한다고 합니다.


uncleTomHotdogNumber


물론 이름을 짓는 것은 본인의 자유이지만, 주의해야 할 것은 분명히 자기가 작성한 코드를 다시봐야 할 일이 있는데 그때마다 코드를 전체적으로 다시 봐야 할 필요 없이, 이름만 보고서 이게 무엇을 의미하는 지를 알 수 있도록, 이름의 길이가 길어지는 한이 있어도 구체적으로 지어야만 한다는 것입니다.


이어서 변수를 선언하기 위해서는 3가지 요소가 있어야 하는데, 그 요소는 다음과 같습니다.

1) 변수사 저장할 수 있는 데이터 형식

2) 변수의 이름

3) 끝을 장식하는 세미콜론(;)


int testVariation;


위 세3지만 지정해도 변수를 선언하는 데는 지장이 없다고 합니다. 위에 올라와 있는 예시에서 보면 알 수 있듯이, 일단 public이라는 선언을 하지 않았으므로 유니티5에서 private로 처리를 하며, 그 결과 유니티5의 inspector창에 표시가 되지 않으며, 다른 스크립트에서 접근할 수 없습니다. 따로 값을 대입하지 않으면 정수인 int라고 선언했으니, 기본적으로 0의 값으로 처리가 됩니다.


다음으로는 메소드라는 것에 대해서 정리를 해 보겠습니다. 메소드는 이름만 호출하면 다시 실행할 수 있는 코드블록이며, 이를 이용하면 두번이상 실행하길 바라는 코드를 그때마다 일일히 입력할 필요없이 메소드만 호출하면 됩니다. 그리고 메소드란 '함수'와 정확히 같은 뜻이라고 합니다.


이 메소드의 이름 역시 길이가 길어지더라도 한눈에 의미를 알 수 있는 이름으로 지어야만 합니다. 이 역시 자기가 작성한 코드를 다시봐야 하는 일이 생기는데, 그럴 때 마다 자세한 의미를 알 수 있기 때문입니다. 그리고 메소드의 이름을 짓는 규칙은 변수와의 차별화를 위해서 시작하는 첫 알파벳은 대문자로 하며, 이후 이어지는 단어의 시작 알파벳을 대문자로 하는 것입니다.


메소드를 구성하는 최소 요건은 3가지라고 합니다.

1) 메소드를 호출한 위치로 리턴할 데이터의 형식

2) 코드 블록을 담은 중괄호 한쌍

3) 괄호 한쌍으로 끝나는 메소드의 이름


void FirstSecondThirdForth() { } 


위에 나온 예시에서 처럼 저렇게 만들어도 메소드가 만들어 지기는 집니다. 이 경우 public이라고 하지 않았기 때문에, 기본적으로 private처리를 하기에 다른 스크립트에서 이 메소드를 호출할 수 없습니다. 그리고 코드 블록인 중괄호에 아무것도 없기에 아무런 일도 일어나지 않습니다. 그리고 void라고 해서 아무것도 없다는 것을 선언했기 때문에, 어떠한 값도 리턴하지 않는다는 의미가 됩니다.


그런데 만약 두 정수의 값을 더해서 그 합을 만드는 메소드를 만들었다면 어떻게 해야 할까요? 그리고 그 값을 표시해야 할 필요가 있다고 하면? 이 경우에는 void라고 하면 안되고, int라고 테이터의 형식을 지정해야만 합니다. 그래야만 두 정수의 합이라는 정수를 정수 형식으로 호출한 곳으로 보낼 수 있습니다.




여기서 헷갈릴 수도 있는게, 호출한다라는 것은 별것없이 스크립트 어디에서나 


메소드이름();


이라고 하면 코드 블록 안에 있는 코드가 메소드의 이름을 입력한 곳에서 실행이 되는 것을 의미합니다. 당연 리턴값이라는 것도, 이 메소드의 이름을 집어넣은 곳에다가 메소드 안에서 계산이 된 값을 다시금 주는 것을 의미합니다. 먼저 public으로 선언이 된 A라는 이름의 메소드를 first.cs라는 스크리브에서 만들었다고 칩시다. 이 A라는 메소드는 두 정수의 합을 구해주는 메소드인데, second.cs라는 스크립트에서 A(); 이라고 입력을 해서 메소드를 호출했습니다.


그럼 second.cs라는 스크립트에 A라는 메소드의 계산값을 줘야 하는데, 이 경우에 사용되는 것이 데이터 형식으로 void를 지정하면 아무것도 주지 않겠다는 의미가 되어서 second.cs는 아무런 값을 받을 수도 없는 것입니다. 그런데 아래의 형식으로 A라는 메소드를 지정했다고 합니다.


public int A() { }


이 경우에는 second.cs라는 스크립트에다가 정수 형식이라고 int를 선언했으니, 정수값을 가져다가 주는 것입니다. 


그리고 메소드는 언제나 괄호 두개로 끝이 나는데, 이 괄호안에 들어가 있는 것을 '파라미터'라고 합니다. 즉, 메소드에 들어가는 변수로서 위에 예시에 든 A라는 메소드가 성립하기 위해서는 2개의 정수값을 넣어줘야 하는데, 이때 괄호안에 정수 2개가 들어가는 것입니다.


그리고 마지막으로 값을 리턴하기 위해서는 코드블록 안에다가 return; 이라는 키워드를 적어 주어야 합니다. 이렇게 해야 메소드를 호출한 위치로, 메소드의 리턴하는 값을 끼워주는 행동을 하게 됩니다.


다음으로는 배열이라는 것에 대해서 정리를 하도록 하겠습니다.


배열이라는 것은 간단하게 값을 목록을 하나의 변수에 저장하는 것으로 아래의 형식을 지정하면 된다고 합니다.


public 데이터형식[] 배열이름 = new 데이터형식[숫자];


* 여기서 public은 다른 스크립트나 메소드에서 접근할 수 있음을 의미하는 것입니다. 

* 데이터 형식은 int라는 정수나 string같은 문자열인 데이터의 형식을 의미합니다.

* 숫자는 배열안에 들어가는 데이터의 갯수입니다. 만약 문자열인 사람이름이 4명분 들어간다고 하면, 4라는  숫자가 입력됩니다.


그러니 여기서 리스트라는 것이 등장하는데, 배열에 비래서 2가지의 더 나은 점이 있다고 합니다.

1) 배열의 크기는 바꿀 수 없으나, 리스트의 크기는 바꿀 수 있다.

2) 배열은 '안에 들어가는 데이터-요소'를 늘리기 위해서는 요소의 수를 늘리고, 기존의 요소를 복사하는 과정이 필요하나, 리스트는 요소의 추가나 삭제가 쉽습니다.


이런 이유로 리스트가 쓰이며, 유니티5에서 주로 쓰이는 예시로는 RPG게임의 인벤토리 같은 것으로 사용이 된다고 합니다. 이런 리스트를 사용하기 위해서는 C# 스크립트 상위에 아래에서 나오는 구문을 써야만 한다고 합니다.


using system.Collections.Generic;


예전에 포스팅을 하였는 prime[31]을 사용할 때와 마찬가지인 것으로 보입니다. 아무튼 이런 것을 사용해야 하며, 배열과는 다르게 아래의 예시와 같은 형식으로 선언을 해야 한다고 합니다.


public List<데이터형식> 리스트이름 = new List<데이터형식>( );


이렇게 리스트를 사용하는 것이 편하기는 편하나, 배열은 처리의 속도가 빠르다는 장점이 있습니다. 그래서 유연하게 요소를 추가하고 빼야하는 상황에서는 리스트를 사용하고, 데이터처리의 속도가 빨라야먄 하는 경우에는 배열을 사용하는 것이 좋다고 책에서는 언급하고 있습니다.


그럼 여기서 궁금한 것이, 어떻게 배열과 리스트에 데이터를 넣고 빼느냐 하는 것일 건데, 방법은 간단합니다. 유니티의 C# 스크립트를 실행해 보면 나오는 start()와 update()라는 함수가 기본적으로 있습니다. 이런 메소드는 스크립트가 시작할때, 주로 유니티5에서 플레이 버튼을 눌렀을 때를 지칭하고 있는 경우가 많습니다. 아무튼 이런 start() 에다가 아래의 형식으로 배열이나 리스트에 데이터를 추가할 수 있습니다.


배열이름 or 리스트이름.Add(배열이나 리스트에 넣을 데이터);


이런 형식을 지켜서 데이터를 추가할 수 있으며, 그 외의 명령어는 LIst<T> 라는 형식으로 검색을 하는 것으로 알 수 있습니다. 그리고 유의해야 하는 것은 이 배열이나 리스트는 인덱스라고 해서 번호를 매겨서 안에 들어가 있는 데이터를 관리하고 있는데, 1이 아니라 0으로 시작을 한다는 것을 잊으면 안됩니다.


반대로 배열이나 리스트의 안에 들어가 있는 요소를 가지고 오고자 하면 아래의 형식을 입력하면 됩니다.


배열이나 리스트의 이름[정수인 숫자]


이와 같은 식으로 입력하는 것으로 배열이나 리스트안에 들어가 있는 데이터를 가지고 올 수 있는 것입니다. 마지막으로 리스트나 배열은 같은 형식의 데이터만 저장할 수 있습니다. 예를 들면 문자열인 string을 지정했으면 문자열만 저장할 수 있는 것으로 되는 것입니다.


추가로 배열의 경우에는 배열이름.Length 로 배열의 크기를 확인할 수 있으며, 리스트의 경우에는 리스트이름.Count 를 지정해서 배열이나 리스트의 크기를 확인할 수 있다. 


다음은 ArrayList라는 것이 있습니다. 가장 중요한 특징은 ArrayList의 경우에는 데이터의 형식과 관계없이 저장을 할 수 있다는 것입니다. 가령 리스트나 배열은 문자열과 정수를 둘 다 저장할 수 없는데, ArrayList는 가능하다는 것입니다. 이 ArrayList를 지정하는 방법도 간단합니다.


public ArrayList 이름 = new ArrayList();


이제 마지막으로 해시 테이블이라는 것에 대해서 언급을 하고 지나가야 겠습니다. 이 해시 테이블이라는 것은 딕셔너리라는 것 일종으로 가장 많이 사용되는 딕셔너리라고 합니다.배열이나 리스트는 인덱스라는 정수를 이용해서 저장된 데이터를 관리를 하는데, '문자열'인 키를 이용해서 각자의 데이터를 관리한다고 할 수 있습니다.


public Hashtable 해시테이블이름 = new Hashtable();


위와 같이 나와서 해시 테이블을 선언할 수 있으며, 해시 테이블은 크기를 얼마든지 바꿀 수 있으며, 문자열과 정수 등 다른 형식의 데이터를 동시에 저장할 수 있으며, 중요한 특징으로 유니티5의 inspector창에서 전혀 보이지 않습니다. 그리고 해시 테이블의 경우에는 아래와 같은 형식으로 해시 테이블에 데이터를 저장할 수 있습니다.


해시테이블이름.Add("문자열 값", 저장할 데이터);


즉, "문자열 값"이라는 것을 키로 해서, 저장할 데이터를 해시 테이블에 저장하라는 의미인데, 이 때문에 불러올 때도 아래와 같은 형식을 띄게 됩니다.


(데이터형식)해시테이블이름["문자열 값"];


이것으로 챕터5까지 공부해서 중요하다고 생각한 것을 마칩니다. 다만 여기까지 정리한 것은 이론상으로 볼 때 중요하다고 생각한 것이었지, 실습을 해서 얻은 것은 아니기는 합니다. 그래서 아마 책의 후반부에 들어가면 실습할 기회가 올 것으로 생각이 되는데, 그 때 가서 포스팅의 내용을 더욱 알차게 해서 올리도록 하겠습니다.




저작자 표시
신고

안녕하세요?


드디어 지겹고도 지겨웠던 유니티5의 독학에서 [실전! 유니티5로 소셜 네트워크 게임 만들기]라는 책의 마지막 챕터까지 실습해 보는 데는 성공했습니다. 아무튼 이번 포스팅에서는 그 내용을 포스팅 하고자 합니다.



먼저 해야 하는 것은 슈팅게임이기 때문에 필요한 미사일을 제작하는 과정입니다. 이를 위해서 먼저 미사일 이미지를 계층뷰(Hierarchy view)로 드레그 앤 드롭으로 끌어다 놓도록 합니다.



그리고 방향을 책에서는 270으로 설정하라고 되고 있는데, 제가 실제로 입력을 했더니, -90으로 나오는 것을 확인하였습니다. 



다음으로 Missile 오브젝트에 Rigidbody2D를 추가하도록 해서, 미사일의 이동에 필요한 것을 주도록 합니다.



충돌을 위해서 Box Collider 2D라는 컴포넌트를 추가하도록 합니다.



그리고 위 스크린샷에서 보이는 것처럼 사이즈를 조절하도록 해줍니다.



다음은 게임 오브젝트를 작동하게 하기 위해서 Missile.cs라는 스크립트를 제작하도록 해줍니다.



이 코드는 시작하자 마자 Rigidbody2D에다가 오른쪽으로 8의 속도로 이동하라는 의미가 됩니다.



그리고 언제까지나 계속해서 미사일이 나가서만은 안되기 때문에, Update라고 언제나 5미터를 넘어가면 사라지라는 의미가 됩니다.



다음에는 완성된 스크립트를 Missile게임 오브젝트에 붙이도록 해 줍니다.



다음 단계로는 GamePrefabs이라는 폴더를 만들도록 합니다.



다음에는 Hierarchy view에 있던 Missile 게임 오브젝트를 끌어와서 프리팹으로 만들도록 하고, Hierarchy view에 있던 게임 오브젝트는 삭제하도록 합니다.



플레이어 캐릭터가 위 아래로 움직일 때 마다 플레이어 캐릭터의 위치에서 총알이 발사될 수 있도록 하기 위해서, MissileProcess.cs라는 스크립트 파일을 만들어서, 코딩작업에 들어가 보도록 해 봅니다.



게임 오브젝트로서 missile을 null이라고 처음 시작하자 마자 선언을 하도록 하고, 그 다음에는 시작하자 마자 MissileUpdata()라는 메소드를 실행하도록 합니다. 


obj.transform.position=this.transform.position;


이라고 해서, 이 스크립트가 속해져 있는 게임 오브젝트에서 미사일이라는 것을 발사하라는 명령어가 됩니다.


yield return new WaitForSeconds(1.0f); 


이 명령어는 총알을 발사하는 데, 1초 대기하라는 의미가 됩니다.



다음은 Player라는 게임 오브젝트에 Missile Process라는 스크립트를 추가하도록 합니다. 그런데 Missile이라는 항목이 아무것도 없습니다.



프리팹으로 되어 있는 missile을 드레그 앤 드롭으로 추가하도록 합니다.



다음으로는 레이어를 정리해야 할 필요가 있는데, 위 스크린샷에 보이는 것처럼 Tags and layers를 선택하도록 해야 합니다.



모르고 엉뚱하게 했는데, 일단 위 스크린샷에서 Layers라는 항목을 눌러서 메뉴를 펼치도록 합니다.



위 스크린샷에 나와 있는 것처럼 순서대로 레이어를 지정하도록 합니다.



먼저 Player라는 게임 오브젝트는 Player라는 레이어에 거치가 되도록 해 줍니다.



게임 오브젝트는 아니지만, 미사일은 프리팹을 눌러서, 레이어를 Missile로 지정해 주도록 합니다.



이번에는 위 스크린샷에 나와 있는 것처럼 Physics 2D라는 것을 실행 하도록 해서, 레이어가 서로 충돌하지 않도록 해야 합니다.



위 스크린샷에 나와 있는 체크 표시를 해제하는 것으로 Player와 Missile은 이제 충돌하지 않고, 발사될 때마다 큰 문제는 없으리라 생각합니다.



위 동영상에 나오는 것처럼, 이제는 충돌없이 미끄럽게 미사일이 발사가 되는 것을 볼 수 있습니다.



이제 다음에는 몬스터를 작성할 시간입니다. 이 작업을 하기 위해서 먼저 Pig_move01이라는 이미지를 Hierarchy view에 끌어다가 놓습니다.



일단 위 스크린샷처럼 돼지의 위치를 끌어다가 옮기도록 해 봅니다.



그리고 좌우반전을 위해서, 위 스크린샷에 나와 있는 것처럼 -1을 주도록 하는 식으로 만들도록 합니다.



역시 움직임을 위해서 Rigidbody 2D를 주도록 합니다.



그리고 중력의 영향을 받아서 돼지들은 떨어지면 안되기 때문에, Gravity Scale을 0이라고 주도록 합니다.



Box Collider 2D를 추가한 다음에, 사이즈를 조절해 주도록 합니다.



이번에는 제대로 움직이게 하기 위해서, Monster.cs라는 스크립트 파일을 만들어 주도록 합니다.



Random.Range를 -2에서 -4까지 주는 것으로 해서, 돼지들은 좌측으로 이동하도록 해 줍니다.



위 스크린샷에 나온 것처럼 코딩을 하도록 합니다.먼저 총알이 되는 Missile이 몬스터에게 충돌하였을 경우에는 총알이 사라지도록 코딩을 한 것입니다. 그리고 나서 처음에 돼지의 체력이 5로 설정을 했는데, 이 체력이 총알에 맞으면 깍여서, 0 이하가 되면 몬스터가 사라지라고 코딩을 하였습니다.



처음에는 몰랐는데, 책에서 오타가 난 것이 있어서, 위 스크린샷처럼 일단은 바꾸도록 했습니다.



다음으로는 Monster.cs라는 스크립트를 몬스터의 게임 오브젝트에 붙이도록 합니다.



그리고 다음에는 Hierarchy view에 있는 게임 오브젝트를 GamePrefabs라는 폴더로 끌어다 놓는 것으로 프리팹으로 만들어 주도록 합니다. 이 역시 프리팹이 만들어 지고 난 다음에는, Hierarchy view에 있는 게임 오브젝트를 삭제하도록 합니다.



다음으로는 몬스터가 생성되도록 create empty child를 생성하도록 합니다.



먼저 MonsterManager라고 이름을 바꾸도록 합니다.



이번에는 MonsterManager.cs라는 스크립트 파일을 생성하도록 합니다. 



여기서는 역시 위 그림처럼 코딩을 하는데, 특이한 사항이라면, 여깃 MonsterUpdate() 메서드 안에서 startcoroutine이라고는 것을 통해서 MonsterUpdate()를 집어 넣어서, 반복적으로 처리가 되도록 했다는 것이 특이점입니다.



당연 다음 단계는 이 MonsterManager.cs를 MonsterManager 게임 오브젝트에 추가하도록 합니다. 그리고 나서 비어 있는 Empty항목에 몬스터의 프리팹을 집어 넣도록 합니다.



그리고 몬스터를 여러마리 생성시키게 하기 위해서, 위 스크린샷에 나와 있는 것처럼 MonsterManger를 여러개 복사해서 놓도록 합니다.



최종 결과로 몬스터인 돼지가 3마리씩 나와서 날아가는 것을 볼 수 있습니다. 이것으로 책에서 나와 있는 주요 챕터는 다 하기는 했지만, 그래도 부록이 남아는 있고, 이 책 한권만 가지고서는 어떻게 게임을 만들 수 있는 기초가 되지 않았습니다. 아무래도 유니티5의 독학은 아직 갈길이 멀었다는 생각이 듭니다.


저작자 표시
신고

안녕하세요?


요즘 날이 너무 덮다 보니, 유니티5를 독학하는 데도 이래저래 지장이 가는 것도 사실은 사실입니다. 아무튼 간에 원래의 계획대로면 이번 포스팅에서 챕터9를 다 끝내고자 했는데, 그건 아무래도 분량이 생각보다 많아서 어렵겠다는 생각이 듭니다. 그래서 이번 포스팅에서는 약간의 코딩과 함께 플레이어 캐릭터의 움직임을 처리하는 것으로 포스팅을 하고자 합니다.



지난번 포스팅에서 만들어 둔 적이 있는 PlayerState.cs라는 스크립트를 열어서 위 스크린샷의 붉은색 박스 안에 있는 코드를 코딩하도록 합니다. 여기서 Input.GetMouseButton(0)는 마우스 오른쪽을 클릭하는 것을 의미하며, 모바일 기기로 유니티5의 프로젝트를 빌드하면, 화면을 터치하는 것으로 인식하게 됩니다.



다음에는 true나 false 둘중 하나로 떨어지는 isUP라는 bool타입의 변수를 선언해 주도록 합니다.



다음에는 항상 변해야 하는 상황에서는 마우스 우클릭이 되면 isUP가 true로 바뀌도록 해 주며, 그게 아니고 전혀 클릭을 하지 않으면 isUP가 false가 되는 상태가 되어라 라는 의미가 됩니다.



다음은 물리 기능을 이용한 이동처리를 위한 함수인 FixedUpdata() 라는 변수를 추가합니다. 이 변수명은 대소문자도 구분 한다고 하니, 입력할 때 조심을 해야 합니다. 일단 여기서는 함수를 추가 하기만을 합니다.



먼저 Player라는 게임 오브젝트에 Rigidbody 2D라는 컴포넌트를 추가하도록 합니다. 



다음은 이 Rigidbody 2D가 제대로 작동하기 위해서 PlayerState.cs에다가 위 스크린샷에 올려진 것 처럼 코딩을 하기 시작합니다. 그리고 이렇게 값을 두는 이유는............



위와 같이 FixedUpdate() 함수에다가 velocity값을 주기 위해서입니다. 이 값을 주면, 오브젝트를 특정한 방향으로 움직일 수 있는 것으로 보이는데, 여기서는 Vector2로 두면 첫번째는 X방향, 두번째가 Y방향을 의미하는 것으로 보입니다.



완성된 코드입니다. 이제 캐릭터는 그냥 놔두면 중력의 영향을 받아서 아래로 떨어지고, 마우스 우클릭을 하면 위로 상승하는 것을 볼 수 있습니다. 하지만 문제가 되는 것은 그냥 그대로 계속 놔두면 계속해서 아래로 떨어진다는 문제가 있습니다. 그래서 이번에는 바닥을 만드는 작업에 들어가 보도록 하겠습니다.



먼저 bg_sunset이라는 것을 드레그해서 Hierarchy뷰에 드롭합니다. 문제는 책에서와 달리 이 바닥면이 보이지 않는 다는 것이였습니다.


 

결국 하는 수 없이 Order in Layer를 숫자를 높여서 이 문제를 해결할 수 있었습니다.



다음으로는 이 바닥이 되는 게임 오브젝트에 Box Colliderr 2D를 만들어 주도록 합니다. 이걸 만들어 주는 것으로 부딪칠 수 있다는 것으로 만들어 주는 것입니다.



다음에는 위 스크린샷에 붉은색 박스를 친 부분에 들어가 있는 것처럼 사이즈와 오프셋을 지정하도록 합니다. 이것으로 바닥은 이제 제대로 사이즈가 갖추어진 딱딱한 물체가 되었다고 볼 수 있는 것으로 생각됩니다.



다음은 Player라는 게임 오브젝트도 충돌을 해야 하니까, Box Collider 2D를 지정하도록 합니다. 그리고 나서 다음은.....



위 스크린샷처럼 사이즈를 지정해 두도록 합니다. 이제 유니티5 상에서 실행을 시켜 보아서 제대로 작동을 하는 지 알아보도록 하겠습니다.



실행결과 제대로 캐릭터는 바닥에 닿은 채 더 이상은 떨어지지 않는  것을 확인할 수 있었습니다. 이것으로 이번 포스팅의 짧은 내용을 마치면서 다음 분량을 실습하는 데로 포스팅에 올리도록 해 보겠습니다.

저작자 표시
신고

안녕하세요?


드디어 [실전! 유니티5로 소셜 네트워크 게임 만들기]라는 책도 거의 다 끝나가는 상황인데, 아무튼 간에 이제 마지막 챕터인 챕터9를 한번에 다 실습을 해보고자 했습니다만, 그건 아무래도 무리였고 하는 수 없이 중간에 짤라야만 했습니다. 아무튼 실습한 내용을 이번 포스팅에 올려 보겠습니다.



먼저 필요한 스프라이트 들을 기존에 작업을 하였는 shootergame이라는 프로젝트의 Images라는 폴더에다가 드레그 앤 드롭으로 놓도록 합니다. Ctrl + C와 Ctrl + V로 복사해서 붙여넣기를 하려니 전혀 먹히지 않아서, 조금은 불편하기는 하지만 이렇게 드레그 하는 수 밖에 없었습니다.



이제 새로운 씬을 만들어서 새로이 저장을 하는 것입니다. 기존에 Game이라는 저장명이 있어서 하는 수 없이 Game2라고 했습니다.



먼저 배경이 되는 계층뷰의 윈도우로 드레그해서 놓는 방식으로 새로운 게임 오브젝트를 생성하도록 해 보겠습니다.



제대로 된 배경화면이 나오는 것을 확인할 수 있습니다.



메인 카메라를 위 스크린샷과 같이 설정을 하도록 해서, 제대로 된 배경화면이 나올 수 있도록 합니다.



제대로 배경화면이 게임화면에서 나오는 것을 볼 수 있습니다. 이렇게 만들어 졌으니, 다음 단계로 가도록 합니다.



PlayerData라는 게임 오브젝트를 생성합니다.



그다음 이전에 작업을 해 두었는 PlayerData.cs라는 스크립트를 달아 주도록 합니다.



다음으로는 플레이어 캐릭터가 될 스프라이트를 Hierarchy윈도우로 끌어서 게임 오브젝트로 추가하도록 합니다. 그리고 게임 오브젝트의 이름도 알기 쉽도록 Player라고 변경하다록 합니다.



그런데 책에서의 설명과는 다르게 플레이어 캐릭터가 전혀 나타나지 않는 문제가 발생하였습니다.



결국 Order in Layer라는 것을 1로 변경하고 나서야 플레이어 캐릭터가 될 캐릭터가 나오는 것을 볼 수 있었습니다.



그 다음으로는 Player에 Animator라는 컴포넌트를 추가하도록 합니다.



이미 이전의 작업으로 Animations라는 폴더가 있는데, 여기다가 Animator Controller라는 것을 생성하도록 해서, 원래를 이름을 Player Controller라고 설정을 해야 했지만, 이미 이전의 작업으로 저는 생성이 되어 있었습니다.



이제 생성된 Player Controller를 Player라는 게임 오브젝트에 있는 Animator 컴포넌트에 있는 Controller항목에다가 가져다 놓으면 됩니다.



이제 Windows라는 항목을 열어서 Animation이라는 윈도우를 열었을 때 화면입니다.



새로이 애니메이션을 만들고자 먼저 loloco_idle01부터 04까지를 드레그 해서 animaiton윈도우에 놓습니다.



그런데 무엇이 문제인지 의도한 대로 애니메이션이 나오지 않습니다. 그래서 이래저래 헤메었는데.......



일단 기존에 있는 Animation윈도우 안의 스프라이트를 모두 지워보기도 했지만, 결과는 그다지 시원치 않았습니다.



알고 보았더니, 위 스크린샷에서 빨간색 동그라미를 친 부분을 눌러서, 새로이 Animation을 추가해야만 하는 작업이었습니다. 일단 이제서라도 알았으니, 첫번째 애니메이션은 PlayerBasicIdle이라고 지정을 해서 만들어 가도록 합니다.



완전히 새로 만들어진 화면에서 위 스크린샷과 같이 4장의 스프라이트를 끌어다가 놓도록 합니다.



다음으로는 Samples옆에 있는 항목을 10으로 바꾸어서 10프레임으로 바꾸어 주도록 합니다. 



다음은 PlayerMaidIdle이라고 지정을 해서 두번째 에니메이션을 만들도록 합니다.



이번에도 역시 10프레임으로 고정되어 움직이도록 해 줍니다.



PlayerWitchIdle이라는 이름을 지정해서 3번째 캐릭터의 정지상태 애니메이션을 만들도록 합니다. 



이번에도 프레임을 10 프레임으로 지정해 두도록 합니다.



이제 다음 작업을 위해서 Windows항목에서 Animator라는 항목을 눌러서 애니메이션들을 관리하도록 합니다.



여기서도 책과는 다른 상황이 벌어졌습니다. 제가 분명히 추가한 애니메이션들이 여기서는 전혀 나와 있지 않는 것이였습니다.



다시한번 확인을 해도 여기도 없는 것이 확인이 되었고 한참을 헤메었는데.....



위 스크린샷에 나와 있는 것처럼 Reimport All이라는 것을 클릭하고서 한참을 기다려야 하는 작업이 남아 있었던 것입니다. 일단 이를 누르고 나면, 제가 작업했는 애니메이션들이 다시 나오는 것을 볼 수 있습니다.



이제서야 제대로 제가 추가했는 애니메이션들이 나와 있는 것을 볼 수 있었습니다. 이제부터 다음 작업에 들어가도록 해 보겠습니다. 여기서의 작업은 플레이어의 값에 따라서 플레이하는 캐릭터가 달라지도록 하는 것입니다.



먼저 새로운 박스를 생성하도록 합니다.



박스의 이름은 먼저 New State라고 있는데 이를 Root라고 지어 주도록 합니다.



그 다음 우클릭을 해서 default라는 메뉴를 눌러서 Root가 되도록 지정을 합니다.



다음으론느 Source란에 있는 스크립트 중에서 C# script를 하나 새로 생성해서, 이름을 PlayerState.cs라고 지어 주도록 합니다.



다음 작업은 이 PlayerState라는 스크립트를 Player라는 게임 오브젝트에 추가하도록 합니다. 그리고 나서 코딩에 들어가도록 해야 합니다.



먼저 제일 윗줄에 Animator animator = null; 이라고 코딩을 한 다음, 시작하자 마자(void Start()에서) Animator의 값을 가져올 수 있는 코드인 animator = GetComponent<Animator>(); 를 입력합니다.



다음이 문제는 문제였는 것이 PlayerData라는 클래스의 내용을 가지고 와야 하는데, 원래는 에러가 뜨지 말아야 하는 곳에서 왜인지 계속 에러가 뜨는 지 의문인 상황이었습니다만.....



알고 봤더니 오타가 있어서 에러가 뜬 것이였습니다. 아무튼 밑에 있는 if문의 내용은 간단합니다. PlayerData라는 클래스에서 selChar라는 값을 가지고 오는데, 이게 0이면 Basic인 캐릭터를 표시하고, 이게 만약 1이면 메이드복 캐릭터를 표시하라. 그리고 그 이외의 값이 되면 마녀 캐릭터를 표시하라는 의미입니다.



실제로 제가 PlayerData라는 게임 오브젝트에서 selChar의 값을 1로 지정하고 유니티의 플레이 버튼을 누르자 기본적인 캐릭터에서 메이드복 캐릭터로 바뀌어서 나오는 것을 확인할 수 있었습니다.



마지막으로 selChar가 2라는 값으로 했을 때, 마녀 캐릭터가 나오는 것을 볼 수 있었습니다. 이것으로 챕터9의 절반을 실습하는 데 성공했는데, 될 수 있으면 다음 포스팅에서는 나머지 절반을 다 실습해 보도록 하겠습니다.

저작자 표시
신고

안녕하세요?


지난번 포스팅에서 userinfo.php를 시작하기 직전에 끊었는데, 아무튼 이번 포스팅에서는 그 부분부터 시작해 보도록 하겠습니다. 먼저 노트패드++를 열도록 합니다.



먼저 위와 같이 코딩을 하여서, 데이터 베이스에 접속하고, 사용자의 정보가 있는지를 확인하는 코드입니다. 이어서 비어있는 else다음의 {}안에다가 아래와 같이 코딩을 해 줍니다.



여기서 if구문으로 접속에 에러가 있으면 에러 메세지를 출력하고, 아닐 경우를 이제 코딩하는 것인데, sprintf()는 문자열을 만들어 주는 함수라고 합니다. 즉 SQL쿼리를 통해서 select로 검색작업을 하는데, 이걸 php상에서 해준다고 보시면 됩니다. 즉


$query=sprintf("select*from userinfo where account ='%s'",$account);


이 구문을 이용해서 페이스북에서 받은 아이디를 가지고서 검색을 하라는 명령어가 됩니다. 이어지는 구문은 다음과 같은 의미를 지니고 있습니다.


$db->query($query); 


이 명령어로 아까 위에서 만들어준 검색어를 실행하라는 의미가 됩니다. 그리고 이어지는 if구문에서는 검색결과가 있으면 당연 0을 초과하는 값이 나올 것이기에 다음과 같은 코딩을 하여서 데이터 베이스로 부터 저장된 값을 가지고 오게 됩니다.



이렇게 해서 계정이면 계정, 그외 각종 게임에 관련된 데이터면 데이터를 데이터베이스에서 해당되는 필드로 가지고 오라는 명령이 됩니다. 그럼 검색된 결과가 0이라서 없으면?



insert라는 명령어를 써서, 여기 없는 데이터를 저장하라는 명령어를 코딩하였고, 이 명령어가 실행이 되도록 하였습니다. 그리고 이어서 close()라는 명령어를 통해서 모두 닫아주도록 명령어를 내렸습니다. 



마지막으로 userinfo.php가 제대로 동작이 되었다면, 여기서 echo라는 명령어를 통해서 json형식의 데이터를 제대로 화면상에서 출력하라는 명령어가 됩니다. 이제 이게 제대로 작동하는 지를 알아보기 위해서는 우선 FTP상에 올려둘 필요가 있습니다.



알FTP를 이용해서 먼저 제 계정에다가 올려두도록 해 봅니다.



1차 시도는 오류가 발생하였습니다. 아무래도 7번 라인에 무언가 이상이 발생한 것 같습니다. 다시금 노트패드++를 실행시켜서 확인해 보도록 하겠습니다.



7번 라인에 오타로 인해서 에러가 발생한 것이였습니다. 이제 오타를 수정했으니, 한번 더 알FTP로 업로드 시킨다음 다시 인터넷 익스플로러로 접속해서 시도를 해 보았습니다.



이번에야 발로 제대로 된 메세지가 뜨는 것을 확인할 수 있었습니다. 그럼 이제는 제 계정이 있는 호스팅어 계정으로 직접 데이터 베이스 안으로 들어가, 제대로 된 유저 정보가 생성이 되었는지 여부를 살펴 보겠습니다.



이전에는 없던 유저의 정보가 생성된 것을 확인할 수 있었습니다. 이것으로 어떻게 해당하는 작업이 끝나기는 했고, 다음은 유니티5에서 빌드한 게임에서 접속하였을 때, 제대로 된 작업이 되는 지 여부를 알아보고자 합니다.



우선 이전에 있던 TitlePlay.cs를 위와 같이 코딩을 하였는데, WWWForm 부터 새로 추가된 구문입니다. 그런데 저 위 스크린샷에 보이는 url이 어떻게 처리할 방법이 없어서, 계속 에러가 뜬 상태로 놔두어야 했는데......



나중에 알고보니, 이 부분은 TitlePlay.cs가 아니라 PalyerData.cs라는 스크립트 안에서, PlayerData라는 클래스 안에서 정의를 내려야 한다는 것이었습니다.

아무나 접근을 할 수 있도록 public이라고 타입을 설정해 두도록 하고, 다음에는 static을 항상 홈페이지 주소에는 붙여야 합니다. 이런 과정까지 끝내고 나서야 url에 있는 에러를 아래와 같이 없앨 수 있었습니다.



이제 url에 있던 에러도 사라진 것을 볼 수 있었습니다. 그럼 다음으로 가서 Bloolagoon Json이라는 에셋을 다운로드 해야 합니다.



이 에셋은 무료이며, JSON데이터를 파싱하기 위해서 설치하는 에셋입니다. 일단 설치하는 단계는 정말로 쉬웠습니다. 



TitlePlay.cs에다가 새로 들여온 에셋을 활용하기 위해서 위와 같이 맨 위에다가 타이핑을 하도록 해 줍니다. 



다음 MyData()안에다가 위 스크린샷에 붉은색 박스를 친 안쪽의 내용을 코딩하기 시작합니다. 일단 위 스크린샷을 찍은 시점에서는 에러가 있는 것으로 보여지지만, 이게 적용되는 데 시간이 걸려서 이런 것인지, 지금은 에러가 된 상태로 이렇게 있습니다만, 다음 스크린샷에서 제대로 대문자로 고치고 에러도 지웠습니다.



아무튼 새 에셋이 적용되는데 시간이 걸려서 이러는 것인지 모르겠지만, 일단 조금은 시간이 걸려서 여려번 입력하고 나서야 이렇게 에러가 없는 상태로 코딩이 되는 데 성공했습니다. 여기서는 서버에서 전송된 www.text라는 값을 가지고 와서, 그 안에서 error라는 키를 얻어 오라는 의미가 됩니다.



다음은 위에서 없었던 LoadUserInfo()라는 메서드의 내용을 코딩한 것입니다. 여기서는 당연 서버로 부터 저장된 값을 불러오라는 명령어가 됩니다. 물론 처음으로 등록이 된 것이라면 이 값을 등록하라는 명령어도 겸하고 있다고 합니다. 아무튼 간에 여기까지 코딩을 하였으니, 다음 단계로 들어가 보도록 하겠습니다.



일단 안드로이드 앱으로 빌드할 것인데, 실행을 용이하게 하기 위해서 블루스택도 미리미리 틀어 놓도록 합니다.



그런데 위와 같은 에러가 떴습니다. 에러의 내용인즉, Unable to sigh application; please provide passwords! 라고 떴습니다. 이 에러의 내용은 PlayerSettings안에 들어가서 Keystore의 내용이 제대로 되지 않았다는 말입니다.



일단 Add Open Scenes를 눌러서, 제가 이전에 만들어 둔 Rank라는 씬을 띄워서, 이걸 만들도록 하고, 다음으로는 아래에 있는 Player Settings를 누르도록 합니다.



위 스크린샷에 나와 있는 것처럼, Keystore에 있는 암호를 입력해야 하며, 여기다가 Key의 패스워드도 지정을 해야만 합니다. 이런 작업을 끝냈다면, 안드로이드 앱으로 빌드할 수 있습니다.



일단 블루스택 내에서 제대로 실행이 된 것을 볼 수 있었습니다. 아직까지는 뭘 특별하게 입력한 것이 없기 때문에, 뭐하나 뜬느 것이 없는 것을 볼 수 있는데, 일단 실행은 하였습니다. 이제 제대로 데이터 베이스에 계정이 만들어 진 것은 맞는지 알아보기 위해서, 호스팅어로 접속해서 데이터 베이스 안으로 들어가 보겠습니다.


 

이전에는 없던 유저가 데이터 베이스에 추가된 것을 볼 수 있었습니다. 이것으로 어떻게 해서 랭크씬을 만들어서 실행하면, 웹 서버를 이용해서 유저의 데이터를 등록하는 것 까지 해보았습니다. 하지만 아직 배워야 할 것이 많다는 생각이 들길에, 다음 포스팅에서는 챕터9를 실습하고 그 내용을 포스팅 해 보겠습니다.

저작자 표시
신고

+ Recent posts

티스토리 툴바