Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using Unity.AppUI.UI;
- using UnityEngine;
- public class FireProjectialBehaviour : StateMachineBehaviour
- {
- private Vector2 _direction;
- private Transform _player;
- private Rigidbody2D _rb;
- private EnemyFireProjectileBase _projectileBase;
- private float _intervalElapsedTime;
- private float _cooldownElapsedTime;
- private int _projectileNumber;
- // OnStateEnter is called when a transition starts and the state machine starts to evaluate this state
- override public void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
- {
- if(_projectileBase == null) //Helps to omptimize code, avoid calling it every state enter
- {
- _projectileBase = animator.gameObject.GetComponent<EnemyFireProjectileBase>();
- _player = _projectileBase.m_player;
- _rb = _projectileBase.m_rb;
- _intervalElapsedTime = 0f;
- _cooldownElapsedTime = _projectileBase.m_cooldown;
- _projectileNumber = 0;
- }
- }
- // OnStateUpdate is called on each Update frame between OnStateEnter and OnStateExit callbacks
- override public void OnStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
- {//<summary> Count up cooldown elapsed time. If conditions met, count up interval elapsed time. When conditions met, fire projectile, and reset
- if (_cooldownElapsedTime >= _projectileBase.m_cooldown)
- {
- _intervalElapsedTime += Time.deltaTime;
- if (_intervalElapsedTime >= _projectileBase.m_firingInterval)
- {
- _direction = ((Vector2)_player.transform.position - _rb.position).normalized; //Find direction to player.
- fireProjectile(_direction * _projectileBase.m_speed, _projectileNumber);
- }
- }
- else
- {
- _cooldownElapsedTime += Time.deltaTime;
- }
- }
- // OnStateExit is called when a transition ends and the state machine finishes evaluating this state
- override public void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
- {
- _intervalElapsedTime = 0f;
- _cooldownElapsedTime = 0f;
- _projectileNumber = 0;
- }
- private void fireProjectile(Vector2 velocity, int projectileNumber)
- {//<summary> Set a projectile active, give it a velocty, reset elapsed time, then increase projectile number.
- if (_projectileBase.m_projectiles[_projectileNumber].activeSelf == true)
- {//<summary> If it is active, return our of the function
- return;
- }
- else
- {
- _projectileBase.m_projectiles[_projectileNumber].SetActive(true);
- _projectileBase.m_projectiles[_projectileNumber].transform.position = _rb.position;
- _projectileBase.m_rbList[projectileNumber].linearVelocity = velocity;
- _intervalElapsedTime = 0f;
- _projectileNumber++;
- if (_projectileNumber >= _projectileBase.m_projectiles.Length)
- {//Reset projectile numebr
- _projectileNumber = 0;
- _cooldownElapsedTime = 0f;
- }
- }
- }
- private void resetAllProjectile(bool setActive)
- {//<summary> Reset position, and if true, set active (to be used again). Instansiate is very expensive
- for (int i = 0; i < _projectileBase.m_projectiles.Length; i++)
- {
- _projectileBase.m_projectiles[i].transform.position = _rb.transform.position;
- if (setActive) //Require if, incase projectiles want to be reset position without disabling
- {
- _projectileBase.m_projectiles[i].SetActive(true);
- }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment