Prosto

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

Programing/Unity 3D

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

Prosto 2016. 9. 16. 04:41

 

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

이번에 다룰 내용은 저번에 구현했던 배경이동에 이어 장애물을 업그레이드(강화)하는 작업을 하겠습니다.

지금 그대로라면 게임이 너무 단순하고 루즈하죠.

이러한 부분을 해결하기 위해서는 플레이어가 집중하며 플레이할 수 있게끔 요소를 배치해줘야 합니다.

 

 

 

 

그럼 시작하겠습니다.

 

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

 

장애물이 다양한 크기로 등장할 수 있도록 셋팅하는 작업을 먼저 하겠습니다.

(이전 프로젝트를 실행한 모습 - 콘솔창은 제가 테스트로 실행을 해봤기에 충돌 문구가 있습니다.)

 

 

기존의 스크립트를 변경하기 위하여

Scripts - Map - MoveMap을 더블클릭하여 실행시켜 줍니다.

 

 

MoveMap에서 해당부분을 추가해주세요.

구조체에 public ObstacleInfo info;를 추가한 것은

저희가 예전에 만들어두었던 스크립트를 참조하기 위하여

미리 해당 스크립트를 등록해두려고 추가했습니다.

(그렇지 않으면 매번 찾아가서 참조해야하기에 미리 받아둠(오브젝트 풀이니까))

 

 

해당 부분에 또 추가해줍니다.

저희가 예전에 만들었던 CreateObss 함수가

장애물을 오브젝트 풀로 만들어 사용하기 위한 부분이였죠?

그 부분에 새로 추가한 장애물정보 info를 받는 것입니다.

 

여기서 이제 새로운 중요한 게 나왔네요. GetComponent!

GetComponent는 말 그대로 컴포넌트를 얻기 위한 함수입니다.

여기서는

obss[i].obj.GetComponent<ObstacleInfo>(); 형태로 사용되었는데요.

기본형은 '게임오브젝트'.GetComponent<'컴포넌트'>(); 입니다.

 

제가 받아오고 싶은 컴포넌트를 가지고 있는 게임 오브젝트가 obss[i].obj였고

그 컴포넌트의 종류가 스크립트였기에

Getcomponent<ObstacleInfo>()로 끝난 것입니다.

 

만약 SpriteRenderer를 가지고오고 싶었다면?

obss[i].obj.GetComponent<SpriteRender>();로 사용하면 되겠죠?

 

 

다음으로 AddedObs 부분에도 추가하여 줍니다.

여기서 보면 'obss[i].info.SetObstacle(Random.Range(0, 9)'이 부분이 가장 중요한 부분입니다.

obss[i].info는 아까 받아두었던 스크립트고

그 하위의 SetObstacle()함수를 호출한 거죠?

 

이 SetObstacle(int val) 함수가 어디에서 나타났냐 하면

우리가 저번에 작업했을 때 만들어두었답니다.

바로 아래 스크립트의 함수죠.

(public으로 선언해야 참조하여 사용할 수 있답니다.)

height(높이값을) 어떻게 설정해줬는지 확인할 수 있고,

그 height를 가지고 실제 게임오브젝트에 어떻게 반영했는지 볼 수 있죠?

( transform.localScale을 변화시키면 게임오브젝트의 크기가 바뀝니다. )

자 이렇게 실행해보면

실제로 그 전과 달리 장애물들이 높이를 가지고 있는 것을 볼 수 있습니다.

 

 

이렇게 나온다면 이제 점프 높낮이도 필요하겠죠?

 

점프의 높이가 일정한 것이 아닌

다양한 높이 조절이 가능한 점프로 업그레이드 해봅시다!

스크립트를 수정해야 하기에

Scripts - Player - PlayerAction 순으로 접근하여 실행해주세요.

 

 

기존의 스크립트를 볼 수 있습니다.

여기서 몇 가지가 변경될 테니 아래의 스크립트를 참조하여 잘 바꿔주세요.

(아, 이번에 여기에 있던 Input.GetButtonDown("Jump")를 제거했습니다..)

 

먼저 Update() { } 뒤에 클래스 내의 전역변수 float checkTime을 선언해주시고

IEnumerator CheckButtonDownSec() 코루틴 함수를 작성해주세요.

(IEnumerator는 저번에 봤지만, 코루틴 함수 형식입니다.)

(yield도 저번에 봤죠? 다음 작업까지 스크립트를 쉬게하는 기능을 합니다.)

 

 

Update() { }의 내부 부분도 변경해주세요.

위의 소스 코드에도 표시했지만

GetMouseButtonDown(누름)과 GetMouseButtonUp(땜)을 이용하여

누르면 눌러지는 시간을 때기 전까지 측정합니다.

(땠을 때 JumpAction이 호출되는데 여기에서 처음에 jumpOn을 true로 바꾸죠?

코루틴에서는 jumpOn이 false일 때 계속 시간을 늘리고 있으니 서로 그렇고 그런 관계죠..?)

 

 

Debug.Log를 이용하여 체크되는 시간이 정확한지 확인했습니다.

밑에 tempJump에 보면

기존의 jumpPower에 checkTime을 곱하여줬죠?

이렇게 이제 점프 세기의 조절이 되는 것입니다.

참고로 점프파워 값도 재조정했습니다. (너무 커서..)

 

 

자 이렇게 실제로 실행해보면 기존의 고정 점프 높이와 달리

낮게도 점프가 가능하고

높게도 점프가 가능한 것을 확인할 수 있습니다.

 

그렇지만...

지금은 이렇게 점프를 오래 누르면 누를수록

하늘 높이 점프를 하는데,

이게 실제로 보여지는 맵을 한참 넘어서 날아가 버리니 문제가 있습니다.

 

이점을 바로 잡기 위하여 스크립트를 약간 추가해 줍니다.

(제약 조건만 주면 되겠죠?)

저는 JumpAction에서 점프 처리를 하기 전

checkTime이 의도한 시간을 벗어나면 재조정되도록 했습니다.

방법에는 여러가지가 있겠죠?

시간을 측정하는 부분에서 0.35초가 넘으면 더 이상 측정을 안 해도 될 테고요.

 

 

이제 이렇게 실행시켜보면

의도한 대로 적정 높이까지만 점프를 하는 것을 볼 수 있습니다.

 

이렇게 기존에 있던 기능을 강화시켜 봤네요.

이런식으로 게임을 만들 때

가장 가벼운 형태부터 차차 깊게 진행해가면

어렵지 않게 만들 수 있습니다.

그 단계가 높아지면 높아질 수록 더욱 고 퀄리티가 되는 것이죠.

 

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

이번 시간에는 스크립트를 수정해보고, GetComponent에 대하여 배웠습니다.

또, 버튼 입력에 대하여도 누르는 버튼과 때는 버튼이 있다는 것도 확인할 수 있었죠?

그리고 코루틴도 다시 사용해봤습니다..

 

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

이런 류의 게임에 있어 필수적인 요소인 점수를 넣어보겠습니다.(기본->카운팅)

그리고 가능하다면 애니메이션에 대하여 다뤄보겠습니다.

주말에 시간이 많이 없기에 혹시 애니메이션까지 안 된다면 그 다음 강의에는 넣도록 하겠습니다.

 

 

고생하셨습니다. 따라오며 하니 좀 도움이 되셨나요?

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

 

 

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

Comments