using System.Collections; using System.Collections.Generic; using UnityEngine; public class Searchlight : MonoBehaviour { public enum SearchState { Spline, Chasing, Returning } public float speed = 500f; public float timePadding = 0.5f; public float timeBetweenChase = 0.5f; public float randomFactor = 50f; public AnimationCurve animationCurve; [HideInInspector] public bool isTriggering = false; public static SearchState state = SearchState.Spline; public static Collider chased; private static List instants = new List(); public static bool isTriggeringAtLeastOne() { foreach (Searchlight sl in instants) { if (sl.isTriggering) return true; } return false; } void Awake() { NotificationServer.register("statechange Searchlight", stateChanged); NotificationServer.register("statechange Searchlight safe", stateSafe); NotificationServer.register("statechange Searchlight returning", stateReturning); if (!instants.Contains(this)) instants.Add(this); } void OnTriggerEnter(Collider other) { if (other.tag != "Player") return; chased = other; isTriggering = true; if (state != SearchState.Chasing) { state = SearchState.Chasing; NotificationServer.notify("statechange Searchlight"); NotificationServer.notify("chasing boat"); } NotificationServer.notify("spotted boat"); } void OnTriggerExit(Collider other) { if (other.tag != "Player") return; isTriggering = false; if (state == SearchState.Chasing && !isTriggeringAtLeastOne()) { // chased = null; // state = SearchState.Returning; // NotificationServer.notify("statechange Searchlight"); NotificationServer.notify("lost boat"); } } public void stateSafe() { state = SearchState.Spline; // NotificationServer.notify("statechange Searchlight"); } public void stateReturning() { state = SearchState.Returning; NotificationServer.notify("statechange Searchlight"); } public void stateChanged() { LeanTween.cancel(gameObject, false); if (state == SearchState.Chasing) LeanTween.move(gameObject, chased.transform.position, 0.5f).setEase(animationCurve).setOnComplete(chase); } public void chase() { if (isTriggering) { LeanTween.delayedCall(gameObject, timeBetweenChase, chase); } else { LeanTween.delayedCall(gameObject, timeBetweenChase, ()=>{ Vector3 start = transform.position; Vector3 end = chased.transform.position + Vector3.right * Random.Range(-randomFactor, randomFactor) + Vector3.forward * Random.Range(-randomFactor, randomFactor); float distance = (end - start).magnitude; LeanTween.value(gameObject, 0f, 1f, distance / speed + timePadding).setOnUpdate((float val)=>{ transform.position = start + (end-start)*val; }).setEase(animationCurve).setOnComplete(chase); }); } } }