레퍼런스

네트워크 패키지의 모든 멤버와, 각각에 딸린 규칙을 정리했습니다.

업데이트 2026-09-10

Synced<T>

비헤이비어의 필드 또는 자동 프로퍼티. 선언한 이름 그대로의 복제 변수 하나가 됩니다.

Value 읽기. 쓰면 복제되고, 쓸 수 있는 쪽은 소유자뿐
Subscribe(handler) 값이 도착하면 모든 클라이언트에서 핸들러 호출
(T old, T current) 를 받는 Subscribe(handler) 같은 것이되 무엇에서 바뀌었는지도 알려줍니다
Unsubscribe(handler) 멈추기. 넣지 않은 것을 빼도 아무 일 없음
MarkChanged() 대입으로는 보이지 않는 배열 원소의 변경을 알림

핸들러는 갱신이 전부 도착한 뒤에 도므로, 같은 비헤이비어의 다른 동기화 값을 읽으면 함께 들어온 값이 읽힙니다.

Room

static 이라 비헤이비어든, 평범한 클래스든, 추상 클래스든 보낼 수 있습니다.

Send(message) 모두에게
Send(message, target) All, Master, Others
Send(message, player) 한 사람에게, 그 사람의 id 로
Subscribe<T>(handler) 이 형식 중 이 클라이언트가 처리할 것을 받기
Unsubscribe<T>(handler) 멈추기
IsMaster 이 클라이언트가 조율하는 쪽인지
IsInstanceOwner 이 클라이언트가 인스턴스를 열었는지
Master 조율하는 사람. 인스턴스가 자리 잡기 전에는 null
Players, PlayerCount 지금 있는 모두. Players 는 할당하므로 매 프레임 부르지 않기
LocalPlayer 이 클라이언트의 플레이어
Bus, BusOf(player) 룸 메시지를 싣는 오브젝트

핸들러는 (T)(VRCPlayerApi, T) 도 됩니다. 같은 형식에 둘 다 구독할 수 있고 둘 다 돕니다. private 이어도 됩니다.

IsMaster 는 권한이고 IsInstanceOwner 는 허가입니다. 마스터는 조율하며 그 클라이언트가 나가면 넘어갑니다. 인스턴스 오너는 그 자리를 연 사람이고, 공개 인스턴스에서는 대개 그 자리에 없습니다. 인스턴스 오너로 권한을 가르는 월드는 만든 사람의 테스트 인스턴스에서는 완벽히 돌고 그 밖의 어디에서도 권한이 없습니다.

비헤이비어 확장 메서드

그 오브젝트 자신의 채널을, 오브젝트 그 자체인 비헤이비어 위에 쓴 것입니다. 룸이 아닙니다. Room.Send 는 룸 버스를 지나 모든 클라이언트에 닿고, 이쪽은 이 오브젝트 위를 흐르므로 어느 오브젝트 이야기인지 알리는 id 를 실을 필요가 없습니다.

this.Send(message) 이 오브젝트 자신의 채널로 모두에게 보냅니다
this.Send(message, target), this.Send(message, player) 주소를 붙인 형태
this.Subscribe<T>(handler), this.Unsubscribe<T>(handler) 메시지를 받는 핸들러
(VRCPlayerApi, T) 를 받는 this.Subscribe<T>(handler) 같은 것이되 보낸 사람도 알려줍니다
this.Pending() VRChat 이 아직 받아가지 않은 보낸 메시지 수

보내려면 그 오브젝트를 소유해야 합니다. 복제되는 것은 소유자의 쓰기뿐이라, 소유자가 아닌 쪽은 메시지가 나가지 않았다는 것을 나중에 아는 대신 지금 듣습니다. 아무 클라이언트나 보낼 수 있게 하려면 먼저 소유를 가져오세요.

Pending() 은 거의 언제나 0 입니다. 0 보다 큰 상태로 머문다면 한 번의 manual sync 가 실어갈 양보다 배치가 크다는 뜻이고, 월드는 덜 보내야 합니다.

클라이언트는 자기가 오기 전에 보내진 것에는 반응하지 않습니다. 각 배치는 언제 만들어졌는지를 지니고 있고, 나중에 들어온 클라이언트는 남의 기록을 다시 재생하지 않고 그것을 버립니다.

NetworkEvent

메시지의 기반 클래스. 무엇을 실을지 재정의합니다.

Serialize(ByteWriter) 필드를 쓰기
Deserialize(ByteReader) 같은 순서로 되읽기

하위 클래스에는 매개변수 없는 생성자가 필요합니다. 받는 쪽은 채울 것이 생기기 전에 인스턴스를 만들기 때문입니다. 필드 없는 신호는 둘 다 재정의하지 않습니다. 어떤 형식인지는 1 바이트로 실리고 빌드할 때 프로젝트 전체에서 번호가 매겨지므로, 한 월드의 두 비헤이비어가 그 번호의 뜻을 달리 알 수 없습니다.

Serialize/Deserialize가 받는 ByteWriter/ByteReaderUdonite Serialization에 있습니다 — 이 패키지는 그것에 의존할 뿐, 포함하고 있지 않습니다. 전체 멤버 목록은 그쪽의 레퍼런스에 있습니다.

NetworkBus

오브젝트 자신의 채널. 오브젝트에 넣고 참조합니다.

channel.Send(message), channel.Send(message, target) 그 오브젝트에서 형식 있는 전송
channel.Subscribe<T>(handler), channel.Unsubscribe<T>(handler) 그 오브젝트에서 그 형식 받기
Received, Sent, Pending 도착한 수, 나간 수, 회선을 기다리는 수
Sender 이 채널의 주인, 곧 메시지가 오는 곳

오브젝트 채널은 소유자가 하나입니다. 두 클라이언트가 같은 채널로 보내면 서로 다투게 되고, 룸 메시지가 플레이어마다 오브젝트 하나를 쓰는 이유가 그것입니다.

Ownership

IsMine(gameObject) 이 클라이언트가 그 오브젝트의 동기화 값을 쓸 수 있는지
IsOwner(player, gameObject) 그 플레이어가 가졌는지
Of(gameObject) 누가 가졌는지
Claim(gameObject) 거부되지 않으면 가져오기
GiveTo(player, gameObject) 넘기기
IsClogged 이 클라이언트의 전송이 밀려 있는지

MasterOwned

OnOwnershipRequest 가 조율하는 클라이언트만 허용하는 기반 클래스. 다른 누구도 쓰지 못할 상태를 위해, 재정의를 직접 쓰는 대신 상속합니다.

NetworkTransform

소유자가 보내고 나머지가 보간하는 위치·회전·스케일. 설정과 재생 방식은 오브젝트 움직이기에 있습니다.

문제가 발생했습니다 새로 고침