using System.Collections.Generic; using UnityEngine; public class UpdateManager : MonoBehaviour { public enum UpdateMode { BucketA = 0, BucketB = 1, Always = 2 } private readonly HashSet _slicedUpdateBehavioursBucketA = new HashSet(); private readonly HashSet _slicedUpdateBehavioursBucketB = new HashSet(); private readonly HashSet _slicedFixedUpdateBehaviours = new HashSet(); private bool _isCurrentBucketA; public static UpdateManager Instance { get; private set; } public static void RegisterSlicedUpdate(IBatchUpdate slicedUpdateBehaviour, UpdateMode updateMode) { if (Instance == null) { new GameObject("UpdateManager", typeof(UpdateManager)); } HashSet hashSet; switch (updateMode) { case UpdateMode.Always: Instance._slicedUpdateBehavioursBucketA.Add(slicedUpdateBehaviour); Instance._slicedUpdateBehavioursBucketB.Add(slicedUpdateBehaviour); return; default: hashSet = Instance._slicedUpdateBehavioursBucketB; break; case UpdateMode.BucketA: hashSet = Instance._slicedUpdateBehavioursBucketA; break; } hashSet.Add(slicedUpdateBehaviour); } public static void DeregisterSlicedUpdate(IBatchUpdate slicedUpdateBehaviour) { Instance._slicedUpdateBehavioursBucketA.Remove(slicedUpdateBehaviour); Instance._slicedUpdateBehavioursBucketB.Remove(slicedUpdateBehaviour); } public static void RegisterSlicedFixedUpdate(IBatchFixedUpdate slicedUpdateBehaviour) { if (Instance == null) { new GameObject("UpdateManager", typeof(UpdateManager)); } Instance._slicedFixedUpdateBehaviours.Add(slicedUpdateBehaviour); } public static void DeregisterSlicedFixedUpdate(IBatchFixedUpdate slicedUpdateBehaviour) { Instance._slicedFixedUpdateBehaviours.Remove(slicedUpdateBehaviour); } private void Awake() { if (Instance != null) { Object.DestroyImmediate(base.gameObject); return; } Instance = this; Object.DontDestroyOnLoad(base.gameObject); } private void Update() { foreach (IBatchUpdate item in _isCurrentBucketA ? _slicedUpdateBehavioursBucketA : _slicedUpdateBehavioursBucketB) { item.BatchUpdate(); } _isCurrentBucketA = !_isCurrentBucketA; } private void FixedUpdate() { foreach (IBatchFixedUpdate slicedFixedUpdateBehaviour in _slicedFixedUpdateBehaviours) { slicedFixedUpdateBehaviour.BatchFixedUpdate(); } } }