using UnityEngine; using System.Collections; namespace Gaia { public class FrameRateManager : MonoBehaviour { //Quality manager related public bool m_showFPS = true; public bool m_showGUI = true; public bool m_autoQualityManagement = true; public float m_autoCheckInterval = 10f; public int m_targetFrameRate = 60; public int m_fontSize = 25; private float m_autoCheckTimeLeft = 0f; private int m_currentQuality = 0; private int m_maxQuality = 1; private string[] m_qualityNames; //FPS Related private float m_fpsUpdateInterval = 0.5f; private float m_fpsAccum = 0; private int m_fpsFrames = 0; private float m_fpsTimeLeft; private float m_fpsValue = 0f; private string m_fpsValueStr = string.Empty; private GUIStyle m_fpsStyle = new GUIStyle(); private GUIStyle m_fpsShadowStyle = new GUIStyle(); private Rect m_fpsLocation = new Rect(5, 5, 100, 25); private Rect m_fpsShadowLocation = new Rect(5 + 1, 5 + 1, 100, 25); void Start() { Application.targetFrameRate = m_targetFrameRate; m_maxQuality = QualitySettings.names.Length - 1; m_qualityNames = QualitySettings.names; m_currentQuality = QualitySettings.GetQualityLevel(); m_autoCheckTimeLeft = m_autoCheckInterval; Debug.Log("Current quality is " + m_qualityNames[m_currentQuality]); //Increase the size of FPS m_fpsStyle.fontSize = m_fontSize; m_fpsShadowStyle.fontSize = m_fontSize; m_fpsTimeLeft = m_fpsUpdateInterval; m_fpsLocation = new Rect(Screen.width - 250, 5, 100, 25); m_fpsShadowLocation = new Rect(Screen.width - 250 + 1, 5 + 1, 100, 25); } void OnGUI() { if (!m_showFPS && !m_showGUI) { return; } if (m_showFPS) { GUI.Label(m_fpsShadowLocation, m_fpsValueStr, m_fpsShadowStyle); GUI.Label(m_fpsLocation, m_fpsValueStr, m_fpsStyle); } if (m_showGUI) { GUILayout.BeginVertical(); for (int i = 0; i <= m_maxQuality; i++) { if (GUILayout.Button(m_qualityNames[i])) { QualitySettings.SetQualityLevel(i, true); m_currentQuality = i; UpdateQuality(); m_autoQualityManagement = false; //Assume you are manually handling quality management } } GUILayout.EndVertical(); } } void Update() { m_fpsTimeLeft -= Time.deltaTime; m_fpsAccum += Time.timeScale / Time.deltaTime; ++m_fpsFrames; // Interval ended - update GUI text and start new interval if (m_fpsTimeLeft <= 0.0f) { m_fpsValue = m_fpsAccum / m_fpsFrames; if (m_fpsValue < 30) m_fpsStyle.normal.textColor = Color.yellow; else if (m_fpsValue < 10) m_fpsStyle.normal.textColor = Color.red; else m_fpsStyle.normal.textColor = Color.green; m_fpsValueStr = System.String.Format("{0:f0} {1}", m_fpsValue, m_qualityNames[m_currentQuality].Substring(0, 3)); m_fpsTimeLeft = m_fpsUpdateInterval; m_fpsAccum = 0.0F; m_fpsFrames = 0; } if (m_autoQualityManagement) { m_autoCheckTimeLeft -= Time.deltaTime; if (m_autoCheckTimeLeft < 0.0f) { if ((m_fpsValue + 10f) >= m_targetFrameRate) { IncreaseQuality(); } else if ((m_fpsValue - 10f) <= m_targetFrameRate) { DecreaseQuality(); } m_autoCheckTimeLeft = m_autoCheckInterval; } } } void UpdateQuality() { //Dont change the settings if there is no change in quality if (QualitySettings.GetQualityLevel() == m_currentQuality) { return; } Debug.Log("Changing quality to " + m_qualityNames[m_currentQuality]); //Update the terrain quality settings switch (m_currentQuality) { case 0: Terrain.activeTerrain.treeDistance = 250.0f; Terrain.activeTerrain.treeBillboardDistance = 30.0f; Terrain.activeTerrain.treeCrossFadeLength = 5.0f; Terrain.activeTerrain.treeMaximumFullLODCount = 5; Terrain.activeTerrain.detailObjectDistance = 40.0f; Terrain.activeTerrain.detailObjectDensity = 0.1f; Terrain.activeTerrain.heightmapPixelError = 20.0f; Terrain.activeTerrain.heightmapMaximumLOD = 1; Terrain.activeTerrain.basemapDistance = 100.0f; break; case 1: Terrain.activeTerrain.treeDistance = 500.0f; Terrain.activeTerrain.treeBillboardDistance = 50.0f; Terrain.activeTerrain.treeCrossFadeLength = 10.0f; Terrain.activeTerrain.treeMaximumFullLODCount = 10; Terrain.activeTerrain.detailObjectDistance = 50.0f; Terrain.activeTerrain.detailObjectDensity = 0.25f; Terrain.activeTerrain.heightmapPixelError = 10.0f; Terrain.activeTerrain.heightmapMaximumLOD = 1; Terrain.activeTerrain.basemapDistance = 250.0f; break; case 2: Terrain.activeTerrain.treeDistance = 650.0f; Terrain.activeTerrain.treeBillboardDistance = 75.0f; Terrain.activeTerrain.treeCrossFadeLength = 25.0f; Terrain.activeTerrain.treeMaximumFullLODCount = 20; Terrain.activeTerrain.detailObjectDistance = 60.0f; Terrain.activeTerrain.detailObjectDensity = 0.4f; Terrain.activeTerrain.heightmapPixelError = 8.0f; Terrain.activeTerrain.heightmapMaximumLOD = 0; Terrain.activeTerrain.basemapDistance = 500.0f; break; case 3: Terrain.activeTerrain.treeDistance = 800.0f; Terrain.activeTerrain.treeBillboardDistance = 100.0f; Terrain.activeTerrain.treeCrossFadeLength = 40.0f; Terrain.activeTerrain.treeMaximumFullLODCount = 30; Terrain.activeTerrain.detailObjectDistance = 80.0f; Terrain.activeTerrain.detailObjectDensity = 0.7f; Terrain.activeTerrain.heightmapPixelError = 5.0f; Terrain.activeTerrain.heightmapMaximumLOD = 0; Terrain.activeTerrain.basemapDistance = 800.0f; break; case 4: Terrain.activeTerrain.treeDistance = 1000.0f; Terrain.activeTerrain.treeBillboardDistance = 150.0f; Terrain.activeTerrain.treeCrossFadeLength = 50.0f; Terrain.activeTerrain.treeMaximumFullLODCount = 50; Terrain.activeTerrain.detailObjectDistance = 120.0f; Terrain.activeTerrain.detailObjectDensity = 1f; Terrain.activeTerrain.heightmapPixelError = 5f; Terrain.activeTerrain.heightmapMaximumLOD = 0; Terrain.activeTerrain.basemapDistance = 1000.0f; break; case 5: Terrain.activeTerrain.treeDistance = 2000.0f; Terrain.activeTerrain.treeBillboardDistance = 200.0f; Terrain.activeTerrain.treeCrossFadeLength = 50.0f; Terrain.activeTerrain.treeMaximumFullLODCount = 100; Terrain.activeTerrain.detailObjectDistance = 150f; Terrain.activeTerrain.detailObjectDensity = 1f; Terrain.activeTerrain.heightmapPixelError = 5f; Terrain.activeTerrain.heightmapMaximumLOD = 0; Terrain.activeTerrain.basemapDistance = 1000.0f; break; } } bool IncreaseQuality() { if (m_currentQuality < m_maxQuality) { m_currentQuality++; UpdateQuality(); } return true; } bool DecreaseQuality() { if (m_currentQuality > 0) { m_currentQuality--; UpdateQuality(); } return true; } } }