전글 : https://gall.dcinside.com/mgallery/board/view/?id=vr&no=132675
저번에 제작하던 글에 이어서
몇 가지 장난을 더 쳐봅시다.
저번에 만들었던 월드인데 이대로는 좀 심심하죠?
유니티에는 제작물을 그대로 재활용하기 쉽도록 만든 프리팹이라고 하는 기능이 있습니다.
월드에 들어가있는 VRCWorld나 VRCMirror도 프리팹이에요.
간단히 말해 통짜로 저장하는 기능이죠.
이해를 쉽게 하기 위해서 지금 이 망루를 프리팹화시켜보겠습니다.
방법은 간단한데, 프리팹으로 만들고 싶은 오브젝트를 하이어라키에서 프로젝트로 드래그해주면 됩니다.
이제 이 프리팹은 제가 설정해놓은 스케일(크기)값이나 힘들게 박아놓은 콜라이더도 전부 저장한 상태가 됩니다.
만약 제가 똑같은 망루를 월드에 3~4개씩 배치하게 되거나, 여기서 만든 망루를 다른 월드에 배치할 때 유용하겠죠?
자, 이번엔 반대로 다른 사람들이 만들어놓은 프리팹을 쓰는 것도 가능합니다.
잠깐 URL 하나를 확인하고 갑시다.
https://docs.google.com/spreadsheets/d/e/2PACX-1vTP-eIkYLZh7pDhpO-untxy1zbuoiqdzVP2z5-vg_9ijBW7k8ZC9VP6cVL-ct5yKrySPBPJ6V2ymlWS/pubhtml
위 주소는 VR챗 공식 디스코드 월드 채널에 올라가 있는 VR챗 프리팹 모음입니다.
많은 사람들이 만들고 배포하고 있는 프리팹들을 모아놓은 것이죠.
상당히 유용하고 재미있는 것들이 많습니다.
원하는 녀석을 스프레드시트에서 찾아서 다운로드를 받고, 유니티패키지 열어서 임포트 시켜줍니다.
경우에 따라 유니티 패키지가 아니라 그냥 폴더채로 들어가있는 경우가 있는데, 그러면 프로젝트 안에 넣어주면 됩니다.
여기서는 WACOWater 라는 녀석을 써보도록 합시다. 최신에서 제대로 작동하지 않습니다. 주의하세요. 아래 내용은 참고만 하시기 바랍니다.
폴더 안을 살펴보니 프리팹 파일이 있네요. 그대로 드래그해서 하이어라키나 씬에 던져줍니다.
와! 워터!
이제 깔려있는 프리팹을 제 취향대로 만져주도록 하겠습니다. 크기부터 바꾸고...
구조를 보아하니 내부에 있는 Plane의 크기를 조절해주면 될 거 같군요. 리플렉션 프루브라는 애도 들어있네요. 얘는 내버려둘게요.
콜라이더도 들어있지만 이미 바닥에 콜라이더를 깔았으니 지워주겠습니다.
여기서 이렇게 물을 집어넣었는데, 물을 다룰 때에는 주의하셔야할 점이 있습니다.
1. 느낌이 오시겠지만 일단 물은 렉이 걸립니다.
특히 이쁘게 만든 물 쉐이더일 수록 주의를 해야겠죠? 얘가 꿈틀거리는 걸 보니 벌써 느낌이 싸합니다.
2. VR을 지원하지 않는 물 쉐이더들이 꽤 있습니다.
싱글패스 스테레오 뭐시기하는 쉐이더가 필요한데 저도 모르고 님들도 모르겠죠? 일부 물 쉐이더는 왼쪽 눈에만 물이 비치거나 해서 원치 않는 시각 테러가 될 수 있습니다. 당연히 아까 위에 올린 VRChat Prefab에는 VR 지원 물 쉐이더들이 올라와있을 것입니다.
2번이야 다 고려해놨지만 1은 어떻게 하죠? 그야 물을 끄는 버튼을 넣으면 그만이죠 ㅎㅎ
월드에 이미 거울도 들어있으니 이 껐다 켰다하는 버튼을 만드는 법을 다뤄보도록 하겠습니다.
이 버튼을 만들기 위해 VRC Trigger라고 하는 애를 쓸 것입니다.
VRC 트리거라는 애가 뭐냐면 조건(트리거)을 만족시키면 특정한 일(액션)을 일으키는 VRC용 스크립트입니다.
SDK를 넣으면 자동으로 들어있어요.
일단은 버튼으로 쓸 물건이 필요하니 큐브를 만들어주세요.
설마 아직 큐브를 만들 줄 모르는 건 아니겠죠?
Add component -> VRC Trigger 를 추가해줍니다.
(Relay 아닙니다.)
그럼 인스펙터에 요로코롬 VRC_Trigger라는 애가 나옵니다. 사진에 빨간색으로 체크해둔 곳 있죠? 클릭하면 "트리거"를 고를 수 있습니다.
영어로 잔뜩 나올텐데, 나중에 천천히 살펴보면서 하나 하나 알아보세요.
https://docs.vrchat.com/docs/trigger-summary 여기에도 영문으로 자세히 설명이 되어있습니다.
일단은 OnInteract를 골르고 옆의 Add를 눌러주세요.
"이 트리거가 달려있는 물체를 클릭할 때"에 해당되는 트리거입니다.
그 다음에는 액션을 넣어줘야겠죠?
넣기 전에 Advanced Mode를 체크하고, AlwaysBufferOne을 Local로 바꿔줍니다.
이걸 브로드캐스트 타입이라고 하는데, 이 행동이 어디까지 영향을 미치냐를 의미합니다. 흔히 말하는 로컬이라는게 이겁니다.
잠깐 자주 쓰는 브로드캐스트 타입에 대해서 소개하자면
Local : 해당 트리거를 발동시킨 사람만
Always : 누구나.
Master : Always와 같지만 마스터만이 트리거를 발동시킬 수 있음.
Owner : Always와 같지만 오너이 트리거를 발동시킬 수 있음.
???Unbuffered : 트리거가 발동한 시점에 있던 사람들만
???BufferedOne : 뒤늦게 들어온 사람도 한번은
이 됩니다. ???Unbuffered나 ???BufferedOne은 Always나 Owner 등과 섞여서 쓰여요.
잘 모르겠으면 항상 AlwaysBufferedOne이나 Local을 쓰시면 됩니다.
마스터란 건 해당 인스턴스에 가장 먼저 들어온 사람이고, 그 사람이 나가면 다른 사람으로 바뀝니다.
오너라는 건 해당 물체의 싱크에 대해 우선권을 가진 사람입니다. 손으로 물건을 집거나 하면 그 사람이 오너로 바뀝니다.
뭔지 잘 모르겠죠? 이런 건 나중에 가야 쓸 일이 생길 겁니다.
그 뒤 밑의 플러스 버튼을 누르고 Basic Event -> SetGameObjectActive를 넣어줍니다.
이 액션은 물체를 껐다 켰다 해주는 액션입니다.
액션에 SetGameObjectActive라고 뜰텐데, 마우스로 클릭해서 선택해주면 상세설정이 가능해집니다.
상세설정은 액션마다 달라요.
주목할 부분은 리시버라고 적힌 부분과 오퍼레이션이라고 적힌 부분입니다.
리시버라는 건 어떤 물체가 이 액션의 영향을 받을 것인지 설정하는 부분입니다. 일단 거울부터 껐다켰다 해봅시다.
플러스 (+) 버튼을 누르면 None (Game Object)라고 뜨면서 오브젝트를 넣을 수 있게 변합니다. 거울을 하이어라키에서 드래그해서 넣어줍니다.
그 뒤 Operation을 False에서 Toggle로 바꿔줍니다. False는 아예 꺼버린다는거고 True는 반대로 켜준다는 겁니다.
Toggle은 꺼져있으면 키고, 켜져있으면 끄는거죠.
참고로 로컬이 아닌 경우에는 토글은 쓰지 않는게 좋습니다. 동기가 밀릴 경우 사람마다 다르게 보이기 좋거든요.
마지막으로 Interaction Text를 Mirror 로 바꿔서 알기 쉽게 해주고,
버튼으로 집어넣은 큐브를 적절한 위치에 배치해줍시다.
참 쉽죠?
이제 같은 요령으로 물도 꺼보도록 하겠습니다만... 숙제입니다.
물 프리팹을 넣지 않았다, 하시는 분들은 자기가 원하는 다른 물건이나 프리팹을 비활성화시키시면 됩니다.
이 큐브를 Ctrl+D로 복사한 뒤 리시버만 바꿔주면 날로 먹을 수 있겠죠?
완성하셨으면 테스트입니다. 아무튼 잘 모르겠을 때 테스트 버튼 한번 누를 때마다 월드 퀄리티가 1씩 올라간다고 보시면 됩니다.
망루에서 물을 내려다볼 수 있는 띵월드지만 미코는 키가 작아서 못내려다본대
질문 있으면 괘념치 말고 답글에 남겨주세요~