From 2e6768677ee1dfa6337868b14b56ad0ec9e5903b Mon Sep 17 00:00:00 2001 From: jamie-healey-xr <88200193+jamie-healey-xr@users.noreply.github.com> Date: Mon, 6 Dec 2021 13:34:58 +0000 Subject: [PATCH] Added more fine control over scene injection --- Scripts/DependencyContainer.cs | 21 +++++++++++++++--- Scripts/IgnoreSceneInjectionAttribute.cs | 9 -------- Scripts/SceneInjectionOptions.cs | 22 +++++++++++++++++++ ....cs.meta => SceneInjectionOptions.cs.meta} | 0 4 files changed, 40 insertions(+), 12 deletions(-) delete mode 100644 Scripts/IgnoreSceneInjectionAttribute.cs create mode 100644 Scripts/SceneInjectionOptions.cs rename Scripts/{IgnoreSceneInjectionAttribute.cs.meta => SceneInjectionOptions.cs.meta} (100%) diff --git a/Scripts/DependencyContainer.cs b/Scripts/DependencyContainer.cs index 098b1ef..8c97342 100644 --- a/Scripts/DependencyContainer.cs +++ b/Scripts/DependencyContainer.cs @@ -174,7 +174,17 @@ public void InjectToSceneObjects(bool includeInactiveObjects = true) var injectableObjects = Object.FindObjectsOfType(injectableTypeInfo.Type, includeInactiveObjects); foreach (var injectableObject in injectableObjects) { - if (injectableTypeInfo.IgnoreSceneInjection) continue; + // Ignore scene injection + if (injectableTypeInfo.SceneInjectionControl == SceneInjectionControl.Ignore) continue; + + // Ignore if the object is inactive + if (includeInactiveObjects && + injectableTypeInfo.SceneInjectionControl == SceneInjectionControl.OnlyWhenActive && + injectableObject is Component obj && + !obj.gameObject.activeInHierarchy) + { + continue; + } // We only want the exact type here, not subclasses // - since we will also look for them later and we don't want double injections. @@ -246,12 +256,17 @@ private class InjectableTypeInfo public bool IsMonoBehaviour { get; } public Type Type { get; } public IEnumerable InjectableFields { get; } - public bool IgnoreSceneInjection { get; } + public SceneInjectionControl SceneInjectionControl { get; } = SceneInjectionControl.Always; public InjectableTypeInfo(Type type, IEnumerable injectableFields) { IsMonoBehaviour = type.IsSubclassOf(typeof(MonoBehaviour)); - IgnoreSceneInjection = type.GetCustomAttribute() != null; + var sceneInjectionControl = type.GetCustomAttribute(); + if (sceneInjectionControl != null) + { + SceneInjectionControl = sceneInjectionControl.Control; + } + Type = type; InjectableFields = injectableFields; } diff --git a/Scripts/IgnoreSceneInjectionAttribute.cs b/Scripts/IgnoreSceneInjectionAttribute.cs deleted file mode 100644 index 2ab67b1..0000000 --- a/Scripts/IgnoreSceneInjectionAttribute.cs +++ /dev/null @@ -1,9 +0,0 @@ -using System; - -namespace UnityDependencyInjection -{ - [AttributeUsage(AttributeTargets.Class)] - public class IgnoreSceneInjectionAttribute : Attribute - { - } -} \ No newline at end of file diff --git a/Scripts/SceneInjectionOptions.cs b/Scripts/SceneInjectionOptions.cs new file mode 100644 index 0000000..dabfc33 --- /dev/null +++ b/Scripts/SceneInjectionOptions.cs @@ -0,0 +1,22 @@ +using System; + +namespace UnityDependencyInjection +{ + [AttributeUsage(AttributeTargets.Class)] + public class SceneInjectionOptions : Attribute + { + public SceneInjectionControl Control { get; } + + public SceneInjectionOptions(SceneInjectionControl control) + { + Control = control; + } + } + + public enum SceneInjectionControl + { + Ignore, + OnlyWhenActive, + Always, + } +} \ No newline at end of file diff --git a/Scripts/IgnoreSceneInjectionAttribute.cs.meta b/Scripts/SceneInjectionOptions.cs.meta similarity index 100% rename from Scripts/IgnoreSceneInjectionAttribute.cs.meta rename to Scripts/SceneInjectionOptions.cs.meta