Guest User

Fire projectile script

a guest
Oct 28th, 2026
8
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.76 KB | None | 0 0
  1. using Unity.AppUI.UI;
  2. using UnityEngine;
  3.  
  4. public class FireProjectialBehaviour : StateMachineBehaviour
  5. {
  6. private Vector2 _direction;
  7. private Transform _player;
  8. private Rigidbody2D _rb;
  9.  
  10. private EnemyFireProjectileBase _projectileBase;
  11. private float _intervalElapsedTime;
  12. private float _cooldownElapsedTime;
  13. private int _projectileNumber;
  14. // OnStateEnter is called when a transition starts and the state machine starts to evaluate this state
  15. override public void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
  16. {
  17. if(_projectileBase == null) //Helps to omptimize code, avoid calling it every state enter
  18. {
  19. _projectileBase = animator.gameObject.GetComponent<EnemyFireProjectileBase>();
  20.  
  21. _player = _projectileBase.m_player;
  22.  
  23. _rb = _projectileBase.m_rb;
  24.  
  25. _intervalElapsedTime = 0f;
  26. _cooldownElapsedTime = _projectileBase.m_cooldown;
  27.  
  28. _projectileNumber = 0;
  29. }
  30. }
  31.  
  32. // OnStateUpdate is called on each Update frame between OnStateEnter and OnStateExit callbacks
  33. override public void OnStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
  34. {//<summary> Count up cooldown elapsed time. If conditions met, count up interval elapsed time. When conditions met, fire projectile, and reset
  35.  
  36. if (_cooldownElapsedTime >= _projectileBase.m_cooldown)
  37. {
  38. _intervalElapsedTime += Time.deltaTime;
  39.  
  40. if (_intervalElapsedTime >= _projectileBase.m_firingInterval)
  41. {
  42.  
  43. _direction = ((Vector2)_player.transform.position - _rb.position).normalized; //Find direction to player.
  44.  
  45. fireProjectile(_direction * _projectileBase.m_speed, _projectileNumber);
  46. }
  47. }
  48. else
  49. {
  50. _cooldownElapsedTime += Time.deltaTime;
  51. }
  52.  
  53. }
  54.  
  55. // OnStateExit is called when a transition ends and the state machine finishes evaluating this state
  56. override public void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
  57. {
  58. _intervalElapsedTime = 0f;
  59. _cooldownElapsedTime = 0f;
  60. _projectileNumber = 0;
  61. }
  62.  
  63. private void fireProjectile(Vector2 velocity, int projectileNumber)
  64. {//<summary> Set a projectile active, give it a velocty, reset elapsed time, then increase projectile number.
  65. if (_projectileBase.m_projectiles[_projectileNumber].activeSelf == true)
  66. {//<summary> If it is active, return our of the function
  67. return;
  68. }
  69. else
  70. {
  71. _projectileBase.m_projectiles[_projectileNumber].SetActive(true);
  72. _projectileBase.m_projectiles[_projectileNumber].transform.position = _rb.position;
  73.  
  74. _projectileBase.m_rbList[projectileNumber].linearVelocity = velocity;
  75.  
  76. _intervalElapsedTime = 0f;
  77.  
  78. _projectileNumber++;
  79.  
  80. if (_projectileNumber >= _projectileBase.m_projectiles.Length)
  81. {//Reset projectile numebr
  82. _projectileNumber = 0;
  83. _cooldownElapsedTime = 0f;
  84. }
  85. }
  86. }
  87.  
  88. private void resetAllProjectile(bool setActive)
  89. {//<summary> Reset position, and if true, set active (to be used again). Instansiate is very expensive
  90. for (int i = 0; i < _projectileBase.m_projectiles.Length; i++)
  91. {
  92. _projectileBase.m_projectiles[i].transform.position = _rb.transform.position;
  93.  
  94. if (setActive) //Require if, incase projectiles want to be reset position without disabling
  95. {
  96. _projectileBase.m_projectiles[i].SetActive(true);
  97. }
  98. }
  99. }
  100. }
  101.  
Advertisement
Add Comment
Please, Sign In to add comment