Prosto

따라하는 유니티 2D 프로젝트ⓐ -2 본문

Programing/Unity 3D

따라하는 유니티 2D 프로젝트ⓐ -2

Prosto 2016. 9. 14. 03:20

 

따라하는 유니티 2D 프로젝트 강좌 두 번째 시간입니다.

이번에 다룰 내용은 저번에 만들었던 캐릭터 이동을 배경이동으로 전환시키고,

오브젝트 풀을 이용하여 정해진 수를 반복 사용하는 방법을 적용하여 해볼 것입니다.

(중요 : 프리팹 만들기/사용, Instantiate 오브젝트 생성, 배열과 구조체 사용 )

 

 

 

 

그럼 시작하겠습니다.

 

가장 먼저 저번에 작업했던 프로젝트를 실행합니다. 그리고 순서대로 직접 해보며 따라오시면 됩니다.

 

Scripts 하위에 Map이라는 폴더를 생성한 후 MoveMap 스크립트를 추가합니다.

 

 

MoveMap.cs에 소스를 작성하여 줍니다.

여기에서 Instantiate는 오브젝트 생성에 사용하는 함수입니다.

Instantiate(생성할 오브젝트, 생성될 좌표, 각도) 정보를 입력합니다.

 

그리고 추가적으로 줄을 그어둔 부분이 오브젝트 풀(Object Pool)을 위한 부분입니다.

오브젝트 풀이라는 것은 게임에서 사용할 오브젝트들을 미리 생성하여두고

실제 게임에서는 활성/비활성화 시켜가며 사용하는 방법입니다.

(이러한 방법을 쓰는 이유는 오브젝트를 생성할 때와 파괴(제거)할 때 비용이 크기 때문에 사용됩니다.)

오브젝트 풀이라고 특별할 것은 없고 미리 배열에 필요한 만큼 생성하고,

 필요할 때 tiles[i].SetActive(true); 필요 없을 때 tiles[i].SetActive(false); 하여 사용하면 됩니다.

 

 

Hierarchy 패널에 마우스 우측 클릭하여 새로운 Empty Object를 추가해줍니다.

해당 오브젝트의 이름을 GameManager로 변경합니다.

오브젝트의 이름 변경 방법은 두 가지 중 편한 방법을 사용하시면 됩니다.

1. 오브젝트를 더블클릭한 후 변경한다.

2. 오브젝트를 선택한 상태에서 F2를 눌러 변경한다.

 

 

GameManager를 선택한 상태에서

아까 작성해두었던 Scripts - Map에 있는 MoveMap을 드래그 앤 드랍해줍니다.

(저번에 1번 강좌에서 스크립트를 추가했던 방법과 같은 방법입니다.)

 

 

이번에는 프리팹을 만들어볼 것입니다.

일단 폴더를 새로 만들어 Prefabs라는 이름을 붙여줍니다.

 

원래 있었던 tile 오브젝트를 클릭하여 Prefabs에 드래그앤드랍해줍니다.

(폴더 이름은 상관없고 그냥 프리팹화 시키고 싶은 오브젝트를

드래그앤드랍으로 Project 탭으로 보내는 게 포인트입니다.)

 

 

이번에는 아까 작성했던 스크립트에서 타일을 받아 사용하기 위한 작업입니다.

먼저 Hierarchy 탭에서 GameManager를 선택한 후

Prefabs에 있는 tile을 MoveMap스크립트의 Tile 자리에 드래그앤드랍해줍니다.

 

 

이렇게 바뀌었다면 정상적으로 완료된 것입니다.

 

 

이제 과거의 타일들은 필요가 없어졌기에 지워줍니다.

오브젝트를 제거하는 방법은 선택 - 마우스 우측 클릭 - Delete

혹은 선택한 후 키보드의 Delete키를 이용하면 됩니다.

tile, tile (1), tile (2)를 선택하여 제거해줍니다.(쉬프트, 컨트롤 여러 개 선택 가능[윈도우와 같음])

 

 

제거가 완료된 모습입니다.

 

 

이제 한번 실행을 해봅시다.

오류 없이 정상적으로 실행이 되고,

Hierarchy 탭에 tile(Clone)이 세 개 추가된 것을 확인할 수 있습니다.

이때 보면 글자가 회색인데요. 이렇게 보이는 게 비활성화 된 오브젝트들입니다.

(아까 스크립트의 SetActive(false)때문입니다. )

 

 

게임 실행 중인 상태에서 해당 tile(Clone)들을 눌러 오브젝트를 활성화하면(밑의 네모칸을 누르면 됨)

우리가 아까 만들었던 타일과 같은 타일이 존재하는 것을 확인할 수 있습니다.

 

 

껐다가 다시 실행시켰습니다.

(지금까지 저와 똑같이 진행했다면 이부분은 안 해도 됩니다.)

이제 각각 위치값들을 확인하기위한 작업을 할 차례입니다.

볼이 알맞게 위에 올라가있어야 하기 때문에 블록을 이동시켜 Y값을 확인합니다.

 

해보니 적당한 Y값은 -5.1입니다.

 

 

