Prosto

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

Programing/Unity 3D

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

Prosto 2016. 10. 12. 23:44

 

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

 

이번에 함께 할 작업은 볼과 블록에 정보(수치)를 주고,

해당 값으로 피해(데미지)를 주거고 체력이 없을 때 블록이 제거되도록 하겠습니다.

그리고 볼이 일정 조건에 제거되도록 하겠습니다. (지금은 일단 벽돌깨기 처럼 하단으로 가는 경우)  

 

 

그럼 시작하겠습니다.

 

 

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

 

실행하면 이렇게 화면이 나오겠죠?

 

먼저 각 객체(게임오브젝트)에 특정 값을 주고 해당 값으로 작용할 수 있도록 해줍시다.

 

그럼 볼에 정보를 두기 위한 스크립트를 만듭시다.

Scripts - Ball 폴더에서 우측클릭 후

Create - C# Script 순으로 선택해주세요.

 

 

이름은 BallInfo로 했습니다.

(기본 정보 + 기본 정보에 대한 처리를 해줄 스크립트입니다.)

 

 

체력, 데미지를 변수로 넣어준 후

Awake(최초 스크립트 실행 시)에서 각각 10과 1로 초기화해줍니다.

 

 

다음으로 Block 정보도 설정해볼까요?

Scripts - Block에 있는 BlockInfo 스크립트를 실행해주세요.

 

 

저번에 만들어뒀던 helathPoint 부분이 있죠?

혹 public이 안 붙어있다면

public int healthPoint;로 바꿔주세요.

 

 

void OnTriggerEnter2D(Collider2D col) 함수 위에

void GetDamage(int dam)이라는 함수를 추가해주세요.

 

체력을 감소시키는 처리와

체력이 0이하로 내려갔을 때는 0으로 처리

+ 게임 오브젝트를 비활성화시켜주죠?

 

 

그리고 마지막으로

void OnTriggerEnter2D(Collider2D col) 함수 sodp

gameObject.SetActive(false); 였던 부분을

 GetDamage(col.gameObject.GetComponent<BallInfo>().damage);

로 바꿔주세요.

그러면 GetDamage 함수를 실행시키며 인수로는

충돌된 게임 오브젝트(볼)의 BallInfo 스크립트의 damage를 가져오겠죠?

(public으로 만들어둬야 이렇게 바로 사용(참조)이 가능하답니다.)

 

 

이제 만들어둔 BallInfo 스크립트를 추가해줄 대상인

Prefabs - NormalBall을 선택해줍니다.

 

그리고 이렇게 NormalBall의 Inspector 탭 가장 아래에(Add Component 바로 밑 부분)

BallInfo 스크립트를 드래그 앤 드랍하여 추가해줍니다.

 

 

(추가되면 이런 모습을 확인할 수 있습니다.)

 

 

Prefabs - NormalBlock 프리팹도 선택하여

Health Point를 10으로 초기화시켜줍니다.

(public 값은 이렇게 변경시킬 수 있습니다.)

 

 

그리고 실행해보면

충돌했지만 사라지지 않는 것을 확인할 수 있습니다.

(데미지에 따라 피해는 입지만 죽진 않은 거죠.)

 

 

그리고 이렇게 Hierarchy 탭에서 볼 하나를 선택하여

데미지를 10으로 변경해보면

블록이 한 번에 부서지는 것을 확인할 수 있습니다.

(체력이 10이니 10-10으로 한번에 죽겠죠?)

 

 

(이렇게 정상적으로 데미지와 체력에 따라 블록 제거가 완성됐습니다.)

 

 

이제 볼의 개수도 한번 늘려볼까요?

 

Scripts - Ball - BallManager 순으로 선택하여 열어줍니다.

 

 

볼을 하나만 생성하던 때와 다르게 여러 개를 생성하게 됐으니

바뀔 것들이 있겠죠?

GameObject 하나에서 여러 개의 오브젝트 풀로 사용하기 위하여

생성된 볼의 수를 셀 변수, 전체 볼의 수, 그리고 게임오브젝트 배열을 선언했습니다.

 

 

Awake에서 이렇게

현재 볼 = 0개

최대 생성 볼 = 10개

그리고 normalBalls는 10개의 배열로,

반복문을 통하여 생성하고 비활성화를 반복했습니다.

(어느 부분이 바뀐 건지는 화살표를 보시면 됩니다.)

 

 

마찬가지로 바뀐 부분들은

화살표로 처리해뒀으니 확인해보시면 됩니다.

 

그리고 달라진 것은 원래는 활성화가 한번 되면 끝이니 bool 변수로 생성을 확인했지만,

