概要
オーバーレイUIに合わせてカメラの画面描画範囲を制御したい
結論
カメラのViewport値を設定することで実現できる.UI (RectTransform) から取得したViewport領域をカメラに設定する.
詳細
RectTransformからviewport値を取得する
ビューポート座標は画面左下を ( x, y ) = ( 0, 0 )、 画面右上を ( x, y ) = ( 1, 1 ) とした座標値.
RectTransform.GetWorldCorners()で四隅のワールド座標が取得できるので、これと画面サイズからビューポート座標を計算する.
※もしOverlay以外のRenderModeに対応したい場合、GraphicRaycaster.csのRaycast()の実装が参考になる
【参考】
カメラのviewport値に設定する
Camera.rectに要素の値域が0~1のRectを代入することで、viewport設定が行える.
// ビューポート値を計算 (※canvasはOverlayを想定)
var viewportRect = RectTransform.GetViewportRect();
// カメラのプロパティに設定する
Camera.rect = viewportRect;
(X,Y) = (0,0) / (W,H) = (1,1) の場合
(X,Y) = (0.2,0.1) / (W,H) = (0.7,0.5) の場合
【注意点】
アクティブなカメラが一つのみの場合、Viewportを変更した際にカメラの非描画領域(ビューポート外)の画面ピクセルがクリアされないという問題が発生した.(※エディタモードのときはバッファがクリアされる)
対策として背景描画用のカメラ(CullingMask = nothing, Priority = -10)を配置して、画面の描画を行うようにした.