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

プレイヤー

ClientSimにおけるプレイヤーの表現は、CyanEmuと比較して多くのコンポーネントに分割されました。各コンポーネントはプレイヤーの異なる側面を担当します。以下に、LocalプレイヤーとRemoteプレイヤーのプレハブの階層構造を示します。 Local Player HierarchyRemote Player Hierarchy

ClientSimPlayer

ClientSimPlayer クラスは、プレイヤーに関するあらゆるシステムを保持するコンテナです。ローカルプレイヤーとリモートプレイヤーの両方に ClientSimPlayer は存在しますが、初期化されるのはローカルプレイヤーのみです。リモートプレイヤーのシステムは、AvatarVRCPlayerApi で変更可能なデータを除き、すべて空のままとなります。ClientSimPlayer は、Player プレハブの最上位オブジェクトにある最初のコンポーネントです。インスペクターでは、実行時に Locomotion Settings や Audio Settings といった VRCPlayerApi データを表示および変更できます。

TrackingProvider

TrackingProvider インターフェースは、プレイヤーのトラッキングデータをどのように制御するかを定義するための汎用的な手法です。抽象クラスである TrackingProviderBase は、頭部、手、およびプレイスペースの位置データを提供し、頭部の高さに基づいてプレイヤーの現在の姿勢を決定します。トラッキングプロバイダーのスケールを変更することでプレイヤーのカメラを上下に移動させることができ、さまざまなプレイヤーアバターのシナリオをテストするのに役立ちます。このクラスは PlayerHeightUpdate イベントをリッスンし、要求されたプレイヤーの高さに基づいて新しいトラッキングスケールを計算します。デフォルトのアバターの高さは 1.9 であり、これが TrackingScale 1 に相当します。このクラスは抽象クラスであるため、ClientSim で使用するには継承して実装する必要があります。現在、ClientSim に含まれているのは DesktopTrackingProvider のみです。ClientSim で VR を実装するには、新しい VRTrackingProvider が必要になります。トラッキングプロバイダーは PlayerController の子要素であることを想定していますが、プレイスペースの x/z オフセットが PlayerController に適用されないため、VR を実装する際には再検討が必要です。

DesktopTrackingProvider

現在 ClientSim で実装されている唯一の TrackingProvider です。このトラッキングプロバイダーは、カメラに対する手の位置を固定します。カメラの高さは Crouch and Prone Input Events に基づいて変更されます。このトラッキングプロバイダーは毎フレーム、視点操作入力の変化を確認し、カメラの x 回転(上下)を更新します。プレイヤーがステーションに座っている場合、頭部の y 回転がロック解除され、プレイスペースの回転から最大 90 度まで左右を見渡せるようになります。

PlayerController

PlayerController は現在、プレイヤーの移動のみを制御します。CyanEmu では PlayerController クラスがプレイヤーに関連するすべての要素を網羅していましたが、現在はこれらのシステムが分離され、PlayerController はプレイヤーの移動処理のみに特化するようになりました。このコントローラーは毎フレーム、移動入力および TrackingProvider の姿勢を確認し、そのフレームでプレイヤーがどの程度移動すべきかを判断します。

PlayerStationManager

PlayerStationManager は、プレイヤーがステーションとどのようにやり取りするかを管理します。プレイヤーが現在乗っているステーションや、プレイヤーがそのステーションに固定されているかどうかを保持します。ステーションに固定されている間、すべての UpdateLateUpdateFixedUpdate メソッドのフレーム終了時に、PlayerController の位置がステーションの位置に更新されます。これは、ステーションの位置を変更する他のすべてのスクリプトが先に実行されるようにするため、フレームの最後に行われます。

InteractManager

InteractManagerは、特定の GameObject がインタラクト可能かどうかを判定し、インタラクションを実行する役割を担います。TrackingProvider の現在の TrackingScale と各インタラクトの proximity の値を使用して、プレイヤーがインタラクト可能な距離を計算します。

Raycaster

