VRコンテンツでのUI表示
VRにてUIを表示する際に、Cameraの設定はOrthographicでいいかなと思いましたが、どうやらVRコンテンツでは(google VRでは?)カメラの設定をOrthographicではなく、Perspectiveに設定するしかないようです。
Post Processingを使っている場合はその影響が出ないように、UI専用のCameraを作成しそちらをPerspectiveにし、そちらにCanvasのRenderModeをWorldSpaceに設定し、そのカメラの子オブジェクトにしました。
PerspectiveなCameraへUIをスケールを使ってフィットさせる方法は
#if !UNITY_EDITOR float screenW = Screen.width/2f; #else float screenW = Screen.width; #endif float screenH = Screen.height; RectTransform rect = this.uiCanvas.GetComponent<RectTransform>(); rect.sizeDelta = new Vector2(screenW, screenH); this.uiCanvas.renderMode = RenderMode.WorldSpace; this.uiCanvas.worldCamera = this.vrUICamera; this.uiCanvas.transform.SetParent(this.vrUICamera.transform, false); float pos = this.vrUICamera.nearClipPlane + 0.01f; this.uiCanvas.transform.position = this.vrUICamera.transform.position + this.vrUICamera.transform.forward * pos; float ratio = Mathf.Tan(this.vrUICamera.fieldOfView * Mathf.Deg2Rad * 0.5f) * pos * 2f / rect.sizeDelta.y; // Canvasをスクリーンサイズに合わせた際に、指定の位置でのカメラにフィットする倍率の計算 this.uiCanvas.transform.localScale = Vector3.one * ratio;
スケールではなく奥行きを合わせる場合は
#if !UNITY_EDITOR float screenW = Screen.width/2f; #else float screenW = Screen.width; #endif float screenH = Screen.height; RectTransform rect = this.uiCanvas.GetComponent<RectTransform>(); rect.sizeDelta = new Vector2(screenW, screenH); this.uiCanvas.renderMode = RenderMode.WorldSpace; this.uiCanvas.worldCamera = this.vrUICamera; this.uiCanvas.transform.SetParent(this.vrUICamera.transform, false); float frustumHeight = rect.sizeDelta.x / this.vrUICamera.aspect; float distance = frustumHeight * 0.5f / Mathf.Tan(this.vrUICamera.fieldOfView * 0.5f * Mathf.Deg2Rad); // Canvasのサイズがぴったりに奥行きの計算 // カメラのクリップ距離を調整 if (distance < this.vrUICamera.nearClipPlane) this.vrUICamera.nearClipPlane = distance - 0.1f; else if (distance > this.vrUICamera.farClipPlane) this.vrUICamera.farClipPlane = distance + 1f; this.uiCanvas.transform.localPosition = new Vector3(0f, 0f, distance);
コメントを残す