2016년 7월 12일 화요일

Unity 5로 간단한 2D 터치 게임 만들기

안녕하세요? 유결입니다.
 야미야미가 만들 게임의 프로토타입을 Unity로 간단하게 제작해 보도록 하겠습니다. 간단하게 연습삼아 만든 프로토타입이고 디테일은 생략된 부분이 있으니 참고해주세요^^;

 먼저 게임에 대해 설명드리면, 파란색과 검은색 블럭들이 랜덤하게 생성되고, 하단에 두개의 UI 버튼을 클릭해서 블럭을 없애는 게임입니다. 라인 가장 아래 블럭(1층) 중 파란색 블럭만 제거 할 수 있으며, 블럭을 제거하면 왼쪽과 오른쪽 가장 아래 1층 블럭이 양쪽 모두 사라집니다. 파란색 블럭을 제거하면 score 100점을 획득하고, 검은색 블럭일 때 버튼을 누르면 score 100점을 잃습니다.



 먼저 Unity 2D 프로젝트를 생성합니다. 저는 세로모드로 게임을 만들었기 때문에 아래 그림과 같이 Game 뷰에서 1440x2560으로 해상도를 바꿨습니다.





다음으로, Main Camera의 속성 중 Far을 100으로 설정했습니다. 해상도나 Main Camera 시야 거리는 제작하시는 분이 적절하게 설정하시면 됩니다.




UI Button을 만들어 보겠습니다. Hierarchy 에서 마우스 오른쪽 클릭으로 UI > Button을 클릭해서 생성합니다.




왼쪽과 오른쪽 버튼 두개를 만들고 위치를 적절하게 배치해줍니다.




 이번에는 Hierachy에서 마우스 오른쪽 클릭으로 2D Object > Sprite를 클릭해서 Box를 만들고 버튼을 만들고, 박스가 너무 작아서 Scale 속성을 (7,7,1)로 설정했습니다. Sprite Renderer 에서는 기본으로 제공되는 Sprite 이미지를 사용했습니다.
Box가 너무 많아서 생성 과정 캡쳐는 생략하겠습니다. Box를 모두 생성하고 적절히 배치해준 후에, Boxes_R과 Boxes_L를 parent object로하고 각각 오른쪽과 왼쪽 box object들을 child로 집어넣었습니다. (사실 여기서 하위 오브젝트로 집어넣은 부분은 큰 의미는 없고 위치 조절을 편하게 하기위해 묶었습니다^^;) Boxes_R과 Boxes_L을 다시 Boxes의 child로 설정했습니다.




이번에는 UI text를 만들어 보겠습니다. Hierachy에서 마우스 오른쪽 클릭으로 2D Object > Text를 선택합니다.




Text Object 두개를 생성해서 하나는 Score_Text, 다른 하나는 Score_Value로 이름을 변경하고 폰트와 색깔을 변경해 줍니다. (폰트는 기본 제공이 아니므로 .ttf 파일을 따로 다운 받아서 사용하세요! 저는 폰트를 Assets 폴더 하위에 Font에 저장해 두었습니다.)




이제 Score_Value에 Script를 추가해보겠습니다. 여기서 Script를 추가하는 이유는, 점수를 획득할 때 Score_Value 값이 변경되는 것을 Script로 구현하기 위해서 입니다. (Score_Value에 Script를 추가하는 방법 외에도, 다른 object으 script에서 Score_Value를 참조해서 변경해주는 방법도 가능합니다. 여기서는 Score_Value에 직접 Script를 추가해보겠습니다.)
Add Component로 Score 스크립트를 생성합니다. (아래 캡처 이미지에서는 미리 생성되어 있습니다.)




자 이제 별거 없지만 코딩해보겠습니다. Unity의 UI Text를 사용하기 위해 먼저 
using UnityEngine.UI 를 추가해줍니다.
public float type으로 value를 선언 및 초기화 해주고, private Text type으로 scoreValue를 선언합니다. Awake() 내에서 scoreValue에 GetComponent<Text>()의 반환 값을 저장합니다. GetComponent<Text>를 사용하면 현재 object의 component인 Text를 얻어온다는 의미가 되겠습니다. 
Update() 함수는 계속 호출되는 함수로, scoreValue를 지속적으로 업데이트 해줍니다.
scoreValue.text에 public으로 선언했던 value를 string.Format() 함수를 통해 string type으로 업데이트 해줍니다.




이제 UI 준비는 끝났습니다. 이 게임의 동작을 위한 script를 Boxes에 추가합니다.



추가한 스크립트 내용중 변수를 선언하는 일부분을 보겠습니다. 아래와 같이 public GameObject 배열로 bxs_R과 bxs_L을 선언 했습니다.



 위의 script에 public으로 변수를 선언하면 아래와 같이 Unity Inspector 뷰에서 속성이 나타납니다. 오른쪽 상단에 자물쇠 표시로 해당 Inspector를 고정하고, Hierarchy의 Boxes_R 하위 Box0~11 과 Boxes_L 하위 Box0~11를 드래그해서 Bxs_R과 Bxs_L에 각각 내려놓아 참조시켜줍니다.




이제 전체 Script를 보도록 하겠습니다. 가독성과 효율성을 고려안하고 연습삼아 작성한 코드라 부끄럽네요... ^^;

참고로 Score object를 생성하고, 아까 위에서 만들었던 Score script의 public으로 선언한 value를 변경해주는 부분을 잘 봐주세요. 

아래 코드 중 햇갈릴 수 있는 부분이 Box의 position과 참조를 swap하는 부분인데, 이 부분은 그림을 직접 그려보시면 쉽게 이해할 수 있으리라 생각합니다!



자 이제 코딩은 끝났습니다. 왼쪽 버튼(LButton)에  Button Component를 보시면 On Click () 속성을 보실 수 있습니다. On Click () 은 해당 버튼을 클릭시 발생하는 이벤트를 등록해주는 부분입니다. 여기에 Boxes object를 드래그해서 참조시킵니다.



참조가 되었으면, Function 부분을 클릭해서 boxes > LClicked() 를 선택해줍니다.
LClicked()는 위에서 다루었던 boxes script에서 만든 함수입니다. 해당 함수가 호출되면 Boxes_down() 함수가 호출되고, score가 변경되는 부분입니다.
마찬가지로 RButton에도 같은 작업을 해줍니다.




이제 플레이를 해주시면 됩니다~!




자료도 정리가 잘 안되어있고 복잡하지만 끝까지 읽어주셔서 감사합니다. (_ _)
깔끔하게 포스팅하는 법을 익혀, 앞으로 노력해보겠습니다.^^;




댓글 2개:

  1. 혹시 자료 받을 수 있을까요?
    wjdgus9991@naver.com

    답글삭제
  2. 안녕하세요! 대학교 게임 동아리 회장을 맡고 있습니다!
    게임을 만들어보고자 여러 블로그를 돌아다니다가
    올려주신 게임을 만들어보고 싶어서 댓글 남깁니다!
    수익 없이 저희끼리 공부하는 목적으로 만들어도 괜찮을까요?
    만들고 동아리원 끼리 대회도 열어보고 싶습니다.
    whfprl0920@gmail.com으로 메일 남겨주시면 감사하겠습니다

    답글삭제