레퍼런스
네트워크 패키지의 모든 멤버와, 각각에 딸린 규칙을 정리했습니다.
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/ByteReader는 Udonite 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
소유자가 보내고 나머지가 보간하는 위치·회전·스케일. 설정과 재생 방식은 오브젝트 움직이기에 있습니다.