첫 번째 월드
누구나 누를 수 있는 버튼과 모든 플레이어가 같은 숫자를 보는 카운터를, 빈 프로젝트에서 업로드까지 약 15분에 만듭니다.
만들 것은 카운터입니다. 누구나 누를 수 있는 큐브, 몇 번 눌렸는지 보여 주는 라벨, 그리고 한 시간 뒤에 들어온 플레이어를 포함해 모든 플레이어의 화면에 같은 숫자. 컴파일러, 네트워킹 패키지, 평범한 UI 라벨을 다루며, 이는 실제 월드가 하는 일의 대부분입니다. C# 약 20줄로 끝납니다.
1. 설치
- VRChat Creator Companion에서 Settings → Packages → Add Repository를 열고
https://udonite.github.io/vpm/index.json을 붙여 넣은 뒤 Add를 누릅니다. - 월드 프로젝트를 만들거나 엽니다. Unity 2022.3과 Worlds SDK 3.10 이상이 필요합니다.
- 프로젝트의 패키지 목록에서 Udonite와 Udonite Net을 추가합니다.
이제부터 Udonite는 C#을 알아서 Udon으로 컴파일합니다. Net 패키지는 카운터에 필요한 동기화 값을 제공합니다.
2. 씬 구성
- GameObject → 3D Object → Cube를 만들어
Counter라고 이름 짓고 플레이어가 닿을 수 있는 곳에 둡니다. 큐브의 콜라이더가 누를 수 있게 해 줍니다. - GameObject → UI → Canvas를 만들고 Render Mode를 World Space로 바꾼 뒤, 읽을 수 있는 크기로 줄여(스케일
0.005가 적당한 시작점입니다) 큐브 위에 둡니다. - 캔버스 안에 UI → Legacy → Text를 만들어
Label이라 이름 짓고 텍스트에0을 입력합니다. 여기서는 레거시 컴포넌트로 충분하고, 따로 가져올 것도 없습니다.
3. 비헤이비어 작성
Assets/Counter.cs를 만듭니다.
using Udonite;
using Udonite.Net;
using UnityEngine;
using UnityEngine.UI;
public class Counter : UdoniteBehaviour
{
public Text label;
private Synced<int> count = new Synced<int>();
public override void Start()
{
InteractionText = "Press";
count.Subscribe(OnCountChanged);
label.text = count.Value.ToString();
}
public override void Interact()
{
Ownership.Claim(gameObject);
count.Value = count.Value + 1;
}
private void OnCountChanged(int value)
{
label.text = value.ToString();
}
}
월드 전체를 받치는 것은 세 가지입니다.
- **
Interact**는 플레이어가 오브젝트를 누를 때 실행됩니다.UdoniteBehaviour의 평범한 멤버이므로, 이름을 잘못 치면 아무 일도 없이 지나가는 대신 컴파일 오류가 납니다. - **
Synced<int>**는 모든 클라이언트가 가진 카운트입니다..Value에 쓰면 저장되고 VRChat에 복제를 요청합니다. 나중에 들어온 플레이어는 누가 다시 보내지 않아도 현재 값을 받습니다. 쓸 수 있는 것은 오브젝트의 소유자뿐이며, 그래서Ownership.Claim이 있습니다. 누른 사람이 소유자가 되고, 그다음 씁니다. - **
Subscribe**는 값이 도착할 때 쓴 클라이언트를 포함한 모든 클라이언트에서 핸들러를 실행하므로, 라벨은 정확히 한 곳에서만 갱신됩니다.Start의label.text줄은 첫 변경이 오기 전의 순간을 채웁니다.
여기에 Udon 고유 문법은 없습니다. 동기화 모드와 짝지어야 하는 sync 속성도, 잊지 말고 호출해야 하는 직렬화 메서드도, 피해야 할 키워드 목록도 없습니다.
4. 붙이고 컴파일하기
Counter.cs를Counter큐브에 끌어다 놓습니다.- 인스펙터의 Label 필드에
Label오브젝트를 끌어다 놓습니다. - 씬을 저장합니다.
저장하면 컴파일됩니다. Udonite는 C# 컴포넌트 옆에 Udon 프로그램을 붙입니다. 성공하면 아무것도 출력되지 않고, Udon이 실행할 수 없는 것만 콘솔에 UDN 코드와 수정 제안을 붙여 이름을 들어 표시됩니다. Udonite → Open Window → Compile은 전체를 수동으로 컴파일하고 요약 한 줄을 출력하는데, 스크립트를 오브젝트에 막 끌어다 놓은 직후에 유용합니다.
5. 시험해 보기
Play를 누릅니다. ClientSim이 로컬 플레이어를 제공하니 큐브까지 걸어가 누르세요. 라벨이 올라갑니다. Udon 프로그램이 도는 동안 C# 컴포넌트는 비활성화되므로, 지금 시험하는 것이 곧 출시되는 것입니다.
ClientSim은 직렬화를 실행하지 않으므로 에디터 안에서는 카운트가 로컬입니다. 네트워크를 건너는 것을 보려면 SDK 컨트롤 패널의 Build & Test를 클라이언트 두 개로 사용하세요. 한쪽에서 누르면 다른 쪽의 라벨이 따라옵니다.
6. 업로드
다른 월드와 마찬가지로 VRChat SDK 컨트롤 패널에서 빌드하고 업로드합니다. 출시되는 것은 Udonite가 붙인 Udon 프로그램이고, C#은 다음 편집을 위해 프로젝트에 남습니다.
다음으로
- 모두가 나갔다가 돌아와도 카운트를 남기기: Persistence
- 카운트가 100을 넘으면 Discord 채널에 알리기: Net 패키지의 메시지와 대시보드의 호스팅된 릴레이
- 무엇이 컴파일되는지: 언어 지원이 그 목록이고, 생각보다 깁니다
- 무언가가 거부될 때: 진단이 모든 코드를 설명합니다