You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

111 lines
3.7 KiB

7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using BansheeGz.BGSpline.Components;
  5. using BansheeGz.BGSpline.Curve;
  6. public class Catapult : MonoBehaviour
  7. {
  8. public BGCurve splineCurve;
  9. public float speed = 600f;
  10. public float rotateSpeed = 200f;
  11. public float timePadding = 0.5f;
  12. public float timeBetweenLaunches = 0.5f;
  13. public float minScale = 0.3f;
  14. public float maxScale = 1f;
  15. public float randomFactor = 50f;
  16. public AnimationCurve animationCurve;
  17. public Transform player;
  18. private bool isLaunching = false;
  19. private BGCcCursor splineCursor;
  20. private BGCcCursorObjectTranslate splineObjectTranslate;
  21. private Vector3 originalScale;
  22. private MeshRenderer meshRenderer;
  23. private Collider boulderCollider;
  24. private ParticleSystem boulderParticleSystem;
  25. private Searchlight.SearchState searchState;
  26. void Start ()
  27. {
  28. splineCursor = splineCurve.GetComponent<BGCcCursor>();
  29. splineObjectTranslate = splineCurve.GetComponent<BGCcCursorObjectTranslate>();
  30. meshRenderer = splineObjectTranslate.ObjectToManipulate.GetComponent<MeshRenderer>();
  31. boulderCollider = splineObjectTranslate.ObjectToManipulate.GetComponent<Collider>();
  32. boulderParticleSystem = splineObjectTranslate.ObjectToManipulate.GetComponentInChildren<ParticleSystem>();
  33. meshRenderer.enabled = false;
  34. boulderCollider.enabled = false;
  35. boulderParticleSystem.Stop();
  36. originalScale = splineCurve.transform.parent.localScale;
  37. NotificationServer.register("statechange Searchlight", searchlightStateChanged);
  38. NotificationServer.register("BoulderHit", boulderHit);
  39. NotificationServer.register("restart scene", boulderHit);
  40. }
  41. void Update()
  42. {
  43. splineObjectTranslate.ObjectToManipulate.Rotate(Vector3.forward, Time.deltaTime * rotateSpeed);
  44. }
  45. public void searchlightStateChanged()
  46. {
  47. if (searchState == Searchlight.state)
  48. return;
  49. searchState = Searchlight.state;
  50. LeanTween.cancel(splineObjectTranslate.ObjectToManipulate.gameObject, true);
  51. if (Searchlight.state == Searchlight.SearchState.Chasing)
  52. launchBoulder();
  53. }
  54. public void boulderHit()
  55. {
  56. LeanTween.cancel(splineObjectTranslate.ObjectToManipulate.gameObject, true);
  57. }
  58. public void launchBoulder()
  59. {
  60. if (Searchlight.state != Searchlight.SearchState.Chasing || isLaunching)
  61. {
  62. isLaunching = false;
  63. return;
  64. }
  65. isLaunching = true;
  66. LeanTween.delayedCall(splineObjectTranslate.ObjectToManipulate.gameObject, timeBetweenLaunches, ()=>{
  67. if (Searchlight.state != Searchlight.SearchState.Chasing)
  68. {
  69. isLaunching = false;
  70. return;
  71. }
  72. boulderParticleSystem.Stop();
  73. splineCursor.DistanceRatio = 0f;
  74. splineCurve.transform.parent.position = player.position
  75. + Vector3.right * Random.Range(-randomFactor, randomFactor)
  76. + Vector3.forward * Random.Range(-randomFactor, randomFactor);
  77. splineCurve.transform.parent.localEulerAngles = Vector3.up * Random.Range(0f, 360f);
  78. splineCurve.transform.parent.localScale = new Vector3(Random.Range(minScale * originalScale.x, maxScale * originalScale.x), originalScale.y, originalScale.z);
  79. LeanTween.delayedCall(splineObjectTranslate.ObjectToManipulate.gameObject, 0.1f, ()=>{
  80. boulderParticleSystem.Play();
  81. meshRenderer.enabled = true;
  82. boulderCollider.enabled = true;
  83. LeanTween.value(splineObjectTranslate.ObjectToManipulate.gameObject, 0f, 1f, splineCursor.Math.GetDistance() / speed)
  84. .setEase(animationCurve)
  85. .setOnUpdate((float val)=>{
  86. splineCursor.DistanceRatio = val;
  87. }).setOnComplete(()=>{
  88. boulderParticleSystem.Stop();
  89. isLaunching = false;
  90. meshRenderer.enabled = false;
  91. LeanTween.delayedCall(splineObjectTranslate.ObjectToManipulate.gameObject, 0.5f, ()=>{
  92. boulderCollider.enabled = false;
  93. launchBoulder();
  94. });
  95. });
  96. });
  97. });
  98. }
  99. }