|
|
- 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<Searchlight> instants = new List<Searchlight>();
-
- 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);
- });
- }
- }
- }
|