[Unity] 셰이더로 큐브가 구체에 충돌한 것을 간단하게 표현해 보자

PublicMinsu·2024년 8월 26일
0

개요

저는 지난번에 사라지는 큐브가 점수와 연관된다는 것을 플레이어가 눈치채기 어렵겠다는 느낀 점을 작성했습니다. 사라지는 큐브에 어떠한 효과도 주지 않았기에 이러한 느낌을 받은 것이 아닐까 싶었습니다.
위 사진을 보시면 아시겠지만 원과 큐브가 충돌을 하더라도 아무런 효과를 주지 못합니다.

그렇기에 큐브가 구체에 충돌했을 때 간단한 효과라도 주는 게 어떨까 싶었습니다.

Screen Position과 Scene Depth를 활용한 방법

https://youtu.be/Uyw5yBFEoXo?si=iwcv9OwyEqi93lZA

가장 이상적인 방법이라고 생각했습니다.
하지만 가장 큰 문제가 있었습니다. 큐브가 구체에 충돌했을 경우만 고려하고 싶은데 큐브끼리 충돌하는 경우도 고려해 줘야 한다는 점입니다. 그래서 다른 방법을 생각해 봤습니다.

구체의 반지름을 활용하는 방법

원으로부터 얼마나 멀리 있어야 원의 위에 있다고 판단할 수 있을까요? 당연하게도 정답은 원의 반지름만큼입니다.

그렇다면 구체로부터 얼마나 멀리 있어야 구체와 충돌했다고 판단할 수 있을까요? 구체의 반지름 위에 존재하는 물체는 충돌했다고 판단할 수 있을 겁니다.

미리 보는 결과물

결과물부터 보여드리자면 이렇습니다. 구체를 기준으로 색깔이 변하는 것을 볼 수 있습니다.

셰이더 그래프

전체 셰이더 그래프입니다.

현재 월드 Position과 입력으로 들어온 CenterPostion을 기준으로 거리를 구합니다. CenterPostion은 구체의 중심으로 해주시면 됩니다. 그렇게 되면 구체의 중심으로부터의 거리가 구해집니다.

구해진 거리를 반지름과 오프셋을 빼준 값으로 빼줍니다. 만약 반지름과 오프셋이 고정된 값이라면 계산을 셰이더에서 해주는 것이 아니라 미리 해준 값을 직접 넣어주면 연산이 줄어들어 더 효율적이겠지만 의미를 분명하게 하기 위해 나누어 주는 것도 좋습니다.

반지름이 10이고 오프셋이 1이라면 현재 9를 기준으로 음수와 양수가 나누어질 것입니다.

음수인 값은 0으로 1을 넘는 값은 1로 제한해 주어서 이후 값을 활용할 때 1 이상의 값, 0 이하의 값이 1과 0을 유지하게 해줍니다. (1, 5, 10이어도 모두 1로 취급되기에 5를 곱했을 때 동일한 값을 출력함)

이후 두 갈래로 나뉩니다.
One Minus를 활용하면 0인 값은 1이 되게 하고 1인 값은 0이 되게 해줍니다. 이후 서로 다른 색을 곱해주면 Clamp의 값이 0일 때는 파란색 1일 때는 빨간색이 뜨게 됩니다.

제 경우에는 간단하게 적용하기 위해 색으로 구분하였지만 효과를 넣어줄 시 좋은 결과물이 나올 것이라 예상됩니다.

결과물

이전과 비교하여 색이 달라지는 연출만 추가된 것인데도 큐브가 사라지는 것이 눈에 보입니다.

후기

진짜 충돌을 표현했다기보단 특정 점을 기준으로 멀어졌을 때 색이 바뀌는 연출을 가지고 충돌처럼 표현한 느낌입니다. 눈속임에 가깝지만 오히려 이러한 눈속임을 잘 쓰는 것이 효율적인 결과물을 내기도 한다고 생각합니다. 또한 반지름을 통해 판단하는 것이기에 완전히 충돌과 관련이 없다고 말하기도 힘들 것 같습니다.

개인적으론 생각보다 결과물이 만족스럽습니다.

profile
연락 : publicminsu@naver.com

0개의 댓글