using UnityEngine; namespace Pathfinding { /// /// Base for all path modifiers. /// See: MonoModifier /// Modifier /// public interface IPathModifier { int Order { get; } void Apply(Path path); void PreProcess(Path path); } /// /// Base class for path modifiers which are not attached to GameObjects. /// See: MonoModifier /// [System.Serializable] public abstract class PathModifier : IPathModifier { [System.NonSerialized] public Seeker seeker; /// /// Modifiers will be executed from lower order to higher order. /// This value is assumed to stay constant. /// public abstract int Order { get; } public void Awake (Seeker seeker) { this.seeker = seeker; if (seeker != null) { seeker.RegisterModifier(this); } } public void OnDestroy (Seeker seeker) { if (seeker != null) { seeker.DeregisterModifier(this); } } public virtual void PreProcess (Path path) { // Required by IPathModifier } /// Main Post-Processing function public abstract void Apply(Path path); } /// /// Base class for path modifiers which can be attached to GameObjects. /// See: Menubar -> Component -> Pathfinding -> Modifiers /// [System.Serializable] public abstract class MonoModifier : VersionedMonoBehaviour, IPathModifier { [System.NonSerialized] public Seeker seeker; /// Alerts the Seeker that this modifier exists protected virtual void OnEnable () { seeker = GetComponent(); if (seeker != null) { seeker.RegisterModifier(this); } } protected virtual void OnDisable () { if (seeker != null) { seeker.DeregisterModifier(this); } } /// /// Modifiers will be executed from lower order to higher order. /// This value is assumed to stay constant. /// public abstract int Order { get; } public virtual void PreProcess (Path path) { // Required by IPathModifier } /// Called for each path that the Seeker calculates after the calculation has finished public abstract void Apply(Path path); } }