이번엔 블록 간격을 확인하기 위하여 테스트해보았습니다.

 

블록1과 블록2의 간격은 81.9네요. (타일 하나 크기가 81.9라는 말)

 

 

이번에는 블록이 충분히 보이지 않는 곳으로 갔을 때 제거(혹은 바로 재사용)해주기 위하여

충분히 보이지 않는 위치를 찾습니다.

 

X : -60이네요.

 

 

그럼 이제 마지막으로 스크립트를 좀 더 좋게 바꿔주고 실행하면 됩니다.

따라서 작성하면 되고, 추가적인 부분은 번호를 달아뒀습니다.

1.struct.. tile에 사용될 구조체를 만들어줍니다.

gameobject, transform, bool, Vector3를 가지고있습니다.

(gameObject, bool active는 활성화 비활성화를 위하여 만들었었는데,

화면 밖으로 나가면 마지막 블록 바로 뒤로 붙이게 만들어서 필요가 없어졌네요..)

 

tranform은 position을 계속 바꿔줘야하기 때문에 넣었고,

pos는 위치 정보를 저장해두고 사용하기 위하여 넣었습니다.

gameobject.transform.position 같은 식으로 너무 잦게 참조하면 성능상 안 좋습니다.

 

위치변경에 자주 사용하기 때문에 별도로 transform을 받고,

position도 각각 가지고 있게 한 후 그 값만 변경하여 tf.position에 셋팅하였습니다.

 

2.구조체 배열을 만들었습니다. 오브젝트 풀이 확장되었죠.

아까 스크립트에서는 단순히 GameObject들만 배열로 되었지만

지금은 구조체 내부에 GameObject가 위치하고 있고

그 구조체를 배열화시켰습니다.(obj와 관련 정보 갖는 배열)

 

 

FixedUpdate 부분입니다. 현재 이동 관련 부분이죠.

고정 프레임마다 for문을 이용하여 타일들의 위치를 변경시키기 위한 소스죠.

1.아까 측정해둔 tileEndPoint를 기준점으로 놓고 그것보다 크면 위치 조정을 해줍니다.

2.반대로 tileEndPoint보다 작아졌다면(넘어갔다면) 가장 마지막 블록으로 위치시키는 작업을 해줍니다.

 

주석으로 설명이 있으니 나머지는 생략하겠습니다.

 

 

CreateTiles도 바뀐 것을 확인할 수 있습니다.

단순 GameObject[]에서 구조체[]로 바뀌었으니 설정해줄 것들이 늘어났을 뿐이죠.

GameObject를 만드는 방법은 똑같습니다.

 

마지막에 lastTileNum=2;라는 부분이 추가되었네요.

이 부분으로 현재 마지막 타일이 어떤 것인지 판단합니다.

(마지막 타일 뒤에 재활용 타일을 붙여줘야하기 때문..)

 

 

중간에 변경되기도 했고, 소스 코드도 길기 때문에 복사할 수 있도록 남기겠습니다.

 

 

이제 소스 코드 작성은 끝났고, 실행하기 전에

원래 사용하고 있었던 GameObject에 존재하는 PlayerMove(Script)에 체크를 해제해줍니다.

(이것도 비활성화로 실제 게임에서 작동하려면 별도로 켜둬야합니다. 추후 PlayerMove는 완전 제거)

 

 

그리고 1.GameObject는 현재 고정적인 위치에 있으니 GameObject 하위에 존재하던 main Camera도 밖으로 빼줍니다.

2.실행버튼을 눌러 게임을 실행해봅니다.

3.실제 게임화면에서 타일이 재활용되며 진행되는 모습을 봅니다...

 

이렇게 배경(현재는 타일만)의 움직임으로

캐릭터가 앞으로 나아가는 것과 같은 효과를 낼 수 있습니다.

특히나 런닝(or 2D 레이싱)게임에 적합하겠죠?

 

 

 

지금까지 따라하는 유니티 2D 프로젝트ⓐ -2번 강좌를 보셨습니다.

이번에 많은 것들을 해봤습니다.

프리팹 생성부터 실제 게임 중에 오브젝트 생성, 또한 오브젝트 풀, 구조체, 배열 사용 등등.

장애물까지 넣으려고 했지만 새로운 것들도 많았고, 그래서 생각보다 작업하는데 많은 시간이 걸렸습니다.

그래도 이제 움직임이 있으니 게임 같아지기 시작했네요. 강좌를 지날 수록 더욱 게임 같아질 것입니다.

 

 

다음 유니티 2D 프로젝트ⓐ의 세 번째 강의에서는..

장애물을 추가하고,

볼에 간단한 점프기능을 넣어볼 것입니다.(일단 화면 클릭시 점프하도록 예정)

 

 

그 프로젝트를 진행하며 새로운 것들에 대해서는 지금처럼 또 설명하며 진행하도록 하겠습니다.

 

 

궁금한 점 있으시면 댓글이나 따로 메일로 질문하시면 시간되는 대로 답변드리겠습니다. ( 연락 )

 

 

Comments