VRCCameraSettings
ユーザーのスクリーンカメラ、ハンドヘルドカメラ、およびUnityのグローバル品質設定に関する情報や限定的な制御機能を、ここに記載するAPIを通じて公開します。
以下の静的アクセサを通じて、このクラスの2つのインスタンスにアクセスできます。
VRCCameraSettings.ScreenCamera: ユーザーのスクリーンカメラ。つまり、現在の視点をレンダリングしているカメラです(ユーザーがVR環境の場合はステレオカメラになります)。VRCCameraSettings.PhotoCamera: ユーザーのハンドヘルドフォトカメラ。このインスタンスのプロパティは、ユーザーがカメラを有効にしている場合にのみ更新されます。確認にはActiveプロパティを使用してください。また、このプロパティは常にプレビュー画像をレンダリングしているカメラを指す点に注意してください。実際に撮影を行うカメラやストリームカメラの表示用カメラではありません(ただし、ほとんどのプロパティはシャッターが押されるたびにそれらのカメラと同期されます)。- ⚠️ ClientSimでは、フォトカメラが利用できないため、このプロパティは
nullになります。実際のVRChatクライアントではnullになることはありません。
- ⚠️ ClientSimでは、フォトカメラが利用できないため、このプロパティは
これらの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 を確認することが推奨されます。
Active が false の場合、Position や Rotation といったTransformデータはすべて0になります。その際、Forward/Up/Right はそれぞれ Vector3.forward/up/right を返します。
現在 read-write として公開されています:
float NearClipPlaneおよびfloat FarClipPlane: 実行時にカメラのクリッピング平面を調整できます。これにはシーン記述子(Scene Descriptor)のReference Camera経由で設定する場合と同様の制限があります。NearClipPlaneは、ユーザーの「Forced Camera Near Distance(強制カメラ近接距離)」設定によって調整される場合があります。設定後に値を読み戻すことで、この調整が行われたかどうかを検知できます。NearClipPlaneは0.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:ClearFlagsがSolidColorに設定されている場合に使用される色です。
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モードでドローンを操縦している状態です。 |
Unknown | Active が false の場合に設定されます。 |
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が格納され、externalComponentはnullになります。 - ワールド内のカスタムカメラがレンダリングされている場合、
internalComponentはnullになり、externalComponentにはUnityEngine.Cameraコンポーネントが格納されます。 Camera.currentがnullの場合、または Udon がアクセスできないカメラ(アバター上のUnityEngine.Cameraなど)がレンダリングされている場合、両方の結果はnullになります。⚠️ レンダリングイベント中であっても、この関数はいつでも両方の結果に対してnullを返す可能性があります。これは VRChat が内蔵メニュー用などの内部レンダリングステップを使用しているためです。Udon スクリプトでこのケースを必ず処理してください!
- 既知の内部カメラがレンダリングされている場合、
OnChanged イベント
「Near Clip Override」など、特定のグラフィック設定がユーザーによって変更されると、OnVRCCameraSettingsChanged イベントがトリガーされます。
このイベントは毎フレーム、あるいは1フレーム中に複数回発生する可能性があります。パフォーマンスへの影響を避けるため、処理は最小限に留めることを推奨します。
例
- Udon Graph
UdonSharp

using TMPro;
using UdonSharp;
using UnityEngine;
using UnityEngine.UI;
using VRC.SDK3.Rendering;
public class CameraInfoDisplay : UdonSharpBehaviour
{
[SerializeField] private TextMeshProUGUI info;
void Start()
{
// call it once to initialize
OnVRCCameraSettingsChanged(VRCCameraSettings.ScreenCamera);
Debug.Log($"Started CameraInfoDisplay at resolution of {VRCCameraSettings.ScreenCamera.PixelWidth}x{VRCCameraSettings.ScreenCamera.PixelHeight}");
Debug.Log($"The handheld photo camera is {(VRCCameraSettings.PhotoCamera.Active ? "enabled" : "disabled")}");
}
// will be called if resolution or a couple other properties change
public override void OnVRCCameraSettingsChanged(VRCCameraSettings camera)
{
// ignore handheld photo camera
if (camera != VRCCameraSettings.ScreenCamera)
return;
info.text = $"{camera.PixelWidth}x{camera.PixelHeight} fov={camera.FieldOfView} frame={Time.frameCount}°";
}
}
最終更新: