|
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
|
|
using BansheeGz.BGSpline.Components;
|
|
using BansheeGz.BGSpline.Curve;
|
|
|
|
public class Catapult : MonoBehaviour
|
|
{
|
|
public BGCurve splineCurve;
|
|
public float speed = 600f;
|
|
public float rotateSpeed = 200f;
|
|
public float timePadding = 0.5f;
|
|
public float timeBetweenLaunches = 0.5f;
|
|
public float minScale = 0.3f;
|
|
public float maxScale = 1f;
|
|
public float randomFactor = 50f;
|
|
public AnimationCurve animationCurve;
|
|
public Transform player;
|
|
|
|
private bool isLaunching = false;
|
|
private BGCcCursor splineCursor;
|
|
private BGCcCursorObjectTranslate splineObjectTranslate;
|
|
private Vector3 originalScale;
|
|
private MeshRenderer meshRenderer;
|
|
private Collider boulderCollider;
|
|
private ParticleSystem boulderParticleSystem;
|
|
|
|
void Start ()
|
|
{
|
|
splineCursor = splineCurve.GetComponent<BGCcCursor>();
|
|
splineObjectTranslate = splineCurve.GetComponent<BGCcCursorObjectTranslate>();
|
|
meshRenderer = splineObjectTranslate.ObjectToManipulate.GetComponent<MeshRenderer>();
|
|
boulderCollider = splineObjectTranslate.ObjectToManipulate.GetComponent<Collider>();
|
|
boulderParticleSystem = splineObjectTranslate.ObjectToManipulate.GetComponentInChildren<ParticleSystem>();
|
|
meshRenderer.enabled = false;
|
|
boulderCollider.enabled = false;
|
|
boulderParticleSystem.Stop();
|
|
|
|
originalScale = splineCurve.transform.parent.localScale;
|
|
|
|
NotificationServer.register("statechange Searchlight", searchlightStateChanged);
|
|
NotificationServer.register("BoulderHit", boulderHit);
|
|
NotificationServer.register("restart scene", boulderHit);
|
|
}
|
|
|
|
void Update()
|
|
{
|
|
splineObjectTranslate.ObjectToManipulate.Rotate(Vector3.forward, Time.deltaTime * rotateSpeed);
|
|
}
|
|
|
|
public void searchlightStateChanged()
|
|
{
|
|
LeanTween.cancel(splineObjectTranslate.ObjectToManipulate.gameObject, true);
|
|
if (Searchlight.state == Searchlight.SearchState.Chasing)
|
|
launchBoulder();
|
|
}
|
|
|
|
public void boulderHit()
|
|
{
|
|
LeanTween.cancel(splineObjectTranslate.ObjectToManipulate.gameObject, true);
|
|
}
|
|
|
|
public void launchBoulder()
|
|
{
|
|
if (Searchlight.state != Searchlight.SearchState.Chasing || isLaunching)
|
|
{
|
|
isLaunching = false;
|
|
return;
|
|
}
|
|
|
|
isLaunching = true;
|
|
LeanTween.delayedCall(splineObjectTranslate.ObjectToManipulate.gameObject, timeBetweenLaunches, ()=>{
|
|
if (Searchlight.state != Searchlight.SearchState.Chasing)
|
|
{
|
|
isLaunching = false;
|
|
return;
|
|
}
|
|
boulderParticleSystem.Stop();
|
|
splineCursor.DistanceRatio = 0f;
|
|
splineCurve.transform.parent.position = player.position
|
|
+ Vector3.right * Random.Range(-randomFactor, randomFactor)
|
|
+ Vector3.forward * Random.Range(-randomFactor, randomFactor);
|
|
splineCurve.transform.parent.localEulerAngles = Vector3.up * Random.Range(0f, 360f);
|
|
splineCurve.transform.parent.localScale = new Vector3(Random.Range(minScale * originalScale.x, maxScale * originalScale.x), originalScale.y, originalScale.z);
|
|
LeanTween.delayedCall(splineObjectTranslate.ObjectToManipulate.gameObject, 0.1f, ()=>{
|
|
boulderParticleSystem.Play();
|
|
meshRenderer.enabled = true;
|
|
boulderCollider.enabled = true;
|
|
LeanTween.value(splineObjectTranslate.ObjectToManipulate.gameObject, 0f, 1f, splineCursor.Math.GetDistance() / speed)
|
|
.setEase(animationCurve)
|
|
.setOnUpdate((float val)=>{
|
|
splineCursor.DistanceRatio = val;
|
|
}).setOnComplete(()=>{
|
|
boulderParticleSystem.Stop();
|
|
isLaunching = false;
|
|
meshRenderer.enabled = false;
|
|
LeanTween.delayedCall(splineObjectTranslate.ObjectToManipulate.gameObject, 0.5f, ()=>{
|
|
boulderCollider.enabled = false;
|
|
launchBoulder();
|
|
});
|
|
});
|
|
});
|
|
});
|
|
}
|
|
}
|