リファレンス
ネットワークパッケージのすべてのメンバーと、それぞれに付いている規則の一覧です。
Synced<T>
ビヘイビアのフィールドまたは自動プロパティ。宣言したとおりの名前で複製変数 1 つになります。
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) |
1 人へ。プレイヤー自身の 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 がまだ受け取っていない送信済みメッセージの数 |
送信にはそのオブジェクトの所有が要ります。 replicate されるのは所有者の書き込みだけなので、非所有者はメッセージが出ていかなかったと後から気づくのではなく、その場で知らされます。どのクライアントからも送れるようにしたいなら、先に所有を取ってください。
Pending() はほぼ常に 0 です。0 より上のままなら、1 回の manual sync が運べる量よりバッチが大きいということで、ワールドは送る量を減らすべきです。
クライアントは、自分が来る前に送られたものには反応しません。 各バッチはいつ作られたかを持っていて、後から参加したクライアントは他人の履歴を再生せずにそれを捨てます。
NetworkEvent
メッセージの基底クラス。運ぶ内容を override します。
Serialize(ByteWriter) |
フィールドを書く |
Deserialize(ByteReader) |
同じ順で読み戻す |
サブクラスには引数なしのコンストラクターが要ります。受け取る側は、中身を入れる前にインスタンスを作るからです。フィールドのない合図はどちらも override しません。どの型かは 1 バイトで運ばれ、ビルド時にプロジェクト全体で採番されるので、同じワールドの 2 つのビヘイビアがその番号の意味を取り違えることはありません。
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 |
このチャンネルの持ち主。メッセージの送り主 |
オブジェクトのチャンネルはオーナーが 1 人です。2 人が同じチャンネルに送ると奪い合いになります。ルームのメッセージがプレイヤーごとに 1 つのオブジェクトを使うのはそのためです。
Ownership
IsMine(gameObject) |
このクライアントがそのオブジェクトの同期値を書けるか |
IsOwner(player, gameObject) |
そのプレイヤーが持っているか |
Of(gameObject) |
誰が持っているか |
Claim(gameObject) |
拒否されなければ取る |
GiveTo(player, gameObject) |
渡す |
IsClogged |
このクライアントの送信が滞っているか |
MasterOwned
OnOwnershipRequest が調停役だけを許す基底クラス。ほかの誰にも書かせたくない状態のために、override を自分で書く代わりに継承します。
NetworkTransform
オーナーが送り、ほかの全員が補間する位置・回転・スケール。設定と見え方はオブジェクトを動かすにあります。