UpdateTimeManager.cs 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244
  1. // Magica Cloth.
  2. // Copyright (c) MagicaSoft, 2020-2022.
  3. // https://magicasoft.jp
  4. using UnityEngine;
  5. namespace MagicaCloth
  6. {
  7. /// <summary>
  8. /// 時間管理クラス
  9. /// </summary>
  10. [System.Serializable]
  11. public class UpdateTimeManager
  12. {
  13. // アップデート回数
  14. public enum UpdateCount
  15. {
  16. _60 = 60,
  17. _90_Default = 90,
  18. _120 = 120,
  19. _150 = 150,
  20. _180 = 180,
  21. }
  22. // 1秒間の更新回数
  23. [SerializeField]
  24. private UpdateCount updatePerSeccond = UpdateCount._90_Default;
  25. // 更新モード
  26. public enum UpdateMode
  27. {
  28. UnscaledTime = 0, // 非同期更新
  29. OncePerFrame = 1, // 固定更新(基本1フレームに1回)
  30. DelayUnscaledTime = 10, // 非同期更新(遅延実行)
  31. }
  32. [SerializeField]
  33. private UpdateMode updateMode = UpdateMode.UnscaledTime;
  34. // グローバルタイムスケール
  35. private float timeScale = 1.0f;
  36. /// <summary>
  37. /// 遅延実行時の未来予測率
  38. /// </summary>
  39. [SerializeField]
  40. [Range(0.0f, 1.0f)]
  41. private float futurePredictionRate = 1.0f;
  42. /// <summary>
  43. /// ボーンスケールの更新(Unity2019.2.13まで)
  44. /// </summary>
  45. [SerializeField]
  46. private bool updateBoneScale = false;
  47. private int fixedUpdateCount = 0;
  48. //=========================================================================================
  49. public void ResetFixedUpdateCount()
  50. {
  51. fixedUpdateCount = 0;
  52. }
  53. public void AddFixedUpdateCount()
  54. {
  55. fixedUpdateCount++;
  56. }
  57. public int FixedUpdateCount
  58. {
  59. get
  60. {
  61. return fixedUpdateCount;
  62. }
  63. }
  64. /// <summary>
  65. /// アップデートモード取得
  66. /// </summary>
  67. /// <returns></returns>
  68. public UpdateMode GetUpdateMode()
  69. {
  70. return updateMode;
  71. }
  72. public void SetUpdateMode(UpdateMode mode)
  73. {
  74. updateMode = mode;
  75. }
  76. /// <summary>
  77. /// 1秒間の更新回数
  78. /// </summary>
  79. public int UpdatePerSecond
  80. {
  81. get
  82. {
  83. return (int)updatePerSeccond;
  84. }
  85. }
  86. public void SetUpdatePerSecond(UpdateCount ucount)
  87. {
  88. updatePerSeccond = ucount;
  89. }
  90. /// <summary>
  91. /// 更新間隔時間
  92. /// </summary>
  93. public float UpdateIntervalTime
  94. {
  95. get
  96. {
  97. return 1.0f / UpdatePerSecond;
  98. }
  99. }
  100. /// <summary>
  101. /// 更新力(90upsを基準とした倍数)
  102. /// 60fps = 1.5 / 90ups = 1.0f / 120fps = 0.75
  103. /// </summary>
  104. public float UpdatePower
  105. {
  106. get
  107. {
  108. float power = 90.0f / (float)UpdatePerSecond;
  109. //power = Mathf.Pow(power, 0.3f); // 調整
  110. return power;
  111. }
  112. }
  113. /// <summary>
  114. /// タイムスケール
  115. /// 1.0未満に設定することで全体のスロー再生が可能
  116. /// ただし完全なスローではないので注意
  117. /// </summary>
  118. public float TimeScale
  119. {
  120. get
  121. {
  122. return timeScale;
  123. }
  124. set
  125. {
  126. timeScale = Mathf.Clamp01(value);
  127. }
  128. }
  129. /// <summary>
  130. /// 現在のフレーム更新時間
  131. /// </summary>
  132. public float DeltaTime
  133. {
  134. get
  135. {
  136. return Time.deltaTime;
  137. }
  138. }
  139. public float PhysicsDeltaTime
  140. {
  141. get
  142. {
  143. return Time.fixedDeltaTime * fixedUpdateCount;
  144. }
  145. }
  146. /// <summary>
  147. /// 現在の平均フレーム更新時間(=平均FPS)
  148. /// </summary>
  149. public float AverageDeltaTime
  150. {
  151. get
  152. {
  153. return Time.smoothDeltaTime;
  154. }
  155. }
  156. /// <summary>
  157. /// 非同期時間更新判定
  158. /// </summary>
  159. public bool IsUnscaledUpdate
  160. {
  161. get
  162. {
  163. return updateMode == UpdateMode.UnscaledTime || updateMode == UpdateMode.DelayUnscaledTime;
  164. }
  165. }
  166. /// <summary>
  167. /// 遅延実行判定
  168. /// </summary>
  169. public bool IsDelay
  170. {
  171. get
  172. {
  173. return updateMode == UpdateMode.DelayUnscaledTime;
  174. }
  175. }
  176. /// <summary>
  177. /// 遅延実行時の未来予測率(0.0-1.0)
  178. /// </summary>
  179. public float FuturePredictionRate
  180. {
  181. get
  182. {
  183. return futurePredictionRate;
  184. }
  185. set
  186. {
  187. futurePredictionRate = Mathf.Clamp01(value);
  188. }
  189. }
  190. /// <summary>
  191. /// ボーンスケール更新判定(Unity2019.2.13まで)
  192. /// </summary>
  193. public bool UpdateBoneScale
  194. {
  195. get
  196. {
  197. return updateBoneScale;
  198. }
  199. set
  200. {
  201. updateBoneScale = value;
  202. }
  203. }
  204. /// <summary>
  205. /// この端末が使用可能なワーカースレッド数
  206. /// </summary>
  207. /// <returns></returns>
  208. public int WorkerMaximumCount
  209. {
  210. get
  211. {
  212. return Unity.Jobs.LowLevel.Unsafe.JobsUtility.JobWorkerMaximumCount;
  213. }
  214. }
  215. }
  216. }