Files
Ultimate-Fishing-Simulator-…/Assets/Scripts/Assembly-CSharp/UpdateManager.cs
2026-03-04 09:37:33 +08:00

94 lines
2.4 KiB
C#

using System.Collections.Generic;
using UnityEngine;
public class UpdateManager : MonoBehaviour
{
public enum UpdateMode
{
BucketA = 0,
BucketB = 1,
Always = 2
}
private readonly HashSet<IBatchUpdate> _slicedUpdateBehavioursBucketA = new HashSet<IBatchUpdate>();
private readonly HashSet<IBatchUpdate> _slicedUpdateBehavioursBucketB = new HashSet<IBatchUpdate>();
private readonly HashSet<IBatchFixedUpdate> _slicedFixedUpdateBehaviours = new HashSet<IBatchFixedUpdate>();
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<IBatchUpdate> 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();
}
}
}