using System.Collections;
|
|
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
|
|
using BansheeGz.BGSpline.Components;
|
|
using BansheeGz.BGSpline.Curve;
|
|
|
|
public class Lighthouse : MonoBehaviour
|
|
{
|
|
public BGCurve splineCurve;
|
|
public List<float> splineDistantPoints = new List<float>();
|
|
public float speed = 200f;
|
|
public float timePadding = 0.5f;
|
|
public float timeBetweenPoints = 3f;
|
|
public AnimationCurve animationCurve;
|
|
|
|
private BGCcCursor splineCursor;
|
|
private BGCcCursorObjectTranslate splineObjectTranslate;
|
|
private int targetPoint = 0;
|
|
private bool reverseDirection = false;
|
|
private bool midpoint = false;
|
|
|
|
void Start()
|
|
{
|
|
splineCursor = splineCurve.GetComponent<BGCcCursor>();
|
|
splineObjectTranslate = splineCurve.GetComponent<BGCcCursorObjectTranslate>();
|
|
|
|
if (splineDistantPoints == null || splineDistantPoints.Count == 0)
|
|
{
|
|
splineDistantPoints.Add(0f);
|
|
for (int i=1; i<splineCurve.PointsCount; i++)
|
|
{
|
|
BGCurvePointI point = splineCurve.Points[i];
|
|
float distance = 0f;
|
|
splineCursor.Math.CalcPositionByClosestPoint(point.PositionWorld, out distance);
|
|
splineDistantPoints.Add(distance);
|
|
}
|
|
splineDistantPoints.Add(splineCursor.Math.GetDistance());
|
|
}
|
|
splineCursor.Distance = 0f;
|
|
moveToNextPoint();
|
|
|
|
NotificationServer.register("statechange Searchlight", searchlightStateChanged);
|
|
NotificationServer.register("restart scene", restartScene);
|
|
}
|
|
|
|
public void moveToNextPoint()
|
|
{
|
|
LeanTween.delayedCall(gameObject, timeBetweenPoints, ()=>{
|
|
if (reverseDirection)
|
|
targetPoint--;
|
|
else
|
|
targetPoint++;
|
|
if (targetPoint >= splineDistantPoints.Count)
|
|
{
|
|
if (splineCurve.Closed)
|
|
{
|
|
targetPoint = 1;
|
|
splineCursor.Distance = 0f;
|
|
}
|
|
else
|
|
{
|
|
targetPoint = splineDistantPoints.Count - 2;
|
|
reverseDirection = !reverseDirection;
|
|
}
|
|
}
|
|
|
|
midpoint = true;
|
|
float start = splineCursor.Distance;
|
|
float end = splineDistantPoints[targetPoint];
|
|
float distance = Mathf.Abs(end - start);
|
|
LeanTween.value(gameObject, start, end, distance / speed + timePadding).setOnUpdate((float val)=>{
|
|
splineCursor.Distance = val;
|
|
}).setEase(animationCurve).setOnComplete(()=>{
|
|
midpoint = false;
|
|
moveToNextPoint();
|
|
});
|
|
});
|
|
}
|
|
|
|
public void searchlightStateChanged()
|
|
{
|
|
LeanTween.cancel(gameObject, false);
|
|
if (Searchlight.state == Searchlight.SearchState.Chasing)
|
|
{
|
|
splineObjectTranslate.enabled = false;
|
|
}
|
|
else if (Searchlight.state == Searchlight.SearchState.Returning)
|
|
{
|
|
splineObjectTranslate.enabled = false;
|
|
Vector3 start = splineObjectTranslate.ObjectToManipulate.position;
|
|
Vector3 end = splineCursor.CalculatePosition();
|
|
float distance = (end - start).magnitude;
|
|
LeanTween.move(splineObjectTranslate.ObjectToManipulate.gameObject, end, distance / speed + timePadding).setEase(animationCurve).setOnComplete(()=>{
|
|
splineObjectTranslate.enabled = true;
|
|
if (midpoint)
|
|
{
|
|
if (reverseDirection)
|
|
targetPoint++;
|
|
else
|
|
targetPoint--;
|
|
}
|
|
moveToNextPoint();
|
|
NotificationServer.notify("statechange Searchlight safe");
|
|
});
|
|
}
|
|
}
|
|
|
|
public void restartScene()
|
|
{
|
|
LeanTween.cancel(gameObject, false);
|
|
Searchlight.state = Searchlight.SearchState.Spline;
|
|
splineObjectTranslate.enabled = true;
|
|
splineCursor.Distance = 0f;
|
|
midpoint = false;
|
|
reverseDirection = false;
|
|
targetPoint = 0;
|
|
splineObjectTranslate.ObjectToManipulate.position = splineCursor.CalculatePosition();
|
|
moveToNextPoint();
|
|
NotificationServer.notify("statechange Searchlight safe");
|
|
}
|
|
}
|