2023-04-24 15:49:03 +02:00

90 lines
2.1 KiB
C#

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