|
|
- // Frames Per Second Canvas|Prefabs|0030
- namespace VRTK
- {
- using UnityEngine;
- using UnityEngine.UI;
-
- /// <summary>
- /// Provides a frames per second text element to the HMD view. To use the prefab it must be placed into the scene then the headset camera needs attaching to the canvas:
- /// </summary>
- /// <remarks>
- /// **Prefab Usage:**
- /// * Place the `VRTK/Prefabs/FramesPerSecondCanvas/FramesPerSecondCanvas` prefab in the scene hierarchy.
- ///
- /// > This script is largely based on the script at: http://talesfromtherift.com/vr-fps-counter/ So all credit to Peter Koch for his work. Twitter: @peterept
- /// </remarks>
- /// <example>
- /// `VRTK/Examples/018_CameraRig_FramesPerSecondCounter` displays the frames per second in the centre of the headset view. Pressing the trigger generates a new sphere and pressing the touchpad generates ten new spheres. Eventually when lots of spheres are present the FPS will drop and demonstrate the prefab.
- /// </example>
- public class VRTK_FramesPerSecondViewer : MonoBehaviour
- {
- [Tooltip("Toggles whether the FPS text is visible.")]
- public bool displayFPS = true;
- [Tooltip("The frames per second deemed acceptable that is used as the benchmark to change the FPS text colour.")]
- public int targetFPS = 90;
- [Tooltip("The size of the font the FPS is displayed in.")]
- public int fontSize = 32;
- [Tooltip("The position of the FPS text within the headset view.")]
- public Vector3 position = Vector3.zero;
- [Tooltip("The colour of the FPS text when the frames per second are within reasonable limits of the Target FPS.")]
- public Color goodColor = Color.green;
- [Tooltip("The colour of the FPS text when the frames per second are falling short of reasonable limits of the Target FPS.")]
- public Color warnColor = Color.yellow;
- [Tooltip("The colour of the FPS text when the frames per second are at an unreasonable level of the Target FPS.")]
- public Color badColor = Color.red;
-
- protected const float updateInterval = 0.5f;
- protected int framesCount;
- protected float framesTime;
- protected Canvas canvas;
- protected Text text;
-
- protected virtual void OnEnable()
- {
- VRTK_SDKManager.SubscribeLoadedSetupChanged(LoadedSetupChanged);
- InitCanvas();
- }
-
- protected virtual void OnDisable()
- {
- if (!gameObject.activeSelf)
- {
- VRTK_SDKManager.UnsubscribeLoadedSetupChanged(LoadedSetupChanged);
- }
- }
-
- protected virtual void Update()
- {
- framesCount++;
- framesTime += Time.unscaledDeltaTime;
-
- if (framesTime > updateInterval)
- {
- if (text != null)
- {
- if (displayFPS)
- {
- float fps = framesCount / framesTime;
- text.text = string.Format("{0:F2} FPS", fps);
- text.color = (fps > (targetFPS - 5) ? goodColor :
- (fps > (targetFPS - 30) ? warnColor :
- badColor));
- }
- else
- {
- text.text = "";
- }
- }
- framesCount = 0;
- framesTime = 0;
- }
- }
-
- protected virtual void LoadedSetupChanged(VRTK_SDKManager sender, VRTK_SDKManager.LoadedSetupChangeEventArgs e)
- {
- if (this != null && VRTK_SDKManager.ValidInstance() && gameObject.activeInHierarchy)
- {
- SetCanvasCamera();
- }
- }
-
- protected virtual void InitCanvas()
- {
- canvas = transform.GetComponentInParent<Canvas>();
- text = GetComponent<Text>();
-
- if (canvas != null)
- {
- canvas.planeDistance = 0.5f;
- }
-
- if (text != null)
- {
- text.fontSize = fontSize;
- text.transform.localPosition = position;
- }
- SetCanvasCamera();
- }
-
- protected virtual void SetCanvasCamera()
- {
- Transform sdkCamera = VRTK_DeviceFinder.HeadsetCamera();
- if (sdkCamera != null)
- {
- canvas.worldCamera = sdkCamera.GetComponent<Camera>();
- }
- }
- }
- }
|