Mirror of Svelto.ECS because we're a fan of it
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

90 lines
2.5KB

  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.Reflection;
  5. using UnityEngine;
  6. namespace Svelto.Ticker
  7. {
  8. public class TickBehaviour:MonoBehaviour
  9. {
  10. internal void Add(ITickable tickable)
  11. {
  12. _ticked.Add(tickable);
  13. }
  14. internal void Remove(ITickable tickable)
  15. {
  16. _ticked.Remove(tickable);
  17. }
  18. internal void AddPhysic(IPhysicallyTickable tickable)
  19. {
  20. _physicallyTicked.Add(tickable);
  21. }
  22. internal void RemovePhysic(IPhysicallyTickable tickable)
  23. {
  24. _physicallyTicked.Remove(tickable);
  25. }
  26. internal void AddLate(ILateTickable tickable)
  27. {
  28. _lateTicked.Add(tickable);
  29. }
  30. internal void RemoveLate(ILateTickable tickable)
  31. {
  32. _lateTicked.Remove(tickable);
  33. }
  34. internal void AddIntervaled(IIntervaledTickable tickable)
  35. {
  36. var methodInfo = ((Action)tickable.IntervaledTick).Method;
  37. object[] attrs = methodInfo.GetCustomAttributes(typeof(IntervaledTickAttribute), true);
  38. IEnumerator intervaledTick = IntervaledUpdate(tickable, (attrs[0] as IntervaledTickAttribute).interval);
  39. _intervalledTicked[tickable] = intervaledTick;
  40. StartCoroutine(intervaledTick);
  41. }
  42. internal void RemoveIntervaled(IIntervaledTickable tickable)
  43. {
  44. IEnumerator enumerator;
  45. if (_intervalledTicked.TryGetValue(tickable, out enumerator))
  46. {
  47. StopCoroutine(enumerator);
  48. _intervalledTicked.Remove(tickable);
  49. }
  50. }
  51. void Update()
  52. {
  53. for (int i = _ticked.Count - 1; i >= 0; --i)
  54. _ticked[i].Tick(Time.deltaTime);
  55. }
  56. void LateUpdate()
  57. {
  58. for (int i = _lateTicked.Count - 1; i >= 0; --i)
  59. _lateTicked[i].LateTick(Time.deltaTime);
  60. }
  61. void FixedUpdate()
  62. {
  63. for (int i = _physicallyTicked.Count - 1; i >= 0; --i)
  64. _physicallyTicked[i].PhysicsTick(Time.deltaTime);
  65. }
  66. IEnumerator IntervaledUpdate(IIntervaledTickable tickable, float seconds)
  67. {
  68. while (true) { DateTime next = DateTime.UtcNow.AddSeconds(seconds); while (DateTime.UtcNow < next) yield return null; tickable.IntervaledTick(); }
  69. }
  70. private List<ITickable> _ticked = new List<ITickable>();
  71. private List<ILateTickable> _lateTicked = new List<ILateTickable>();
  72. private List<IPhysicallyTickable> _physicallyTicked = new List<IPhysicallyTickable>();
  73. private Dictionary<IIntervaledTickable, IEnumerator> _intervalledTicked = new Dictionary<IIntervaledTickable, IEnumerator>();
  74. }
  75. }