#if !NOT_UNITY3D #pragma warning disable 649 using ModestTree; using UnityEngine; using UnityEngine.Analytics; namespace Zenject { public abstract class MonoKernel : MonoBehaviour { [InjectLocal] TickableManager _tickableManager = null; [InjectLocal] InitializableManager _initializableManager = null; [InjectLocal] DisposableManager _disposablesManager = null; [InjectOptional] private IDecoratableMonoKernel decoratableMonoKernel; bool _hasInitialized; bool _isDestroyed; protected bool IsDestroyed { get { return _isDestroyed; } } public virtual void Start() { if (decoratableMonoKernel?.ShouldInitializeOnStart()??true) { Initialize(); } } public void Initialize() { // We don't put this in start in case Start is overridden if (!_hasInitialized) { _hasInitialized = true; if (decoratableMonoKernel != null) { decoratableMonoKernel.Initialize(); } else { _initializableManager.Initialize(); } } } public virtual void Update() { // Don't spam the log every frame if initialization fails and leaves it as null if (_tickableManager != null) { if (decoratableMonoKernel != null) { decoratableMonoKernel.Update(); } else { _tickableManager.Update(); } } } public virtual void FixedUpdate() { // Don't spam the log every frame if initialization fails and leaves it as null if (_tickableManager != null) { if (decoratableMonoKernel != null) { decoratableMonoKernel.FixedUpdate(); } else { _tickableManager.FixedUpdate(); } } } public virtual void LateUpdate() { // Don't spam the log every frame if initialization fails and leaves it as null if (_tickableManager != null) { if (decoratableMonoKernel != null) { decoratableMonoKernel.LateUpdate(); } else { _tickableManager.LateUpdate(); } } } public virtual void OnDestroy() { // _disposablesManager can be null if we get destroyed before the Start event if (_disposablesManager != null) { Assert.That(!_isDestroyed); _isDestroyed = true; if (decoratableMonoKernel != null) { decoratableMonoKernel.Dispose(); decoratableMonoKernel.LateDispose(); } else { _disposablesManager.Dispose(); _disposablesManager.LateDispose(); } } } } } #endif