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

VRCCameraSettings

ユーザーのスクリーンカメラ、ハンドヘルドカメラ、およびUnityのグローバル品質設定に関する情報や限定的な制御機能を、ここに記載するAPIを通じて公開します。

以下の静的アクセサを通じて、このクラスの2つのインスタンスにアクセスできます。

  • VRCCameraSettings.ScreenCamera: ユーザーのスクリーンカメラ。つまり、現在の視点をレンダリングしているカメラです(ユーザーがVR環境の場合はステレオカメラになります)。
  • VRCCameraSettings.PhotoCamera: ユーザーのハンドヘルドフォトカメラ。このインスタンスのプロパティは、ユーザーがカメラを有効にしている場合にのみ更新されます。確認には Active プロパティを使用してください。また、このプロパティは常にプレビュー画像をレンダリングしているカメラを指す点に注意してください。実際に撮影を行うカメラやストリームカメラの表示用カメラではありません(ただし、ほとんどのプロパティはシャッターが押されるたびにそれらのカメラと同期されます)。
    • ⚠️ ClientSimでは、フォトカメラが利用できないため、このプロパティは null になります。実際のVRChatクライアントでは null になることはありません。
注意

これらの2つのプロパティは、内部で常に単一の実際の Camera コンポーネントを参照しているとは限りません。VRChatが複雑な処理を抽象化しているため、ユーザーがこの点を気にする必要は基本的にありませんが、念のため以下の点に留意してください。

  • Focus View カメラは、 VRCCameraSettings.ScreenCamera のプロパティを変更する際に影響を受けます。
  • 同様に、ハンドヘルドカメラを「Stream Camera」モードで開いている際に使用されるコンポーネントは、 VRCCameraSettings.PhotoCamera にアクセスする際に影響を受けます。
  • VRCCameraSettings.PhotoCamera は、Dolly Multi Cam設定で使用されるすべてのカメラにもリンクされていますが、 FieldOfView などの一部のプロパティはカメラ間で異なる場合があります。その場合、最初のカメラの設定が返されます。

高度な使用例として、この状態は CameraMode プロパティを介して読み取ることができます。

公開されているプロパティ

これらのインスタンスは、UnityのCameraクラスの特定のプロパティを公開します(詳細はUnityのドキュメントを参照してください)。安全上の理由から、生のCameraコンポーネントにはアクセスできません。ただし、ワールドに手動で配置したコンポーネントについては、Cameraクラスが公開されています。

現在読み取り専用として公開されているプロパティは以下の通りです:

  • Vector3 Position:ワールド空間での位置
  • Quaternion Rotation:ワールド空間での回転
  • Vector3 Forward:ワールド空間での前方ベクトル(便宜上のもの)
  • Vector3 Up:ワールド空間での上方ベクトル(便宜上のもの)
  • Vector3 Right:ワールド空間での右方ベクトル(便宜上のもの)
  • int PixelWidth および int PixelHeight:現在のレンダーターゲットのピクセル単位のサイズ(VRのスーパーサンプリング設定の影響を受ける場合があります)
  • float Aspect:現在のレンダーターゲットのアスペクト比
  • float FieldOfView:カメラの現在の垂直視野角(VRユーザーの場合、この値は不正確になる可能性があります)
  • bool Active: カメラが現在レンダリング中かどうかを示します。ScreenCamera の場合は常に true となり、PhotoCamera を介してハンドヘルドカメラを検出する際に便利です。また、Spoutストリーミングが有効な間は PhotoCamera でも true になります。
  • bool StereoEnabled: ユーザーがVR環境にいる場合、ScreenCamera に対して true を返します。VRユーザーの検出には、代わりに Player API を確認することが推奨されます。
注記

Activefalse の場合、PositionRotation といったTransformデータはすべて0になります。その際、Forward/Up/Right はそれぞれ Vector3.forward/up/right を返します。

