VRChat 非公式日本語ドキュメント

ネットワークコンポーネント

このドキュメントでは、Udonプログラムで使用できるネットワークコンポーネント、プロパティ、およびイベントについて解説します。

Networking プロパティ

Networking から 取得 できる特別なプロパティです。

Property name Description
LocalPlayer ローカルプレイヤーの VRC Player API オブジェクトを返します。
IsInstanceOwner Invite、Invite+、Friends、および Friends+ インスタンスにおいて、インスタンス作成者であれば true を返します。
Group インスタンス、Public インスタンス、および SDK の「Build & Test」モードでは常に false を返します。
InstanceOwner インスタンスのオーナーであるプレイヤーの VRC Player API オブジェクトを返します。オーナーが現在インスタンス内にいない場合は、代わりに null を返します。オーナーが戻ると、再びインスタンスオーナーを返すようになります。
インスタンスオーナーは特別なモデレーション権限を持っています。インスタンスのオーナー権限が変わることはありません。
IsMaster ローカルプレイヤーが instance master である場合に true を返します。マスターは、ネットワーク上のゲームオブジェクトのデフォルトのオーナーとなります。
セキュリティやワールドへのアクセス制限のためにこれを使用しないでください。代わりに IsInstanceOwner を使用するか、独自のモデレーションシステムを実装してください。
Master 現在のインスタンスマスターであるプレイヤーの VRC Player API オブジェクトを返します。常に有効な値を返します。
IsNetworkSettled インスタンス内のすべてのデータがデシリアライズおよび適用され、使用可能な状態であれば true を返します。
IsClogged 送信しようとしているデータ量が多すぎる場合に true を返します。これを使用して、ネットワークの混雑が解消されるまで待機したり、ロジックを調整したりできます。
SimulationTime ネットワークコンポーネントを持つプレイヤーやオブジェクトの現在のシミュレーション時間を返します。詳細は以下を参照してください。

Simulation time

Simulation time とは、オブジェクトがどれだけ過去の状態としてシミュレーションされているかを示すタイムスタンプです。この値は、VRCObjectSyncplayers の内部で使用されますが、Udon スクリプト内でも利用可能です。例えば、Time.realtimeSinceStartup が 45 で、オブジェクトの SimulationTime が 44.5 である場合、VRChat はその瞬間にオブジェクトをスムーズに同期するために 500ms の遅延が必要であると判断します。この数値を使って VRCObjectSync の状態を把握したり、VRCObjectSync に似た独自のシステムを作成したりすることができます。例えば、Time.realTimeSinceStartup - SimulationTime(player) を実行すると、その瞬間のプレイヤーのレイテンシを正確に知ることができます。

Simulation time は、レイテンシ、信頼性、パケットの受信頻度など、ネットワーク状態に応じて頻繁に調整されます。この調整の目的は、カクつき(ヒッチング)を防ぐための十分な余地を残しつつ、可能な限りリアルタイムに近い状態を維持することです。カクつきの原因となる要因は多岐にわたりますが、一例として、オーナーからのパケット受信が途絶えることが挙げられます。

ネットワークイベント

これらは、データの同期方法を制御するためにネットワーキングシステムの一部として利用可能なイベントです。

OnPreSerialization

このイベントは、シリアル化されたデータが送信される直前に発生します。他のプレイヤーに対して更新したい同期変数を設定するのに適した場所です。

OnDeserialization

このイベントは、同期データがバイト列から使用可能な変数に変換されたときに発生します。どのデータが更新されたかを教えてくれるわけではありませんが、同期変数を監視しているすべての要素を更新するための起点として、あるいは新しいデータと古いデータを比較して特定の更新を行う場所として機能します。

OnDeserialization(DeserializationResult)

OnDeserialization と同様ですが、リクエストが送信および受信された時刻に関する追加情報が含まれます。

DeserializationResult

DeserializationResult には3つのプロパティが含まれています。

sendTimereceiveTime はどちらも、あなたから見た VRChat の起動時刻を基準とした秒数で計測されます(Time.realtimeSinceStartup を参照)。つまり、特定の Deserialization が何秒前に送信されたかを知りたい場合は、Time.realtimeSinceStartup - sendTime で計算できます。

すべてのユーザーの Time.realtimeSinceStartup は異なるため、あるプレイヤーの sendTime と別のプレイヤーの sendTime は異なります。そのため、特定の sendTime を他のプレイヤーと同期させたい場合は、自分の Time.realtimeSinceStartup を差し引いてオフセットを計算する必要があります。その後、他のプレイヤーがそのオフセットを受け取ったときに、自身の Time.realtimeSinceStartup をオフセットに加算することで、それぞれの時計に対する絶対時間を特定できます。

