Prosto

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

Programing/Unity 3D

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

Prosto 2016. 9. 15. 03:27

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

이번에 다룰 내용은 저번에 배경이동에 이어 장애물을 구현하고

간단한 점프 기능을 구현하고 충돌체크를 해서 플레이어에게 알리는 처리까지 해보겠습니다.

(현재는 점프-장애물 첫 번째 단계입니다. 

 장애물 업그레이드, 점프 업그레이드를 더욱 고퀄로 바꾸는 작업은 다음 강좌에서 다룰 예정입니다.)

 

 

 

 

그럼 시작하겠습니다.

 

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

 

 

포토샵을 이용하여 장애물을 만들어줬습니다.(256x256)

 

 

저번과 마찬가지로 드래그 앤 드랍하여 유니티 프로젝트에 Image를 추가해 줍니다.

 

 

Generate Mip Map 체크 해제해주고, Sprite Editor로 들어가 피봇을 바닥에 맞춰줍니다.

 

 

저번과 동일하게 이미지를 누른 후 Hierarchy탭에 드래그 앤 드랍하여 오브젝트를 생성합니다.

 

 

새로운 스크립트를 작성할 차례입니다.(폴더 생성 -> C# 스크립트 생성)

(기본적인 정보와 해당 장애물이 처리할 내용을 가지고 있어야 합니다.)

 

 

스크립트를 작성합니다.

음.. 여기는 굳이 추가 설명할 부분이 없군요..

 

 

아까 생성해뒀던 Hierarchy의 obstacle을 누른 후 작성한 스크립트를 드래그 앤 드랍하여

컴포넌트를 추가해줍니다.

 

 

프리팹 생성 과정입니다.

해당 오브젝트를 누른 후

프리팹 폴더에 드래그 앤 드랍해주세요.

 

 

그리고 파란 글씨로 바뀐 Hierarchy 탭의 obstacle은 제거해줍니다.

(Delete키 누르면 제거)

 

 

이번에는 장애물이 움직이게 만들기 위하여 추가 작업을 할 차례입니다.

예전에 만들어두었던 MoveMap 스크립트를 실행합니다.

 

 

해당되는 부분을 새로 추가합니다.

여기서도 구조체를 이용하여 장애물구조체를 만들었고,

마찬가지로 오브젝트 풀로 관리합니다.

 

 

장애물 추가하는 부분입니다.

블록(타일)을 만들던 것과 비슷하죠?

장애물은 돌아가며 필요할 때 사용할 예정이기에

처음에 생성 후 비활성화해줍니다.( SetActive(false) )

 

 

Awake() 부분에도 CreateObss();를 추가하여

게임 시작 시 장애물 오브젝트 풀이 잘 만들어질 수 있도록 위치시키면 됩니다.

 

 

GameManager를 선택하여 MoveMap(Script)에

새로 생긴 Obstacle 영역에 이번에 만든 프리팹을 드래그 앤 드랍하여 줍니다.

 

정상적으로 추가된 모습입니다.

 

 

그리고 게임을 실행해보면 obstacle(Clone)들이 잘 생성되어있는 것을 확인할 수 있습니다.

 

 

그리고 이번에는 그 장애물들을 실제로 움직이도록 하기위한 작업을 할 것입니다.

MoveMap 스크립트를 켜주세요.

 

AddedObs 부분은 해당되는 타일 번호를 받아 그 위치에 장애물을 생성하기 위한 함수입니다.

지금은 장애물이 타일의 중앙에 하나만 생성되도록 하였지만

조금만 수정하면 2개 3개 혹은 위치 조정 등이 가능합니다.

 

여기서 새롭게 볼 수 있는 부분은

~.transform.SetParent(tiles[tileN].tf);입니다.

SetParent는 부모를 설정하는 함수입니다.

이 함수를 이용하여 트랜스폼의 부모를 설정해주면

게임 진행중 Hierarchy 탭에서 상위 하위 관계가 변화하는 것을 볼 수 있습니다.

 

타일을 부모로 만드는 이유는

타일이 이동할 때 장애물도 같은 속도로 이동하게 하기 위함입니다.

이렇게 부모 설정만으로 장애물을 따로 이동시킬 필요가 없어졌습니다.

 

 

DeleteObs(int tileN)은 타일이 필요 없어질 때 제거(비활성)하기 위한 함수입니다.

보면 DeleteObs 함수가 호출되면서 현재 제거되는 타일 번호를 알려줍니다.

그러면 이 함수에서는 장애물들 중 현재 활성화되어 있는 것을 찾아

그 장애물의 부모 번호가 제거되는 타일 번호와 일치하는지 확인합니다.

여기서 일치하면 - 부모를 없는 상태로 바꾸고, 비활성화시킵니다.

(주석에 달아놓았듯이 장애물들을 관리하는 상위 Object가 있다면 해당 자식으로 바꿔줘도 됩니다. [Hierarchy가 깔끔함])

 

 

Delete와 Added의 사용되는 위치입니다.

Delete는 사실 Added 전에만 선언되면 문제 없습니다.

 

하지만 Added는 타일의 위치값이 바뀐 후에 지정해야 합니다.

이것보다 늦게하는 경우 자식 상속되며 타일은 따로 또 이동하여

멀리 떨어진 곳에 생성되는 것을 볼 수 있습니다....

 

 

그리고 스크립트를 저장하고 게임을 실행해보면

정상적으로 장애물들이 생성되어 타일과 같은 속도로 오는 것을 볼 수 있습니다.

(Hierarchy 탭에서 tile 하위로 들어가있는 것도 보이시죠?)

 

 

이번에는 충돌체크를 해주기 위하여 아까 만들어두었던

ObstacleInfo 스크립트를 다시 켜줍니다.

(장애물에서 충돌체크)

 

해당 부분을 추가합니다.

여기서 잠깐 Debug.Log()는 유니티 화면의 콘솔에 출력을 위한 기능입니다.

디버깅할 때 아주 유용하게 사용됩니다.

진행 중 확인하고 싶은 부분이 있다면 Debug.Log로 확인해보는 것도 좋습니다.

 

그러면 이어서..

OnTriggerEnter2D는 2D 충돌체크이며

트리거가 들어오면 충돌을 알려줍니다.(알려준다기 보다는 해당부분 실행해줌)

또, OnTriggerEnter를 사용하기 위하여는 몇 가지 추가해줄 컴포넌트들이 있습니다.

아래를 스크린샷을 보고 추가해주세요.

 

 

obstacle에 Box Collider 2D를 추가해줍니다.

박스형태의 충돌체크를 하는데 사용합니다.

 

 

Is Trigger를 활성화해주세요.

해당 오브젝트를 트리거로 사용하여 충돌체크를 하겠다는 것입니다.

체크를 해주지 않으면 정상적으로 작동하지 않습니다.(충돌 확인 안 함)

 

 

아 여기서 잠깐, 저희의 주인공인 Ball입니다.

지금까지 이름을 GameObject로 두었는데 이제 이름을 바꿔주고 가도록 합시다.

 

저번에 만들어뒀던 스크립트도 우클릭 후 제거해줍니다.

 

자 그럼 이제 Ball에서 추가해줘야 하는 부분입니다.

충돌체크를 할 때 충돌 체크를 받는 쪽에서는 Rigidbody가 있어야 합니다.

Ball에 마찬가지로 rigidbody 2D를 검색하여 추가해줍니다.

 

 

Is Kinematic도 체크하여 활성화해줍니다. 해제할 경우 유니티에서 기본적으로 제공하는 물리엔진이 사용되므로

우리가 하려는 작업과는 다릅니다.(유니티 물리를 이용하여 게임 만들 때 사용.)

(유니티 버전이 달라 내용이 다른 경우 Rigidbody 설정 중 Kinematic 사용, Simulated 체크해주세요!)

 

 

그리고 마찬가지로 콜리더를 추가해 줍니다.

작은 박스로해도 관계없지만

동글동글한 Circle Collider 2D로 추가하여 줍시다.

 

 

그리고 모두 추가한 후 게임을 실행해보면

정상적으로 충돌 시 Console에 메시지가 나오는 것을 확인할 수 있습니다.

우리는 Debug.Log("충돌 : " + col.name);르로 했었는데요.

충돌 대상이 Ball로 제대로 충돌 대상도 맞다는 것을 알 수 있네요.

 

 

새롭게 PlayerAction 스크립트를 추가하여 줍니다.

우리는 이제 저 박스 충돌체(장애물)를 피하기 위하여 점프를 만들 것입니다.(일단 간단하게)

 

 

Update() 내의 1번을 보면

Input.GetMouseButtonDown(0)과

Input.GetButtonDown("Jump")를 볼 수 있습니다.

 

Input.GetMouseButtonDown(0) = 마우스 좌클릭 입력이 왔는지 확인하는 것이고,

Input.GetButtonDown("Jump") = 스페이바를 눌렀는지 확인하는 것입니다.

 

특정 버튼을 인풋을 추가하거나 바꾸거나 확인하고 싶다면

Edit - Project Settings - Input 부분으로 들어가보시면 됩니다.

 

2번은 코루틴을 이용한 부분입니다.

점프를 코루틴을 이용하여 만들었습니다.

점프가 시작할 때 y축 값을 증가하며 시작하고

그 y축 값이 최고점을 찍었다가 내려오며 0 지점에 도달하면

점프 함수가 종료되는 형태로 구성되어 있습니다.

마지막엔 y축 pos를 0으로 제대로 맞춰주고 종료해야 합니다.

 

 

그리고 실행해보면 실제로 게임답게 잘 진행되는 것을 확인할 수 있습니다.

이제 점프와 충돌이 추가되었으니 가장 기본적인 틀은 잡혔네요.

 

(참 작업 중 유니티에서 ctrl + s를 눌러 씬 저장도 가끔씩해주세요. 가끔 날아가는 경우가 있습니다..(씬 작업 내용이....))

 

 

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

이번 시간에도 새로운 많은 것들을 직접 써볼 수 있었네요.

충돌 체크, 장애물 구현, 점프(중력스러운) + 코루틴 등 차근차근 배우고 있습니다.

 

 

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

지금 구현되어 있는 장애물과 점프 기능을 강화하는 작업을 해보겠습니다.

가능하다면 그 외 추가작업까지 같이 진행하여 올릴 수 있다면 좋겠네요.

 

그럼 프로젝트의 다음 단계를 진행하며 새로운 것들에 대해서는 지금과 같이 설명하며 진행하도록 하겠습니다.

 

 

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

Comments