// Copyright (c) 2024 Vuplex Inc. All rights reserved. // // Licensed under the Vuplex Commercial Software Library License, you may // not use this file except in compliance with the License. You may obtain // a copy of the License at // // https://vuplex.com/commercial-library-license // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. using UnityEngine; #if UNITY_2017_2_OR_NEWER using UnityEngine.XR; #else using XRSettings = UnityEngine.VR.VRSettings; #endif namespace Vuplex.Demos { /// /// Script that makes it so that you can move the camera by holding down the control key on your /// keyboard and moving your mouse. When running on a device /// with a gyroscope, the gyroscope controls the camera rotation instead. /// class CameraRotator : MonoBehaviour { public GameObject InstructionMessage; private bool _legacyInputManagerDisabled; Vector2 _rotationFromMouse; // Disable this functionality in the WebGL player because it causes the following error in Safari in Unity 2021.3 and newer: "ReferenceError: Can't find variable: DeviceOrientationEvent". #if !UNITY_WEBGL void Start() { // If XR is disabled, enable the gyro so that it can be used to control the camera rotation. if (!XRSettings.enabled) { Input.gyro.enabled = true; } #if ENABLE_INPUT_SYSTEM && !ENABLE_LEGACY_INPUT_MANAGER _legacyInputManagerDisabled = true; #endif // Show the instruction tip in the editor. if (Application.isEditor && InstructionMessage != null && !_legacyInputManagerDisabled) { InstructionMessage.SetActive(true); } else { InstructionMessage = null; } } /// /// If the device has a gyroscope, it is used to control the camera /// rotation. Otherwise, the user can hold down the control key on /// the keyboard to make the mouse control camera rotation. /// void Update() { // Dismiss the instruction message on the first click. if (InstructionMessage != null && !_legacyInputManagerDisabled && Input.GetMouseButtonDown(0)) { InstructionMessage.SetActive(false); InstructionMessage = null; } if (XRSettings.enabled) { // XR is enabled, so let the XR SDK control camera rotation instead. return; } if (SystemInfo.supportsGyroscope) { Camera.main.transform.Rotate( -Input.gyro.rotationRateUnbiased.x, -Input.gyro.rotationRateUnbiased.y, Input.gyro.rotationRateUnbiased.z ); } else if (!_legacyInputManagerDisabled && (Input.GetKey(KeyCode.LeftControl) || Input.GetKey(KeyCode.RightControl))) { float sensitivity = 10f; float maxYAngle = 80f; _rotationFromMouse.x += Input.GetAxis("Mouse X") * sensitivity; _rotationFromMouse.y -= Input.GetAxis("Mouse Y") * sensitivity; _rotationFromMouse.x = Mathf.Repeat(_rotationFromMouse.x, 360); _rotationFromMouse.y = Mathf.Clamp(_rotationFromMouse.y, -maxYAngle, maxYAngle); Camera.main.transform.rotation = Quaternion.Euler(_rotationFromMouse.y, _rotationFromMouse.x, 0); } } #endif } }