Prosto

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

Programing/Unity 3D

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

Prosto 2016. 10. 6. 16:40

 

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

 

이번에 함께 할 작업은 블록을 실제로 사용할 때 필요한

충돌하고 볼이 튕겨나가는 효과를 만들어보겠습니다.

그리고 간단하게 볼이 블록과 충돌하면 블록이 사라지도록 하겠습니다.

(이번 시간까지 하면 볼과 블록의 가장 기본은 끝입니다. 실제 블록 제거도 되니까요.

 

 

 

그럼 시작하겠습니다.

 

 

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

 

 

실행하니 이렇게 저장된 씬이 나오셨죠?

진행하도록 하겠습니다.

 

이번에 블록과 볼이 충돌하면 통과되지 않고, 튕기는 처리를 해줘야하니

일단 스크립트를 바꿔줘야합니다.

Scripts - Ball에 있는 MoveBall 스크립트를 더블클릭해주세요.

 

public 형태로 함수를 만들어 외부에서 참조할 수 있도록

void TurnTheBall(int type) 함수를 만들었습니다.

이 함수를 이용해 x축이나 y축의 방향 반전을 할 수 있도록 만듭니다.

(벽에 닿아 회전할 때 쓰였던 moveValue.x *= -1;이죠?)

 

다음으로 Scripts - Block에 있는 BlockInfo 스크립트를 더블클릭해주세요.

(혹은 스크립트 상위탭에서 BlockInfo를 눌러 바꿔도 됩니다.)

 

 

변수 선언부분과, Awake() 부분입니다.

그대로 따라서 입력해주시면 됩니다.

 

여기서 static float ballRadius - 1.2f; 부분이있죠>

일단 ballRadius는 볼의 크기입니다.

기본 크기는 1.2이니 이 값을 가지고 있어야합니다.

그런데 여기서 static이라고 한 이유는 뭘까요?

(자세한 얘기는 저번 프로젝트ⓐ에서 했지만.. 간단하게 말하자면

static은 공용 변수로 만드는 것입니다. 블록이 여러 개여도 이 변수는

다 함께 공유되는 거죠.)

 

그리고 Awake() 함수 부분을 보니

BoxCollider2D tempCol = gameObject.GetComponent<BoxCollider2D>();

이 부분있죠?

나눠서 한번 볼까요?

BoxCollider2D 이 부분은 자료형과 같다고 보시면 됩니다.(구조체지만요)

int num;으로 선언하는 것과 같습니다.

 

tempCol 이건 변수 이름이죠?

 

다음으로 gameObject.GetComponent<>();

gameObject = 현재 이 스크립트가 있는(실행시킨) 오브젝트입니다.

. 으로 하위 항목에 접근하죠.

GetComponent<>();는 컴포넌트를 얻겠다는 얘기입니다.

우리가 Hierarchy 탭에서 ball이나 block 같은 어떤 오브젝트를 선택하면 우측의 Inspector창에

여러가지가 나오죠?

(Tranform(위치,크기,각도 정보), Sprite Renderer, 충돌체, 스크립트 등..)

이런게 모두 컴포넌트입니다. 그런 것들 중 어떤 것을 얻어오겠다는 거죠.

 

그럼 그 컴포넌트가 뭔지도 알려줘야겠죠?

그 부분이 <> 안에 들어가야 할 부분입니다.

우리는 박스콜리더2D를 가지고오고 싶으니

GetComponent<BoxCollider2D>();가 된거죠.

 

 

(이 이미지는 클릭하시면 확대됩니다.)

(+ Awake(){}가 끝난 부분 바로 뒷부분입니다.)

 

CheckCollisionSide라는 함수를 만들어서

어떤 면에서 충돌이 이루어졌는지 확인하고 있습니다.

기본적으로는 각 면+볼의 반지름을 통해서 충돌면과 가장 가까운 게 어떤 것인지 찾는 겁니다.

그걸 토대로 좌,우,상,하를 구분지어주고있죠.

(여기에서 사용된 값들은 충돌할 때 받도록 해뒀습니다.)

 

 

마지막으로 OnTriggerEnter2D(Collider2D col) 부분입니다.

저번에는 Debug.Log로 충돌이라는 텍스트만 출력해줬었죠?

이제 이 스크립트를 추가해줘서 실제로 충돌 시

볼은 다른 방향으로 튀어나갈 겁니다.

 

여기서 col은 현재 이 함수가 불리게 된... 충돌된 대상입니다.

그 콜리더를 토대로 transform(위치,크기,각도) 정보를 가지고 오거나,

그 gameObject 자체를 가지고 오거나, 스크립트 등을 얻어오거나

모두 가능하겠죠?

 

if / else 부분을 보면

col.gameObject.GetComponent<MoveBall>().TurnTheBall(1);

아까 만들어둔 MoveBall 스크립트의 TurnTheBall()함수를 사용했습니다.

1이면 x축, 2이면 y축이 반대로 바뀌는 거였죠?

 

 

그러면 다시 블록을 적당히 잘 부딪힐 위치에 맞춰주고

실행해봅시다.

 

실행해보면 실제로 이제 블록에 볼이 충돌하면

그대로 관통하지 않고

튕겨 나가는 것을 확인할 수 있습니다.

 

그럼 테스트로 여러 개가 있어도 작동을 올바르게 하는지 확인해볼까요?

 

Block_prosto를 하나 선택한 후

복사 붙여넣기를 해줍니다.

ctrl+C

ctrl+V ctrl+V ctrl+V ctrl+V ctrl+V ctrl+V

 

 

그리고 이렇게 적당히 화면 여기 저기에 놓아줍니다.

테스트 해야하니 겹쳐있으면 안 되겠죠?

(씬에서 w키를 누르면 화살표가 생겨나고 그 후엔

Scene탭의 오브젝트를 드래그해서 이동시킬 수 있습니다.)

 

 

실제로 이렇게 실행해보니

모든 충돌이 정상적으로 처리되고

올바른 방향으로 가는 것을 확인할 수 있습니다.

(지금은 단순하게 45도 각도로만 가지만 나중에 이 부분은 업그레이드 하면 됩니다.)

 

그러면 이제 충돌 처리는 바람직하게 됐습니다.

 

태그(Tag)를 추가해줘서 올바른 대상이 충돌되야만

처리가 되도록 수정해줍시다.

 

먼저 Hierarchy 탭에서 ball_prosto를 선택해줍니다.

 

 

그리고 Inspector탭에서 Tag옆의 Untagged를 클릭합니다.

그리고 가장 밑의 Add Tag를 선택해주세요.

 

 

그러면 Inspector탭이 이렇게 바뀔 겁니다.

Tags 우측 하단의 + / - 버튼을 통해 추가하거나 제거할 수 있습니다.

'+'를 눌러 Tag를 하나 추가해주세요.

이름은 Ball이라고 했습니다.

 

같은 방법으로 하나 더 추가해주고

이름은 Block이라고 합시다.

 

 

그러면 만든 태그를 적용해줘야겠죠?

Hierarchy 탭에서 ball_prosto를 선택하고

Inspector 탭에서 Tag 옆의 Untagged를 누른 후

Ball을 선택해줍니다.

 

 

블록들도 마찬가지로 적용하기 위해서

블록들을 모두 선택(쉬프트 처음-끝, 컨트롤로 하나하나)하여

Inspector 탭에서 Untagged -> Block으로 변경해줍니다.

 

 

 

실제로 스크립트에서 if문을 하나 추가하여

충돌한 물체의 tag를 비교해봅니다.

 

col.CompareTag("Ball");을 통하여 충돌체의 태그가

Ball과 같은지 확인합니다.

 

(비슷한 방법으로 col.tag == "Ball";이 있습니다만

유니티에서 CompareTag를 더 추천하고 있습니다.)

 

 

 

그리고 실행해보면 정상적으로 작동하는 것을 확인할 수 있겠지만,

마지막으로 테스트를 위해 하나 더 추가해주고 확인해봅시다.

 

밑에 표시한 부분에 gameObject.SetActive(false);를 추가해주세요.

 

gameObject는 현재 스크립트가 동작 중인 객체를 얘기합니다.

(이 스크립트를 가지고 있는 블록이겠죠?)

그 하위에 있는 SetActive라는 함수를 사용하겠다는 얘기입니다.

이 SetActive 함수는 false일 때는 객체를 비활성화,

true일 때는 객체를 활성화해줍니다.

(비활성화 시 스크립트나 모든 것이 동작 안 합니다.

(씬, 게임 화면에서도 사라지고요. 하지만 제거된 상태는 아닌 비활성화된 상태입니다.))

[ Scene에서 완전히 제거를 원하면 GameObject.Destroy(gameObject); ]

 

 

이제 실제로 실행해보면 작동을 확인할 수 있습니다.

SetActive(false)가 되니, 일단 게임 화면에서 사라지겠죠?

 

 

이렇게 충돌하면 블록이 없어지는 것을 확인할 수 있습니다.

그리고 우측의 Hierarchy 탭을 보면

비활성화가 되면 이름이 회색으로 옅어지는 것을 확인할 수 있습니다.

(이렇게 Hierarchy 탭에서도 활성/비활성을 구분할 수 있습니다.)

 

 

 

 

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

이번 시간에 실제 충돌 시 볼의 처리를 해줬고,

볼이 블럭과 충돌하면 제거되는 듯한 모습도 보여줬습니다.

 

다음 시간에는 블록들을 씬에 배치하는 작업을 해보겠습니다.

(일단 가장 기본적인 블록깨기(벽돌깨기) 게임 형태를 만들어야겠습니다.)

 

 

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

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

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

 

 

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

Comments