using System.ComponentModel; using UnityEngine; using UnityEngine.InputSystem; #if AR_FOUNDATION_PRESENT using UnityEngine.XR.ARFoundation; #endif namespace UnityEditor.XR.Interaction.Toolkit { /// /// A helper class for , isolating the creation logic for Main Cameras into /// a separate file. /// static class XRMainCameraFactory { internal static Camera CreateXRMainCamera(CreateUtils.HardwareTarget target) { switch (target) { case CreateUtils.HardwareTarget.VR: return CreateVRMainCamera(); case CreateUtils.HardwareTarget.MobileAR: return CreateARMainCamera(); default: throw new InvalidEnumArgumentException($"Invalid {nameof(CreateUtils.HardwareTarget)}: {target}"); } } static Camera CreateVRMainCamera() { var camera = CreateMainCamera(); camera.nearClipPlane = 0.01f; SetupTrackedPoseDriverInput(camera); return camera; } static Camera CreateARMainCamera() { var mainCam = Camera.main; if (mainCam != null) { Debug.LogWarningFormat( mainCam.gameObject, "XR Origin Main Camera requires the \"MainCamera\" tag, but the current scene contains another enabled Camera tagged \"MainCamera\". For AR to function properly, remove the \"MainCamera\" tag from \'{0}\' or disable it.", mainCam.name); } var camera = CreateMainCamera(); camera.clearFlags = CameraClearFlags.Color; camera.backgroundColor = Color.black; camera.nearClipPlane = 0.1f; camera.farClipPlane = 20f; #if AR_FOUNDATION_PRESENT var cameraGo = camera.gameObject; cameraGo.AddComponent(); cameraGo.AddComponent(); #endif SetupTrackedPoseDriverInput(camera); return camera; } static Camera CreateMainCamera() { var cameraGo = ObjectFactory.CreateGameObject( "Main Camera", typeof(Camera), typeof(AudioListener)); var camera = cameraGo.GetComponent(); camera.tag = "MainCamera"; return camera; } static void SetupTrackedPoseDriverInput(Camera camera) { var trackedPoseDriver = camera.gameObject.AddComponent(); var positionAction = new InputAction("Position", binding: "/centerEyePosition", expectedControlType: "Vector3"); positionAction.AddBinding("/devicePosition"); var rotationAction = new InputAction("Rotation", binding: "/centerEyeRotation", expectedControlType: "Quaternion"); rotationAction.AddBinding("/deviceRotation"); var trackingStateAction = new InputAction("Tracking State", binding: "/trackingState", expectedControlType: "Integer"); trackedPoseDriver.positionInput = new InputActionProperty(positionAction); trackedPoseDriver.rotationInput = new InputActionProperty(rotationAction); trackedPoseDriver.trackingStateInput = new InputActionProperty(trackingStateAction); trackedPoseDriver.ignoreTrackingState = false; } } }