123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118 |
- using UnityEngine;
- namespace Pathfinding {
- using Pathfinding.Util;
-
-
-
-
-
-
- [System.Serializable]
- public class AutoRepathPolicy {
-
- public enum Mode {
-
-
-
-
-
- Never,
-
-
-
-
-
-
- EveryNSeconds,
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Dynamic,
- }
-
-
-
-
-
- public Mode mode = Mode.Dynamic;
-
- [UnityEngine.Serialization.FormerlySerializedAs("interval")]
- public float period = 0.5f;
-
-
-
-
-
-
- public float sensitivity = 10.0f;
-
- [UnityEngine.Serialization.FormerlySerializedAs("maximumInterval")]
- public float maximumPeriod = 2.0f;
-
- public bool visualizeSensitivity = false;
- Vector3 lastDestination = new Vector3(float.PositiveInfinity, float.PositiveInfinity, float.PositiveInfinity);
- float lastRepathTime = float.NegativeInfinity;
-
-
-
-
-
-
-
-
- public virtual bool ShouldRecalculatePath (Vector3 position, float radius, Vector3 destination) {
- if (mode == Mode.Never || float.IsPositiveInfinity(destination.x)) return false;
- float timeSinceLast = Time.time - lastRepathTime;
- if (mode == Mode.EveryNSeconds) {
- return timeSinceLast >= period;
- } else {
-
- float squaredCost = (destination - lastDestination).sqrMagnitude / Mathf.Max((position - lastDestination).sqrMagnitude, radius*radius);
- float fraction = squaredCost * (sensitivity*sensitivity);
- if (fraction > 1.0f || float.IsNaN(fraction)) return true;
- if (timeSinceLast >= maximumPeriod*(1 - Mathf.Sqrt(fraction))) return true;
- return false;
- }
- }
-
- public virtual void Reset () {
- lastRepathTime = float.NegativeInfinity;
- }
-
- public virtual void DidRecalculatePath (Vector3 destination) {
- lastRepathTime = Time.time;
- lastDestination = destination;
- }
- public void DrawGizmos (Vector3 position, float radius) {
- if (visualizeSensitivity && !float.IsPositiveInfinity(lastDestination.x)) {
- float r = Mathf.Sqrt(Mathf.Max((position - lastDestination).sqrMagnitude, radius*radius)/(sensitivity*sensitivity));
- Draw.Gizmos.CircleXZ(lastDestination, r, Color.magenta);
- }
- }
- }
- }
|