VRChat/VRChat 월드 제작 가이드

VRChat 월드 거울 설치 및 다양한 설치 응용 방법

밍결 2023. 1. 9.

VRChat 월드의 필수 3대 요소 중 하나인 동영상(비디오) 플레이어는 이전 글에서 다루었다. 이번 글의 주제는 거울이다. 동영상 플레이어는 없어도 조금 양보하면 없어도 괜찮다 말할 수 있지만, VRChat은 거울 보는 게임이라고 불러도 이상하지 않기 때문에 월드에 거울은 필수다.

 

거울 설치하는 방법 (VRC 기본 거울, 기초) 

거울에 특별한 설정을 하지 않고 기본 상태로 설치하는 방법은 정말 간단하다.

VRChat Examples의 Prefabs 폴더를 보면, 사용할 수 있는 거울이 들어있다. VRChat에서 'H.Q Mirror'라고 불리는 모든 걸 반사하는 거울로, Prefab을 넣어 크기와 위치만 조정하면 끝이다. 정말 쉽다.

 

다만, 하이퀄리티 거울은 같은 모델링을 반대에 똑같이 구현해서 보여주기 때문에 렉을 유발한다. 때문에, 최대한 가볍게 하기 위해서 여러 요소를 설정하는 게 좋다. 

 

아바타만 보이는 거울 설정하는 방법 (레이어 설정 방법)

기본 설정은 Everything으로 모든 반사 요소를 거울에 다 비추어준다.

하지만 인형, 펜 등의 요소 때문에 거울이 지저분해보일 수 있다. 배경과 아바타만 깔끔하게 보여주고 싶거나 그 외 다른 이유로 거울이 반사하는 요소를 제거하고 싶을 수도 있다. 

그럴 때는 거울 옵션에서 리플렉션을 수정해야 하고, 오브젝트에 레이어 설정을 해야 한다. 

하지만 월드 제작을 시작한 지 얼마 되지 않았다면 리플렉션이 어떤 의미를 가지는지, 레이어가 뭔지 뭘 설정하라는 건지 이해하기 어렵다. 나는 포토샵 레이어를 통해 레이어의 의미야 이해하고 있었지만, 유니티에서 레이어를 설정하는 방법을 몰라 엄청 헤맸다.

누군가가 알려주는 글을 봐도 "레이어 설정 조정하면 돼"라고만 하지 그게 뭔지 어떻게 설정하는 건지 안 알려주니까. 

우측 상단에 있는 빨간 박스를 보면 "Layer"라고 쓰여있다.

오브젝트에 "레이어 값"을 주는 기능이다. 21개의 레이어 뿐만 아니라 아래의 Add Layer를 통해 더 많은 레이어를 생성해 사용할 수 있다. 

아래의 빨간 박스를 보면 "Reflect Layers"라고 쓰여있다.

Reflect는 반사하다는 의미를 가지고 있으니, 당연히 '반사할 레이어'를 선택하는 옵션이란 의미다.

이해가 빠른 유저라면 벌써 이해했을 거다. "아, 여기서 레이어를 지정하고 거울에서 반사할 레이어에서 지정한 레이어를 제외하면 그 레이어는 거울에 반사되지 않는구나." 혹은 "여기서 레이어를 지정하고 해당 레이어만 반사하게 하면 되겠구나."

 

보라색 큐브를 거울에서 지우기 위해 큐브에 reserved4의 레이어 값을 주고, 

거울의 Reflect Layer에서 reserved4의 값을 제외하면, 레이어 값이 reserved4인 오브젝트는 반사시키지 않게 되면서 거울에 보라색 큐브가 보이지 않게 된다. 

거울에 동영상 플레이어가 보이는 게 싫거나, 펜이 보이는 게 싫다면 방금 언급한 방법으로 모두 해결할 수 있다. 

 

배경 없이 아바타만 보여주는 거울 설정하는 방법 (투명 거울 방법)

거울은 배경까지 반사한다.
그렇다고 리플렉션에서 Default를 꺼버리면 Skybox(우주 배경 등)를 반사한다. 

하지만 VRChat에서 '아바타'가 보이고 거울 너머의 배경까지 볼 수 있는 거울도 존재한다는 사실을 우린 알고 있다. 거울이 앞의 배경을 가리지 않으면서 아바타만 보이게 설정된 거울.

이는 셰이더를 이용해 거울을 투명화하는 건데, 우리가 굳이 셰이더를 만드는 건 귀찮으니까(나도 정확히 어떻게 만드는지 잘 모른다), 다른 유저가 만들어둔 투명 거울 패키지를 받아 해결하는 걸 추천한다.