ClientSimのインタラクト検出は、Raycasterを通じて処理されます。このシステムは Physics.Raycast で使用される提供されたレイに基づき、Interactableを検索します。レイキャスト時にどのレイヤーを考慮すべきかを確認するために InteractiveLayerProvider が使用されます。ヒットしたすべてのオブジェクトは、見つかったコンポーネントに基づいてフィルタリングされます。UIShape を持つオブジェクトが常に優先されます。オブジェクト上でインタラクト可能なコンポーネントを特定するために InteractManager が使用されます。各レイキャストに対して RaycastResult が返されます。これには、レイ、ヒットしたオブジェクト、およびインタラクト可能なタイプ(存在する場合)に関する情報が含まれます。

RayProvider

Raycasterは、レイキャストを行う方向と原点を知るために RayProvider を使用します。RayProvider は、詳細な情報を知ることなくレイを提供するための汎用的な手段です。ClientSimには2つの RayProvider が実装されています。

CameraRayProvider

カメラと現在のマウス位置から、カメラからマウスを通るレイを作成します。これは TrackingProvider がVR以外に設定されている場合に使用される RayProvider です。

TransformRayProvider

トランスフォームから、その位置と前方方向に基づいた Ray を作成します。これは TrackingProvider がVRに設定されているときに、手からレイキャストを行うために使用されます。

PlayerRaycaster

PlayerRaycasterは、ワールド内のインタラクト対象を探索し、その結果に基づいてイベントを送信する役割を担います。また、左右両方の PlayerHand システムの更新も行います。初期化時に、PlayerRaycasterは左右の手それぞれに対して、2つの Raycasters を作成します。もし TrackingProvider がVRではない(デスクトップモードである)場合、右手にはマウスベースの RayProvider を使用するRaycasterが割り当てられます。左手はVR環境以外では使用されないため、初期化されません。TrackingProvider がVRモードであれば、左右両方のRaycasterは、TrackingProviderのハンドトランスフォームを使用したトランスフォームベースのRayProviderで初期化されます。毎フレーム、両手のRaycasterシステムが更新されてInteractable(インタラクト可能オブジェクト)を探索し、その結果が EventDispatcher を通じて送信されます。最後に発見されたインタラクト対象は、各手のホバー中インタラクト対象として保存されます。ホバー中のインタラクト対象が Pickupable である場合、その Pickupable は該当する PlayerHand のホバー中 Pickupable として設定されます。インタラクト対象にホバーしている状態で、該当する手の Use Input アクションが発生すると、ホバー中のオブジェクトに対してインタラクトが実行されます。

PlayerHand

PlayerHand システムは、Pickupable オブジェクトの管理を担います。PlayerRaycaster が現在ホバーされている Pickupable を設定し、PlayerHand がホバー中の Pickupable をいつ掴むかという Grab Input Events を監視します。また、PlayerHand は Use イベントや Drop イベントを監視し、現在保持しているアイテムに対してアクションを実行します。ピックアップが kinematic な場合、その位置は PlayerHandrigidbody のトランスフォームに合うよう毎フレーム直接設定されます。kinematic でない場合は、fixed joint を使用して PlayerHandrigidbody に固定されます。右手にアイテムを持っている間は、さまざまな Manipulate バインディングを使用してアイテムを操作できます。

PlayerAvatarManager

PlayerAvatarManager は、プレイヤーのアバターに関連する要素を管理します。ローカルプレイヤーとリモートプレイヤーの両方に Avatar Manager が存在します。すべてのプレイヤーのアバターの初期状態は VRChat Default Robot です。このマネージャーは、VRCPlayerApi に対してアバターの情報を提供する役割を担っています。GetBonePosition および GetBoneRotation は、Animator.GetBoneTransform のラッパーとしてここに実装されています。ローカルプレイヤーのアバターマネージャーのみが適切に初期化されており、TrackingScale の変更 Events をリッスンできます。これにより、新しいトラッキングスケールに合わせてアバターのスケールが更新されます。

レティクル

ClientSimReticle システムは、Unity の Game ウィンドウ中央にレティクル(照準)アイコンを表示する役割を担います。このシステムは DesktopTrackingProvider でのみ有効にする必要があります。レティクルは設定メニューから無効化可能です。中央のレティクルに加え、PlayerRaycaster が UIShape を持つオブジェクトに重なると、マウス位置にポインターを表示します。このポインターは画面中央に限定されず、マウスボタンを離している間も表示されます。マウスの位置は ClientSimBaseInput から提供されます。

最終更新: