ネットワークコンポーネント
このドキュメントでは、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 とは、オブジェクトがどれだけ過去の状態としてシミュレーションされているかを示すタイムスタンプです。この値は、VRCObjectSync や players の内部で使用されますが、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つのプロパティが含まれています。
sendTime: このメッセージが送信された時刻(秒単位)。receiveTime: このメッセージが受信された時刻(秒単位)。isFromStorage: true の場合、含まれているデータは他のリアルタイムクライアントから受信したものではなく、ストレージから復元されたものです。
sendTime と receiveTime はどちらも、あなたから見た 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 キーを押しながら変数をグラフにドラッグ&ドロップすることで作成できます。このイベントは、他のプレイヤーから同期変数を受け取った場合など、変数が変化したことを検知します。
- 配列の中身を変更しても、配列自体は同一であるため、このイベントは発生しません。
- OnVariableChanged は変数が書き込まれると即座に発生しますが、すべての同期変数の書き込みが完了した後に発生する OnDeserialization とは異なります。つまり、ある同期変数の OnVariableChanged を使用して別の同期変数の内容を取得しようとしても、その変数が最新の同期データで更新されているとは限らないということです。
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に設定し、以下の変更をスムーズに行うのではなく即座に行うようにします。その上で、以下の処理を行います。
- transform.position を初期位置に設定
- transform.rotation を初期回転に設定
オブジェクトにRigidbodyがある場合:
- rigidbody.velocity を Vector3.zero に設定
- rigidbody.angularVelocity を Vector3.zero に設定
- rigidbody.position を初期位置に設定
- rigidbody.rotation を初期回転に設定
VRC Object Pool
VRC Object Pool は、ゲームオブジェクトの配列を管理するための軽量な手法を提供します。このプールは、保持している各オブジェクトのアクティブ状態を管理・同期します。
オブジェクトをアクティブにするには、プールの Owner が TryToSpawn ノードを実行します。これにより、アクティブ化されたオブジェクトが返されます。利用可能なオブジェクトがない場合は、null オブジェクトが返されます。オブジェクトはプールの Owner によって Return ノード経由でプールに戻すことができ、その際に自動的に無効化されます。
途中から参加したプレイヤーに対しても、オブジェクトは必要に応じて自動的にアクティブまたは非アクティブの状態が同期されます。
最終更新: