/Assets/Scripts/SpringTrap.cs

https://bitbucket.org/ragoston/fins-nightmare · C# · 148 lines · 125 code · 11 blank · 12 comment · 9 complexity · 25e9d2b2aa33c5801e69ce8b2ab3b340 MD5 · raw file

  1. using UnityEngine;
  2. using System.Collections;
  3. public class SpringTrap : MonoBehaviour
  4. {
  5. private Transform objectToMove;
  6. // Use this for initialization
  7. Vector3 currentVelocity;
  8. private ImageSequencePlayer imagePlayer;
  9. public enum TypeOfTrap
  10. {
  11. springOut, animatedWithEvent
  12. }
  13. [Tooltip("Set the type of trap here to use.")]
  14. public TypeOfTrap trapType = TypeOfTrap.springOut;
  15. public float starterAlphaIfAnimated = 0.0f;
  16. public float springDistance;
  17. public float timeToFinish;
  18. private bool alreadyUsed = false;
  19. //bool startMoving = false;
  20. [Tooltip("The image that triggers the event when using animated traps.")]
  21. public int frameToFireEvent = 0;
  22. public GameObject trapToActivate;
  23. [Tooltip("If using an animated trap, this indicates the fade in time of the trap.")]
  24. public float fadeInTime = 0.5f;
  25. private SpriteRenderer trapSpriteRenderer;
  26. void Start ()
  27. {
  28. objectToMove = transform.Find("ObjectsToAnimate");
  29. switch(trapType)
  30. {
  31. case TypeOfTrap.animatedWithEvent:
  32. try
  33. {
  34. imagePlayer = GetComponent<ImageSequencePlayer>();
  35. if (imagePlayer == null)
  36. {
  37. imagePlayer = GetComponentInChildren<ImageSequencePlayer>();
  38. }
  39. }
  40. catch
  41. {
  42. Debug.Log("A sequence player is needed.");
  43. }
  44. trapToActivate.SetActive(false);
  45. trapSpriteRenderer = GetComponent<SpriteRenderer>();
  46. if (trapSpriteRenderer == null)
  47. {
  48. trapSpriteRenderer = GetComponentInChildren<SpriteRenderer>();
  49. }
  50. trapSpriteRenderer.color = new Color(1.0f, 1.0f, 1.0f, starterAlphaIfAnimated);
  51. break;
  52. }
  53. }
  54. void OnTriggerEnter2D(Collider2D other)
  55. {
  56. if (!alreadyUsed && other.gameObject.CompareTag("Player"))
  57. {
  58. //if the player has entered the danger zone
  59. switch (trapType)
  60. {
  61. case TypeOfTrap.springOut:
  62. StartCoroutine(SpringOut(springDistance, timeToFinish));
  63. //startMoving = true;
  64. alreadyUsed = true;
  65. break;
  66. case TypeOfTrap.animatedWithEvent:
  67. alreadyUsed = true;
  68. ActivateTrapAtGivenFrame(frameToFireEvent);
  69. break;
  70. }
  71. }
  72. }
  73. IEnumerator SpringOut(float springDistance, float timeToFinish)
  74. {
  75. /*
  76. * we also have to eliminate the current collider to
  77. * avoid any conflicts between others in the scene.
  78. */
  79. Destroy(GetComponent<Collider2D>());
  80. //self collider eliminated.
  81. Vector3 objectIdlePos = objectToMove.position;
  82. while(Mathf.Abs(objectToMove.position.y - objectIdlePos.y) < springDistance)
  83. {
  84. objectToMove.position = Vector3.SmoothDamp(objectToMove.position,
  85. objectToMove.position + Vector3.up * springDistance, ref currentVelocity, timeToFinish);
  86. yield return null;
  87. }
  88. }
  89. void ActivateTrapAtGivenFrame(int givenFrame)
  90. {
  91. StartCoroutine(ScaleSpriteAlpha(0.0f, 1.0f, fadeInTime));
  92. }
  93. IEnumerator ScaleSpriteAlpha(float start, float end, float time)
  94. {
  95. float lastTime = Time.realtimeSinceStartup;
  96. float timer = 0.0f;
  97. while (timer < time)
  98. {
  99. //fading out the character using its sprite renderer alpha
  100. trapSpriteRenderer.color = new Color(1.0f, 1.0f, 1.0f, Mathf.Lerp(start, end, timer / time));
  101. timer += (Time.realtimeSinceStartup - lastTime);
  102. lastTime = Time.realtimeSinceStartup;
  103. yield return null;
  104. }
  105. }
  106. IEnumerator WaitThenFadeTrapOut(float waitTime)
  107. {
  108. yield return new WaitForSeconds(waitTime);
  109. StartCoroutine(ScaleSpriteAlpha(1.0f, 0.0f, fadeInTime));
  110. //trapToActivate.SetActive(false);
  111. }
  112. public void AnimationEvents(int frameToActivate)
  113. {
  114. if(frameToActivate >= imagePlayer.spriteSheet.Length - 1)
  115. {
  116. //meaning we need the last
  117. AfterAnimEvents();
  118. }else
  119. {
  120. DuringAnimEvents();
  121. }
  122. }
  123. void AfterAnimEvents()
  124. {
  125. StartCoroutine(WaitThenFadeTrapOut(0.1f));
  126. StartCoroutine(WaitThenDestroySelf(2.0f));
  127. }
  128. void DuringAnimEvents()
  129. {
  130. trapToActivate.SetActive(true);
  131. }
  132. IEnumerator WaitThenDestroySelf(float waitTime)
  133. {
  134. yield return new WaitForSeconds(waitTime);
  135. Destroy(this.gameObject);
  136. }
  137. }