https://booth.pm/ja/items/2685621

 

VRCPlayersOnlyMirror (背景なし No background) - temporal - BOOTH

!!! バージョン 0.1.4+ では、SDK3 のバージョンが VRCSDK3-WORLD-2022.08.29.20.48_Public 以降であることを確認してください。!!! !!! For version 0.1.4+, please make sure you are using SDK3 version VRCSDK3-WORLD-2022.08.29.20.48_P

booth.pm

https://github.com/acertainbluecat/VRCPlayersOnlyMirror

 

GitHub - acertainbluecat/VRCPlayersOnlyMirror: A simple mirror prefab for mirrors that show players only without any background

A simple mirror prefab for mirrors that show players only without any background in VRChat - GitHub - acertainbluecat/VRCPlayersOnlyMirror: A simple mirror prefab for mirrors that show players only...

github.com

부스에서도 배포하고 있고, 깃허브에서도 배포하고 있다.

원하는 페이지에서 최신 버전을 받아 유니티 패키지를 임포트하면 바로 사용할 수 있다. 

프로젝트창에서 VRCPlayersOnlyMirror 폴더로 들어가면 관련 Prefab 파일이 존재한다. 프리팹 파일을 하이어라키로 끌어와서 위치만 조정해주면 위 이미지의 씬 창에서 보이는 모습처럼 사용가능하다.

그리고 Mirror가 꺼진 상태가 기본이고 메뉴 버튼에서 누르면 켜지는 방식으로 구성이 되어있어서, 메뉴 버튼을 사용하지 않고 항상 거울이 켜진 상태이길 바란다면 몇 가지 옵션을 수정해야 한다. 하이어라키에서 VRCPlayerOnlyMirror안에 있는 Menu 오브젝트를 지워주고 Mirror의 인스팩터창에서 거울을 켜주면 항상 거울이 켜진 상태로 유지된다. 

 

