Advertisement
Guest User

Untitled

a guest
May 2nd, 2016
48
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.65 KB | None | 0 0
  1. using System.Collections;
  2. using System.Diagnostics;
  3. using UnityEngine;
  4.  
  5. public enum TimeLayer {
  6. //Unity's time
  7. GameTime,
  8. //Custom time layer for UI
  9. MenuTime,
  10. //Unity's unscaled time
  11. RealTime,
  12. //Custom unscalable time layer
  13. UserTime,
  14. }
  15.  
  16. public static class TimeLayerExtensions {
  17. public static float GetTime(this TimeLayer timeScale) {
  18. switch (timeScale) {
  19. case TimeLayer.GameTime:
  20. return TimeKeeper.GameTime;
  21. case TimeLayer.MenuTime:
  22. return TimeKeeper.MenuTime;
  23. case TimeLayer.RealTime:
  24. return TimeKeeper.RealTime;
  25. case TimeLayer.UserTime:
  26. return TimeKeeper.UserTime;
  27. }
  28.  
  29. UnityEngine.Debug.LogWarning("Undefined TimeLayer, defaulting to GameTime");
  30. return TimeKeeper.GameTime;
  31. }
  32.  
  33. public static float GetDeltaTime(this TimeLayer timeScale) {
  34. switch (timeScale) {
  35. case TimeLayer.GameTime:
  36. return TimeKeeper.GameDeltaTime;
  37. case TimeLayer.MenuTime:
  38. return TimeKeeper.MenuDeltaTime;
  39. case TimeLayer.RealTime:
  40. return TimeKeeper.RealDeltaTime;
  41. case TimeLayer.UserTime:
  42. return TimeKeeper.UserDeltaTime;
  43. }
  44.  
  45. UnityEngine.Debug.LogWarning("Undefined TimeLayer, defaulting to GameTime");
  46. return TimeKeeper.GameDeltaTime;
  47. }
  48. }
  49.  
  50. public class TimeKeeper : Singleton<TimeKeeper> {
  51. public static float TimerResolution { get; private set; }
  52.  
  53. public static float UserTime { get; private set; }
  54. public static float MenuTime { get; private set; }
  55. public static float GameTime { get { return Time.time; } }
  56. public static float RealTime { get { return Time.unscaledTime; } }
  57.  
  58. public static float UserDeltaTime { get; private set; }
  59. public static float MenuDeltaTime { get; private set; }
  60. public static float GameDeltaTime { get { return Time.deltaTime; } }
  61. public static float RealDeltaTime { get { return Time.unscaledDeltaTime; } }
  62.  
  63. public static float UserTimeScale { get; private set; }
  64. public static float MenuTimeScale { get; set; }
  65. public static float GameTimeScale {
  66. get { return Time.timeScale; }
  67. set { Time.timeScale = value; }
  68. }
  69.  
  70. private Stopwatch timer;
  71. private float totalMilliSeconds;
  72. private float previousTotalMilliSeconds;
  73. private float deltaMilliSeconds;
  74. private IEnumerator timeUpdateEnumerator;
  75.  
  76. protected override void Awake() {
  77. base.Awake();
  78.  
  79. this.Initialize();
  80. this.UpdateTimes();
  81.  
  82. if (TimeKeeper.TimerResolution > 16.0f) {
  83. UnityEngine.Debug.Log("TimeKeeper resolution is greater than maximum admitted for 60 fps");
  84. }
  85. }
  86.  
  87. private void Initialize() {
  88. this.timer = new Stopwatch();
  89. this.timeUpdateEnumerator = this.TimeUpdateLoop();
  90.  
  91. TimeKeeper.TimerResolution = 1000.0f / (float)Stopwatch.Frequency;
  92. TimeKeeper.UserTimeScale = 1;
  93. TimeKeeper.MenuTimeScale = 1;
  94. TimeKeeper.GameTimeScale = 1;
  95. }
  96.  
  97. private void OnDestroy() {
  98. if (this.timeUpdateEnumerator != null) {
  99. this.StopCoroutine(this.timeUpdateEnumerator);
  100. }
  101. }
  102.  
  103. private void OnLevelWasLoaded(int level) {
  104. this.timer.Reset();
  105. this.timer.Start();
  106. this.PollTime();
  107. this.UpdateTimes();
  108. }
  109.  
  110. private void PollTime() {
  111. this.timer.Stop();
  112. this.previousTotalMilliSeconds = this.totalMilliSeconds;
  113. this.totalMilliSeconds = (float)(timer.ElapsedMilliseconds) / 1000.0f;
  114. this.deltaMilliSeconds = Mathf.Max(0, this.totalMilliSeconds - this.previousTotalMilliSeconds);
  115. this.timer.Start();
  116. }
  117.  
  118. private void Start() {
  119. this.timer.Start();
  120. this.StartCoroutine(this.timeUpdateEnumerator);
  121. }
  122.  
  123. //TODO: Figure out if there's a way to provide static access to this or just via TimeKeeper.Instance
  124. public IEnumerator TimeLayerWaitForSeconds(float seconds, TimeLayer timeLayer = TimeLayer.GameTime) {
  125. float elapsedTime = 0;
  126.  
  127. while (elapsedTime < seconds) {
  128. yield return null;
  129. elapsedTime += timeLayer.GetDeltaTime();
  130. }
  131. }
  132.  
  133. private IEnumerator TimeUpdateLoop() {
  134. while (true) {
  135. this.PollTime();
  136. this.UpdateTimes();
  137. yield return null;
  138. }
  139. }
  140.  
  141. private void UpdateTimes() {
  142. TimeKeeper.UserDeltaTime = this.deltaMilliSeconds;
  143. TimeKeeper.MenuDeltaTime = this.deltaMilliSeconds * TimeKeeper.MenuTimeScale;
  144.  
  145. TimeKeeper.UserTime = this.totalMilliSeconds;
  146. TimeKeeper.MenuTime = this.totalMilliSeconds * TimeKeeper.MenuTimeScale;
  147. }
  148. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement