Unity_본캠프

[내일배움캠프 17일차] Unity! Trigger!

전기연(Unity_9기) 2025. 4. 29. 22:49

1. 오늘의 할 일

오늘은 기본적으로 제공된 강의를 진행할 예정이다. 

어라, 사전캠이랑 1주차에 Unity 벌써 한 번 썼는데여. 라고 하기엔

저기서 우매함의 봉우리도 못 다가간 수준이므로 얌전히 듣도록 하자.

아는 건 복습하고 안 그래도 하고 싶은데 못 쓰는 기능이 수두룩하다.

 

2. 강의 내용 복습

오늘의 강의 총정리

 

우리에게 익숙한 류의 게임이다.

앞으로 진행하면서 장애물을 피하고, 위나 아래에 부딪히면 끝나는 게임.

오르락내리락 오르락 내리락 하니까 별로 어렵지 않을 것 같고, 실제로 그렇게까지 빡빡한 게임은 아니었다.

 

하지만 이번에 새로 알게된 것도 있다.

 

카메라 따라가기

 

지금까지 Unity로 만든 것은 '시점 고정형'게임이었다. (카드 뒤집기, 탄알로 몰려오는 적 막아내기 등)

보드게임을 기반으로 두거나, 그냥 화면 내에서만 움직이는 게임은 카메라를 움직일 필요가 없지만, 일반적으로 많이 하는 게임, 특히 player로 움직이는 개체가 '움직인다'면, 카메라가 움직이든 뒤의 배경이 움직이든 해야 사용자가 이동할 수 있음을 알게 된다.

그런 이유로 나는 뒷배경을 반복해서 움직이는 줄 알았는데, 사실 배경과 플레이어 전부가 같이 움직였다.

 

이렇게 길게 늘어놓은 것이, 플레이어가 움직이면서 차례대로 따라온다.

 

 

그것이 어떻게 가능한가?

카메라의 바깥에, 충돌을 감지할 수 있는 빈 개체를 만들었기 때문이다.

충돌을 위해 필요한 요소, Collider와, Rigidbody를 설치해주고, Trigger를 켰다.

해당 객체는 카메라의 자식으로 할당되어, 이동하면서 배경이나 장애물을 뒤따라 함께 지나간다.

이것들은 카메라의 '밖'에 있는 것이기 때문에, 충돌하더라도 갑자기 배경이 사라지는 일은 없다.

무한히 길어질 수 있는 게임에서 그 많은 배경을 제작자가 만들어낼 수는 없기 때문에, 지나간 배경을 다시 할당해주는 것이다.

 

Collider를 썼음에도 배경이 움직여서 밀리는 등의 물리 법칙이 없는 이유는 위와 같다.

처음 말했듯, 해당 객체에게는 'Is Trigger'를 켜두었기 때문이다.

사실 써보기 전까지는, Trigger? 음, 지나가면 뭔가 작동하게 만드는 건가? 하고 막연하게 생각했다.

(써놓고 보니 딱히 틀린 말은 아니었지만…정확한 개념은 몰랐다.)

 

Q. Trigger?

Collider가 붙은 각각의 요소가 붙으면, 물리 법칙에 의해 충돌한다. 

자동차랑 자동차가 맞붙으면 교통사고가 나는 것과 같은 것이다. 서로 부딪히고, 튕겨져 나간다.

하지만 IsTrigger를 켜둔 경우, 그저 해당 요소를 투과해서 지나간다. 즉, 충돌 범위에 '닿았는지' 확인하는 것이다.

일반적인 Collider를 켜둔 객체가 '자동차'라면, IsTrigger가 켜진 객체는 '감시카메라' 같은 것이다.

IsTrigger: 어, 쟤 지나갔다. (충돌감지) 사진 찍었지? (그에 따른 반응 반환)

 

하지만 감시카메라는 처음부터 있는 도로나, 새를 찍어도, 그것을 기록으로 삼지는 않는다. 그것은 '반환할 필요가 없는' 것이니까.

감시카메라가 포착하고 찍어야 하는 것은 '속도 위반을 한'차량이다. 즉, '특정요소'만 골라서 반응을 줘야한다. 

아마 카메라에도 그러한 속도 감지 시스템 등, 요소를 '걸러낼' 방법을 가지고 있을 것이다.

 

우리가 사용하는 객체들도 그렇다. 뭐든 지나가면 OK 라면, 제대로 쓰기 힘든 도구다.

하지만 IsTrigger에도 같은 역할이 있다. C#스크립트에서 코드를 작성하면 된다.

Unity에는 'Tag'라는 요소가 있다. 혹은 동일한 것들만 사용한다면, 오브젝트 그 자체를 지정해도 된다.

아무튼 방법을 요약하자면 다음과 같다.

1. 각 요소, 즉, '충돌을 감지해야할 요소'에 'player'태그, 'BackGroud'태그 등 필요한 태그를 붙여둔다.

2. Trigger 판단을 할 요소에 붙인 스크립트에 OnTriggerEnter(통과하면)/Exit(나가면)/Stay(머문다면)를 원하는 타이밍에 맞춰 함수를 만든다.

3. 해당 함수에, if문 등을 활용하여, 해당 범위를 통과/나간/머문 객체가 player/BackGround 태그를 가진 것이라면, 그에 따라 원하는 실행코드/함수를 넣는다. (음악 재생, 배경의 변화 등)

 

활용: 이번 프로젝트처럼 플레이어의 이동에 따라 반복해서 배경을 불러오는 것, '특정 지점'을 지나갔을 때 배경음이 바뀌는 것(필드 배경음>마을 배경음) 등.

 

3. 내일 할 일

오늘 한 일은 생각보다 간단한 게임 제작이었다. 스크립트의 양도 많지 않고, 가볍다면 가벼운 게임.

그런데 이걸 '가볍다'고 느낄 정도가 되었다는 건 어느정도 코드를 읽을 수 있는 상태...는 된 모양이다.

이번에 이곳에 작성한 것은 앞으로도 사용할 일이 많을 것 같다는 판단하에 쓴 것이기 때문에, 나중에라도 도움이 되었으면 좋겠다.

 

내일은 Stack이라는 게임을 우선 따라 만들고, 개인 프로젝트의 가장 기본 골조를 만들어 볼 예정이다.