지금은 최대 개수까지는 생성이 되기 때문에

 

볼을 하나 생성(활성화)할 때마다 nowBallCount를 1씩 증가시켜주고 있습니다.

 

 

Update에서 조건이 바뀌었죠?

 

if (nowBallCount < normalBallNum)

로 최대 수 전까지는 계속 생성이 되도록 했습니다.

 

 

이렇게 실행해서 해보면

계속 볼을 생성하고 날릴 수 있다는 것을 확인할 수 있습니다.

(현재 4개 생성 중 + 1개 생성 대기)

 

 

최대 수치이던 총 10개가 게임 화면에 있는 모습입니다.

 

(당연히 normalBallNum의 수치가 바뀌면 최대로 생성되는 볼의 수가 바뀌겠죠?)

 

 

이제 블록이 공격을 당했을 때, 공격 받았다는 표시를 좀 해줄까요?

 

가장 기본적인 맞으면 (검정계열)깜박이는 처리를 해주도록 하죠.

Block이 피격당할 때 처리할 내용이니

BlockInfo를 열어주도록 합니다.

 

그리고 이렇게 Color와 SpriteRenderer를 생성해주세요.

 

 

Awake()에서 필요한 SpriteRenderer를 받아오고

그 랜더러에 적용된 색을 기본 색상으로 받고,

기본 색상에서 r,g,b값을 -0.1씩 뺀 값을 피격색상으로 만들었습니다.

(기본으로 두고 색상 지정을 안 했다면 기본 색상은 흰색입니다. = Color.white)

 

(색상은 0~1까지의 숫자로 표현되며, 0이 없음 1이 최고(255)입니다.)

(예를 들어 파란색이면 Color(0, 1, 0)여야 겠죠?)

(또 예를 들어 200, 200, 200이라면 Color에 값을 넣을 때는

0.784f, 0.784f, 0.784f가 들어가야 합니다. - 200/255값)

 

 

이렇게 GetDamage에서 코루틴을 호출하고있죠?

체력이 0이하로 떨어졌을 떄는 깜박일 필요가 없으니

0이하가 아닌 경우만 코루틴을 호출하도록 합니다.

 

밑의 코루틴에서는

SpriteRender의 Color를 피격 색상으로 바꾼 후

0.1초 후 다시 원래 색상으로 바꿔 줍니다.

 

 

실제로 색깔 차이가 약간 나죠?

저 깜박이는 정도를 조정하려면

시간은 코루틴 WaitForSecond의 시간을 늘려주면 될 테고,

진하기의 정도라면

BeAttackedColor를 더 어둡게 바꿔주면 되겠죠?

 

 

이제 마지막으로 볼이 없어지는 경우를 추가해봅시다.

 

MoveBall 스크립트를 엽니다.

기본적으로 이렇게 생겼을 텐데

이쪽 부분을 바꿔줄 겁니다.

(원래대로라면 아랫면에 닿아도 튕겨나왔었죠.)

 

 

이렇게 바꿔줍니다.

(minPos.y에서 3f만큼 더 아래로 가면 없어지도록요.)

 

 

그리고 실행해보면 이렇게 맵 화면 아래를 벗어나면

없어지는 것을 확인할 수 있습니다.

 

 

그리고 모든 볼들을 다 아래로 보내니 활성화 된 볼이 하나도 없는 게 보이죠?

최대 생성 수였던 10을 모두 썼으니 추가 생성도 더 이상 불가능하겠죠?

 

 

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

이번 시간에는 블록과 볼에 정보를 넣어보고,

해당 정보(수치)들을 기준으로 데미지와 체력 처리를 해봤습니다.

또, 볼의 최대 생성 개수를 조절할 수 있도록 해봤습니다.

(간단하게 피해를 받으면 깜박이는 효과도 넣어봤고요.)

마지막으로 가장 기본적인 볼이 없어지는 조건도 넣어줬죠?

 

 

다음 시간에는 볼의 생존을 위한 부분을 추가하겠습니다.

기본적인 벽돌 깨기에서는 바 형태의 무언가가 받았었죠?

우리는 클릭과 관련 처리로 볼을 다시 위로 보내도록 합시다.

그리고 체력 게이지도 한번 만들어볼까요?

 

 

고생하셨습니다. 같이 따라하며 진행되니 어떤가요? 도움은 좀 됐나요?

그럼 프로젝트의 다음 단계를 진행하며 나오는 새로운 것들에 대해서는

지금과 같이 설명하며 진행하도록 하겠습니다.

 

 

 

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

Comments