メッセージがあなたが VRChat を起動する前に誰かによって送信された場合、SendTime は負の数になることがあります。

OnPostSerialization

このイベントは、シリアル化されたデータの送信試行直後に発生します。'success'(成功したかどうかを示す bool 値)と、送信されたバイト数である 'byteCount'(int 型)を含む SerializationResult 構造体を返します。

OnSpawn

このイベントは非推奨です。プールからオブジェクトが「スポーン(Spawned)」されたときに何かを行いたい場合は、通常の OnEnabled イベントを使用してください。

OnOwnershipRequest

このイベントは、誰かがオーナー権限の取得を要求したときに発生します。これには、要求者(Requester)と要求されたオーナー(Requested Owner)の PlayerObject が含まれます。変更を承認または拒否するには、"Set Return Value" ノードにブール値を設定してください。このロジックは要求者とオーナーの両方でローカルに実行されるため、両者の間でロジックの不一致があると非同期(desync)の原因となることに注意してください。これは、オーナー側でオーナー権限の譲渡が予期せず拒否される形で現れる可能性が最も高いです。

OnOwnershipTransferred

このイベントは、オブジェクトのオーナー権限が変更された際にインスタンス内の全員に対して発生し、新しいオーナーの PlayerObject が含まれます。

OnMasterTransferred

このイベントは、前のインスタンスマスターが退室したことによりインスタンスマスターが変更された際、インスタンス内の全員に対して発生します。 このイベントにはパラメータとして newMaster, が含まれており、これはマスターになったプレイヤーの VRC Player API オブジェクトです。このパラメータは常に有効です。 新しいインスタンスに参加する最初のユーザーについては、マスター状態が「なし」から移譲されたことを示すために、OnPlayerJoined の後にこのイベントが発生します。

OnVariableChanged

これは、あらゆる変数に対して作成できる特殊なタイプのイベントです。Udon Graph では、Alt キーを押しながら変数をグラフにドラッグ&ドロップすることで作成できます。このイベントは、他のプレイヤーから同期変数を受け取った場合など、変数が変化したことを検知します。

VRC Object Sync

このコンポーネントは、適用したオブジェクトのTransform(位置、回転、スケール)とRigidbody(物理演算)を自動的に同期します。アクセス可能な特別なメソッドとプロパティがいくつかあります。

FlagDiscontinuity

オブジェクトをテレポートさせたいときにこれをトリガーします。このフレームで行った変更は、補間なしで即座に適用されます。

Set/Get Gravity

Gravityがオンの場合、このRigidbodyは重力の影響を受け、地面に落下します。通常、GravityはRigidbodyのプロパティですが、VRCObjectSyncを使用している場合、このプロパティはVRCObjectSyncコンポーネントによって制御される必要があります。これらの関数を使用して操作してください。これは同期変数のように機能するため、OwnerのみがGravityを設定できます。

Set/Get Kinematic

Kinematicがオンの場合、このRigidbodyは力、衝突、ジョイントを無視します。通常、KinematicはRigidbodyのプロパティですが、VRCObjectSyncを使用している場合、このプロパティはVRCObjectSyncコンポーネントによって制御される必要があります。これらの関数を使用して操作してください。これは同期変数のように機能するため、OwnerのみがKinematicを設定できます。

Respawn

このオブジェクトを初期状態の位置(Position)と回転(Rotation)にテレポートさせ、速度(Velocity)をリセットします。 具体的には、DiscontinuityHint をtrueに設定し、以下の変更をスムーズに行うのではなく即座に行うようにします。その上で、以下の処理を行います。

オブジェクトにRigidbodyがある場合:

VRC Object Pool

VRC Object Pool は、ゲームオブジェクトの配列を管理するための軽量な手法を提供します。このプールは、保持している各オブジェクトのアクティブ状態を管理・同期します。

オブジェクトをアクティブにするには、プールの Owner が TryToSpawn ノードを実行します。これにより、アクティブ化されたオブジェクトが返されます。利用可能なオブジェクトがない場合は、null オブジェクトが返されます。オブジェクトはプールの Owner によって Return ノード経由でプールに戻すことができ、その際に自動的に無効化されます。

途中から参加したプレイヤーに対しても、オブジェクトは必要に応じて自動的にアクティブまたは非アクティブの状態が同期されます。

最終更新: