[Unity] 큐브에 선분만 보이게 해보자

PublicMinsu·2024년 9월 4일
0
post-custom-banner

개요

카메라 그대로 플레이어의 충돌 영역으로 사용할 시 플레이어의 충돌 범위를 육안으로 확인할 수 없다는 문제가 존재합니다.

또한 시야가 제한되기에 이동한 방향에 투사체가 존재할 시 영문도 모른 채 게임 오버 당할 가능성이 높습니다.

그렇기에 일인칭 시점보단 삼인칭 시점으로 게임을 플레이하게 하여서 플레이어의 충돌 범위를 육안으로 확인할 수 있게 해주려 했습니다.

삼인칭이더라도 문제가 존재했습니다.

플레이어의 충돌 범위가 불투명할 시 오히려 시야를 방해할 수 있다는 것을 느끼게 됐습니다. 반투명하게 만들 시 해결은 가능하지만 그다지 이쁘지 않다고 느꼈습니다.

고민 끝에 선분만 남기는 방법이 생각났습니다. 선분만 남길 시 충돌 범위는 명확히 하면서 시야를 가리지 않기에 만족스러우리라 예상됐습니다.

큐브의 경우 선분만 남기는 방법을 몰라서 여러 시행착오를 겪었습니다. 오늘 게시물에선 그 과정을 공유하고자 합니다.

불가능한 방법들

오브젝트에 외곽선을 추가하자에서 사용한 방법


'이전에 오브젝트에 외곽선을 추가할 때 사용한 방법에서 외곽선만 가져오면 되지 않나?'라는 생각이 드실 수도 있을 거 같습니다.

오브젝트에서 외곽선을 추가할 때 사용한 방법은 이미 그려진 오브젝트 위에 다른 오브젝트를 그려서 외곽선처럼 보이게 한 것입니다. 그렇기에 실질적으로 외곽선을 그린 것이 아닌 기존 오브젝트를 한 번 더 그린 것이라고 생각하시면 됩니다.

무엇보다 해당 해결책은 선분만 남기는 것이 아닌 실루엣에 해당하는 선분이기에 원하는 해결책을 위한 방법은 아닌 거 같습니다.

프레넬 효과 사용하기

셰이더의 노드 중 Fresnel Effect를 활용하면 빛이 반사되는 것을 표현할 수 있습니다.

출처 : https://docs.unity3d.com/kr/current/Manual/StandardShaderFresnel.html

표면이 매끄러울 수록 프레넬 효과는 강하게 나타납니다. 그렇기에 원, 캡슐, 원통의 둥근 부분은 투명화를 부드럽게 적용할 수 있지만 원통과 큐브의 면은 다소 딱딱한 형태가 됩니다.

고려해본 방법

모델링

큐브를 이어붙이면 원하는 모습을 만들 수 있습니다.

또는 블랜더와 같은 3D 툴을 쓰거나 유니티에서 제공해 주는 프로 빌더를 활용해서도 결과물을 낼 수 있습니다.

하지만 셰이더로 해결하는 것을 목표로 했기에 모델링을 사용하는 방법은 고려만 하였습니다.

해결한 방법

Position 노드를 활용한 방법

출처 : https://youtu.be/KnueAgpUL3Y?si=fKbp89dOGNyShmRt

Position 노드를 Object로 설정할 시 정점 사이의 좌표는 -0.5~0.5 사이의 좌표를 가지게 됩니다.

그렇기에 절댓값이 0.5에 근접한 좌표만 불투명하게 만들면 선분만 남을 것이라 생각됐습니다.

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

진행하기에 앞서 설정해 주어야 할 값이 존재합니다.
Material은 Unlit으로 하여서 빛의 영향을 안 받게 해줍니다.
Surface Type은 Transparent로 하여서 투명도를 조절할 수 있게 해줍니다.
Render Face는 Both로 하여서 뒤쪽 선분도 그려지게 해줍니다.

3차원 좌표를 나눈 뒤 각각 절대값으로 변환합니다.

선분으로 허용할 값의 범위를 구하기 위해 계산합니다.

절댓값으로 변환된 값과 선분으로 허용할 값의 범위를 비교합니다.

만약 선분으로 허용할 값의 범위가 0.45 이상이었다면 절댓값으로 변환된 값 0.4는 거짓을, 절댓값으로 변환된 값 0.5는 진실을 반환할 겁니다.

나눠진 좌표의 값 중 2개 이상이 참이라면 현재 위치가 선분 쪽에 존재한다는 뜻이므로 1을 반환하고 그 외에는 0을 반환합니다.

Alpha에 집어넣으면 값이 1인 경우에는 불투명, 0인 경우에는 투명이기에 선분인지 확인하는 조건을 통과한 좌표는 불투명해질 것입니다.

적용 결과

적용 결과 원하는 대로 선분만 불투명한 직육면체를 표현해 냈습니다.

일단 직육면체를 임의의 위치에 위치하였습니다. 꽤 그럴싸해 보입니다.
현재는 높이가 낮다 보니 밑에 존재하는 큐브에 당할 가능성이 보입니다. 적절한 높이는 더 생각해 봐야 할 거 같습니다.

주의할 점

직육면체 형태만 고려한 셰이더이기에 다른 도형에선 사용할 수 없습니다.

후기

중반쯤에는 간단하면서도 괜찮은 방법이 없을 거 같다는 생각이 들기도 했습니다만 그래도 방법을 생각해 내어 적용하니 그럴싸해 보여서 좋습니다.

모든 형태에서도 사용할 수 있는 공식은 존재할지는 모르겠습니다만 현재 상태에선 큐브의 선분만 표현하는 것이 목적이었기에 더 연구할 생각은 없습니다.

profile
연락 : publicminsu@naver.com
post-custom-banner

0개의 댓글