거울 토글 설정하는 방법 (Lura's Switch 사용 방법) 

방금 설명한 "VRCPlayerOnlyMirror"은 Prefab으로 스위치 기능까지 구현해놨지만, 맨 처음 설명한 VRC 기본 거울은 스위치가 존재하지 않는다. 때문에, 버튼을 따로 만들어주어야 한다. 

버튼은 또 어떻게 만들어 싶겠지만, 정말 깔끔하고 편리하게 구성된 패키지가 있기 때문에 굳이 만들 필요까진 없다. 스위치를 완전 자신이 직접 만드는 방법도 있긴 한데 굳이 직접 만들 필요가 있나 싶다. 

"원리를 이해하고 패키지를 만들 수 있는 사람이 편의성 때문에 사용하느냐" "조또 모르지만 남이 만들어둔 패키지를 조립식으로만 사용하며 거기까지 몰라도 된다고 말하느냐" 이 두 성향의 차이가 엄청 크다고 생각하지만, 우리가 코딩하는 개발자일 필요는 없으니 원리 무시하고 대충 구현만 하자. 

https://booth.pm/ko/items/1969082

 

Lura's Switch【SDK2/SDK3/VCC】 - 仮想狐のデザイン工房 - BOOTH

VRChat向けにデザインしたスイッチの3Dモデルと、簡易的な機能を内蔵したPrefab集です。SDK2/SDK3、両方に対応しています。 1マテリアルでまとまっているので軽量です。 ・Mirrorスイッチ ・Avata

booth.pm

Lura's Switch라는 아주 뛰어난 패키지가 부스에서 배포되고 있다.

VRChat하는 유저라면 엄청 자주 보던 스위치가 저거다. 다들 사용하고 있고, 디자인도 어디에나 어울리는 무난하고 귀여운 디자인이기 때문에 편하게 사용하면 된다. 

어쨌든 위 부스 주소에서 해당 패키지를 받아 프로젝트에 임포트하면 된다.

다만, Lura 스위치는 iwaSync3처럼 UdonSharp 기반으로 돌아가기 때문에 스위치를 임포트하기 전에 UdonSharp를 임포트해주어야 한다. UdonSharp를 프로젝트에 임포트 하는 방법은 iwaSync3 때 길게 설명했으니 해당 글로 대체하겠다. 아래 링크로 가서 "플레이어 설치 전 준비 사항" 이라는 목차 부분을 보고 UdonSharp를 설치해주면 된다. 

 

VRChat 월드에 동영상 플레이어 넣는 방법 (iwaSync3 설치 방법)

VRChat 월드 필수 3대 요소는 거울, 펜, 동영상(비디오) 플레이어다. 그 중 처음으로 설명할 건 동영상 플레이어. 월드 제작의 기본은 할 줄 안다고 생각하고 설명할 예정이다. 혹여나 월드 제작 자

mingyeo1ee.tistory.com

임포트가 끝났으면 버튼 Prefab을 불러와서 설정해주어야 한다. 프로젝트창의 VirtualFoxDesignStudio - Lura'sSwitch(Udon) - PREFAB 폴더에 가면 미리 만들어진 스위치가 잔뜩 존재하니 여기서 가져오자. 

많은 프리팹 중에서 Mirror_WithSwitch 라는 프리팹을 가져와서 사용하면 된다. 거울 스위치 뿐만 아니라 오브젝트 스위치, 라이트 스위치 등이 많이 있으니 나중에 월드 제작할 때 요긴하게 사용하면 좋다. 

그리고 Mirror_WitchSwitch 안에 (위 이미지의 연두색 박스 표시) '기본 거울'도 함께 들어있다. 기본 거울과 연결이 이미 되어있으니 투명 거울을 설정할 게 아니라면 안에 있는 기본 거울을 위치만 조정해서 사용하면 더욱 편하게 사용할 수 있다(Mirror_WitchSwitch 안에 설정된 기본 거울을 사용한다면 위치 말곤 설정할 게 없다는 얘기다). 

원하는 위치로 스위치와 거울을 옮겼다면 이제 스위치 옵션을 설정해주자.  

Mirror_WitchSwitch 하위에 있는 Switch_Mirror 를 클릭하면 위 이미지와 같은 인스팩터창이 나온다. 거기에 있는 Udon Behaviour (Script) 를 열면 "Target Object"란이 있다. 이걸 열어주자. 

그럼 Element가 있다. "Element 2"에 기본 탑재되어 있던 VRCMirror가 설정되어 있을 텐데, 여기에 있는 값을 내가 설정하고 싶은 거울로 바꿔주면 된다. 거울 스위치 뿐만 아니라 오브젝트 스위치도 이와 같은 방법으로 바꿔줄 수 있다.

해당 알고리즘은 버튼을 누를 때마다 Target Object의 Element에 등록된 오브젝트에 값을 주는 (우리가 오브젝트 체크 박스에 체크를 누르는 행동과 같은) 구조다. 그러니까 하이어라키에서 오브젝트를 꺼둔 상태로 등록해놨으면 버튼을 눌렀을 때 오브젝트가 켜지게 되고, 켜둔 상태로 등록해놨으면 꺼진다. 

그렇기 때문에 Element 값에 '스위치 On'과 스위치 'Off'로 둘 다 설정되어 있는 거다 하나는 켜진 상태로, 하나는 꺼진 상태로. 이렇게 등록하면 스위치가 눌러질 때마다 서로 반대로 움직이니까 스위치처럼 작동하게 된다. 우리가 거울 오브젝트와 스위치 On 오브젝트를 같이 꺼둔 채로 스위치의 버튼을 눌렀을 때 두 오브젝트가 함께 켜지며 마치 버튼에 불이 들어오며 거울이 작동하는 모습처럼 보이게 된다.

 

특정 위치에서 작동하는 거울 설정하는 방법 (발판 거울 방법)

한튜에 있는 '발판'을 밟으면 나오는 거울을 만들고 싶어하는 경우가 있다. 이 기능을 알아야 여러 요소를 다양하게 넣을 수 있기 때문에 중요한 기능이다. Trigger와 알고리즘에 대해서만 따로 다루어도 되지만, 거울이 가장 유명하니까 거울로 예를 들겠다. 

"발판 거울"을 만드는 방법은 PyPy Dance (Just Dance) 월드에 있는 타이머를 만드는 방법과 같다. 

PyPy Dance (Just Dance) 월드를 보면 '춤을 추는 시간 만큼만' 타이머가 돌아간다. 물론, 춤을 추는 동작과는 전혀 상관없다. 춤을 추는 사람은 건물 내부로 들어와 춤을 추기 때문에 건물 내부로 들어가는 순간 트리거가 작동하며 꺼져있던 타이머가 켜지며 타이머가 작동하며 내가 춤 춘 시간을 기록하는 구조다. (내가 춤을 추지 않아도 트리거를 작동시키고 있는 동안 타이머가 돌아가게 된다) 

발판 거울도 똑같다. 

"공간"에 트리거를 넣어주고 트리거가 작동할 때 거울을 켜는 구조로 만들면 된다. 

일단 큐브를 하나 만들어주고 크기를 조금 늘려준다.

그리고 Mesh Renderer를 끄고(메쉬 렌더러를 아예 지워도 상관없다), Box Colider에서 "Is Trigger"를 켜준다. Mesh Renderer를 꺼줬기 때문에 메쉬가 사라지며 투명화되고, 콜라이더에서 콜라이더를 트리거로 설정했기 때문에 콜라이더도 작동하지 않고 (통과가 가능해진다) 트리거로만 작동한다. 

방금 만들어진 박스의 공간이 "트리거"가 된다. 

(트리거로 만든) 큐브의 Add Component를 눌러 Udon Behaviour (Script) 를 생성한다.

여기에 있는 Program Source에 Udon Graph Program Asset 파일(알고리즘)을 넣어주어야 한다.

프로그램 소스로 사용할 파일은 프로젝트 창에서 우클릭 후 나오는 메뉴에서 Create - VRChat - Udon - Udon Graph Program Assets 를 선택해서 만들면 된다.

파일을 생성했다면 해당 파일 클릭 후 인스팩터 창에서 Open Udon Graph을 확인하고 클릭.

Udon Graph 화면으로 전환된다.

(나중에 작업하다 나오고 싶으면 화면 중앙의 Scene, Game, Asset Store가 있는 상단 탭바에 Udon Graph가 하나 더 생기는 거니까 Udon Graph 화면에서 나오고 싶다면 화면 중앙 상단의 Scene 버튼을 눌러 다시 돌아오면 된다)

우리가 사용할 형태는 위의 형태로 된 Udon Graph다. 

플레이어가 트리거에 들어오면(OnPlayerTriggerEnter) 활성화를 설정한다(SetActive) 타겟으로 적용한 오브젝트에(TargetObject) 형태, 그리고 플레이어가 트리거에서 나가면(OnPlayerTriggerExit) 활성화를 설정한다(SetActive) 타겟으로 적용한 오브젝트에(TargetObject) 형태.

이렇게 두 가지를 설정하면 된다.

 

트리거 생성 (OnPlayerTrigger 생성)

Udon Graph 창에서 우클릭하면 "Create Node"가 나오는데, Create Node를 선택하면 아래 이미지처럼 검색할 수 있는 창이 나온다.

OnPlayer 라고 검색하면 Enter와 Exit가 바로 보인다. 

 

SetActive 설정하는 방법

이번엔 트리거와 달리 두 번 눌러주어야 한다. Game 이라고 검색하면 GameObject가 나온다. 이걸 누르면 다시 한 번 더 검색할 수 있는데, 거기서 Set 을 검색하면 SetActive가 보인다. 그걸로 SetActive를 추가해주면 된다.

 

TargetObject 설정 방법

이건 Udon Graph 좌측에 있는 "Variables"에서 + 버튼을 눌러 GameObject를 추가해야 한다. 추가할 때 'public' 체크박스가 있는데 이를 체크해야만 제대로 작동한다. 이를 체크하지 않으면 TargetObject를 설정할 수 없으니 꼭 설정해주자.

만들어진 GameObject를 드래그해서 UdonGraph 화면에 추가하면 끝.

 

이렇게 추가한 요소를 아래 이미지와 똑같이 연결해주자.

"선은 어떻게 추가하나요?"
선이 나오는 위치에 드래그하면 바로 나온다.

시작 부분에서 드래그 해서 원하는 위치로 연결하면 된다.

이미지를 자세히 안 보면 놓칠 만한 부분이 하나 있는데, 위에 있는 SetActive엔 "value"가 체크되어 있고, 아래에 있는 건 "value"가 체크해제 되어있다.

 

여기까지 설정했다면 마지막 한 단계만 남았다. 

아까 Trigger를 만들었던 오브젝트로 돌아가서 설정을 해주어야 한다.

Udon Behaviour (Script) 의 Program Source에 방금 만든 Udon Grpah 파일을 넣어주고, 그 아래 TargetObject에 우리가 켜고 끄고 싶은 오브젝트를 넣어주면 끝.

나는 거울을 끄고 있는 상태에서 트리거가 작동할 시 거울을 켜고 싶으니 거울을 끈 상태로 기본 설정을 해놨다. 

 

그리고 테스트 빌드를 해보면

박스 안에 들어가지 않았을 땐 거울이 나오지 않는다. 

아까 설정한 박스 안으로 들어가면 거울이 작동한다. 

방금 설명한 방식을 응용해서 PyPy Dance 맵에 있는 춤출 때만 돌아가는 타이머 같은 요소를 만들 수 있다. 

 

거울은 이런 식으로 월드에 추가하면 된다. 

댓글

💲 추천 글