現在 read-write として公開されています:

  • float NearClipPlane および float FarClipPlane: 実行時にカメラのクリッピング平面を調整できます。これにはシーン記述子(Scene Descriptor)のReference Camera経由で設定する場合と同様の制限があります。
    • NearClipPlane は、ユーザーの「Forced Camera Near Distance(強制カメラ近接距離)」設定によって調整される場合があります。設定後に値を読み戻すことで、この調整が行われたかどうかを検知できます。
    • NearClipPlane0.001 から 0.05 の間にクランプ(制限)されます。
    • FarClipPlane は、最低でも NearClipPlane + 0.1 以上の値に設定する必要があります。これより小さい値に設定した場合はクランプされます。
    • ユーザーの「Forced Camera Near Distance」設定が「Dynamic」になっている場合、FarClipPlane を調整すると NearClipPlane も調整されることがあります。
  • bool AllowHDR: カメラがレンダーターゲットに対してHDR値を出力するかどうか。
  • DepthTextureMode DepthTextureMode: カメラの深度テクスチャレンダリングを有効にするために使用できます。これは特定のシェーダーエフェクトに役立ちます。また、シャドウが有効なリアルタイムライトの代わりに、カメラの深度テクスチャを強制的に生成させる目的でも使用可能です。ただし、シーン内にそのようなライトが存在しても DepthTextureMode プロパティの値は変化しないことに注意してください。つまり、このプロパティから None という値が読み取られたとしても、シーン内に深度パスのレンダリングを強制する深度ライトが存在しないことを意味するわけではありません。PhotoCamera では常に DepthTextureMode.Depth が有効になっており、無効化することはできませんが、他のオプションを追加することは可能です。
  • bool UseOcclusionCulling: レンダリング時にカメラがオクルージョンカリングを使用するかどうかを指定します。デフォルトは true ですが、ワールドにベイク済みのオクルージョンデータが存在する場合にのみ効果を発揮します。
  • bool AllowMSAA: false に設定すると、ユーザー設定に関わらずこのカメラでのMSAA(アンチエイリアシング)をすべて無効にします。デフォルトは true で、この場合ユーザーのグラフィック設定が適用されます。
  • LayerMask CullingMask: メインカメラでレンダリングするレイヤーを設定します。このプロパティのセッターは ScreenCamera 以外で呼び出すと例外をスローします。reserved レイヤーMirrorReflection、および InternalUI は変更できません。なお、カメラスタッキングの影響で、InternalUI は一部のプラットフォームにおいて表示されていても 0 と読み取られる場合があることに注意してください。
  • CameraClearFlags ClearFlags: このカメラのレンダリング時に使用する背景のクリアモードを設定します。
    • Color BackgroundColor: ClearFlagsSolidColor に設定されている場合に使用される色です。
  • bool LayerCullSpherical: Unity Docs を参照してください。 このAPIはUIのカリングに問題を引き起こすため、現在Udonでは無効化されています。設定しても何も起こりません(no-op)。
  • float[] LayerCullDistances: Unity Docs を参照してください。配列には、GameObjectのレイヤーに対応する32個の要素が必要です。レイヤーの値に 0 を指定すると、そのレイヤーには FarClipPlane の値が使用されます。このプロパティに null を設定することは、すべてのレイヤーに 0 を渡すことと同じです。
    • FarClipPlane と同様に、この値は最小で NearClipPlane + 0.1 にクランプされます。reserved レイヤー および InternalUI は変更できず、常に 0 として読み取られます。

Camera Mode

CameraMode プロパティは ScreenCamera および PhotoCamera で利用可能です。

ScreenCamera には以下のカメラモードがあります:

モード説明
Screenユーザーの現在の視点をレンダリングするためのデフォルトモードです。
FocusViewモバイルデバイスで Focus View が有効な場合に動作します。

PhotoCamera には以下のカメラモードがあります:

モード説明
PhotoOrVideoカメラが写真またはストリームモードです。絵文字やスタンプなどのモードが含まれます。
Printカメラの「プリント」スキンが有効な状態です。
DroneHandheldカメラがドローンモードです。
DroneFPVユーザーがFPVモードでドローンを操縦している状態です。
UnknownActivefalse の場合に設定されます。

Static functions

主にVRユーザー向けに、 VRCCameraSettings では以下の2つの静的関数が公開されています:

  • Vector3 GetEyePosition(Camera.StereoscopicEye eye): 指定した目のワールド空間における位置を返します。非VRユーザーにおける ScreenCamera.Position と同等です。
  • Quaternion GetEyeRotation(Camera.StereoscopicEye eye): 指定した目のワールド空間における回転を返します。非VRユーザーにおける ScreenCamera.Rotation と同等です。

加えて、汎用的な関数が1つ存在します:

  • void GetCurrentCamera(out VRCCameraSettings internalComponent, out Camera externalComponent): これは、レンダリングイベント中にのみ値が設定される Camera.current の代わりとなるものです。
    • 既知の内部カメラがレンダリングされている場合、internalComponent には VRCCameraSettings.ScreenCamera または VRCCameraSettings.PhotoCamera が格納され、externalComponentnull になります。
    • ワールド内のカスタムカメラがレンダリングされている場合、internalComponentnull になり、externalComponent には UnityEngine.Camera コンポーネントが格納されます。
    • Camera.currentnull の場合、または Udon がアクセスできないカメラ(アバター上の UnityEngine.Camera など)がレンダリングされている場合、両方の結果は null になります。⚠️ レンダリングイベント中であっても、この関数はいつでも両方の結果に対して null を返す可能性があります。これは VRChat が内蔵メニュー用などの内部レンダリングステップを使用しているためです。Udon スクリプトでこのケースを必ず処理してください!

OnChanged イベント

「Near Clip Override」など、特定のグラフィック設定がユーザーによって変更されると、OnVRCCameraSettingsChanged イベントがトリガーされます。

このイベントは毎フレーム、あるいは1フレーム中に複数回発生する可能性があります。パフォーマンスへの影響を避けるため、処理は最小限に留めることを推奨します。

起動時および変更されるたびに画面サイズとFOVを出力するUdonグラフ。

最終更新: