Station.cs 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. public class Station : MonoBehaviour
  5. {
  6. public float maxPower;
  7. public Transform gauge;
  8. public float powerSuckDelay = 1;
  9. public float powerLevel;
  10. public float randomRayOffset;
  11. public LineRenderer lineRenderer;
  12. private IEnumerator drainCoroutine;
  13. private Transform lineTarget;
  14. public float maxBeamWidth;
  15. public float beamWidthFadeSeconds;
  16. private AudioSource _audioSource;
  17. // Use this for initialization
  18. void Start ()
  19. {
  20. powerLevel = 0;
  21. lineTarget = lineRenderer.transform;
  22. var midpoint =
  23. (lineRenderer.transform.position +
  24. lineTarget.position)/2;
  25. lineRenderer.SetPositions(new Vector3[]{
  26. lineRenderer.transform.position,
  27. midpoint,
  28. lineTarget.position,
  29. });
  30. lineRenderer.endWidth = 0;
  31. _audioSource = GetComponent<AudioSource>();
  32. }
  33. // Update is called once per frame
  34. void Update () {
  35. UpdatePowerBar();
  36. }
  37. void PowerUp(float delta)
  38. {
  39. powerLevel += delta;
  40. if (powerLevel >= maxPower)
  41. Debug.Log("Station at max power!");
  42. UpdatePowerBar();
  43. }
  44. private void UpdatePowerBar()
  45. {
  46. var level = powerLevel / maxPower;
  47. gauge.localScale = new Vector3(1, level, 1);
  48. var midpoint =
  49. (lineRenderer.transform.position +
  50. lineTarget.position)/2;
  51. lineRenderer.SetPosition(1, midpoint + randomRayOffset * Random.onUnitSphere);
  52. lineRenderer.SetPosition(2, lineTarget.position);
  53. lineRenderer.material.mainTextureOffset = new Vector2((4 * Time.time) % 1, 0);
  54. }
  55. void OnTriggerEnter(Collider other)
  56. {
  57. if (other.CompareTag("Player"))
  58. {
  59. lineRenderer.enabled = true;
  60. lineTarget = other.transform;
  61. drainCoroutine = DrainPower(other.GetComponent<Player>());
  62. StartCoroutine(drainCoroutine);
  63. StartCoroutine(LerpBeamEndWidth(maxBeamWidth, beamWidthFadeSeconds));
  64. }
  65. }
  66. private IEnumerator LerpBeamEndWidth(float tarvetValue, float duration)
  67. {
  68. float startValue = lineRenderer.endWidth;
  69. for (float t = 0; t < duration; t += Time.deltaTime)
  70. {
  71. lineRenderer.endWidth = Mathf.Lerp(startValue, tarvetValue, t / duration);
  72. yield return null;
  73. }
  74. if (Mathf.Approximately(tarvetValue, 0))
  75. {
  76. lineRenderer.enabled = false;
  77. _audioSource.Stop();
  78. }
  79. }
  80. void OnTriggerExit(Collider other)
  81. {
  82. if (other.CompareTag("Player"))
  83. {
  84. //lineTarget = lineRenderer.transform;
  85. if (drainCoroutine != null)
  86. StopCoroutine(drainCoroutine);
  87. StartCoroutine(LerpBeamEndWidth(0, beamWidthFadeSeconds));
  88. }
  89. }
  90. private IEnumerator DrainPower(Player player)
  91. {
  92. _audioSource.Play();
  93. while (true)
  94. {
  95. yield return new WaitForSeconds(powerSuckDelay);
  96. switchLineRenderer(player);
  97. if (player.PowerLevel >= 2f)
  98. {
  99. if (powerLevel >= maxPower)
  100. {
  101. yield break;
  102. }
  103. PowerUp(1);
  104. player.PowerLevel -= 1f;
  105. UpdatePowerBar();
  106. }
  107. }
  108. }
  109. private void switchLineRenderer(Player player)
  110. {
  111. lineRenderer.enabled = false;
  112. if (player != null)
  113. {
  114. if (player.PowerLevel >= 2f)
  115. {
  116. lineRenderer.enabled = true;
  117. }
  118. }
  119. }
  120. }