// OnStateUpdate is called on each Update frame between OnStateEnter and OnStateExit callbacks override public void OnStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) { if (fish.launchingAttack) { //checking hit RaycastHit2D hit2D; //if hit a wall, change direction hit2D = Cast("Wall"); if (hit2D) { direction = -direction; PetUtility.FlipTransform(fish.transform); passedEnemies.Clear(); } //if hit an enemy, attack enemy hit2D = Cast("Ghost"); if (hit2D) { Ghost ghost = hit2D.collider.GetComponent <Ghost>(); if (!passedEnemies.Contains(ghost)) { ghost.TakeDamage(fish.damage); passedEnemies.Add(ghost); } } //if comeback to origin position, stop launching attack and set the timer for next attack if (Mathf.Abs(fish.transform.position.x - start.x) <= fish.rollingSpeed / 29 && (PetUtility.GetSameFloorGhost(fish.transform.position) == null) && rolling) { fish.GetComponent <Rigidbody2D>().velocity = Vector2.zero; //Debug.Log("Back To Start!"); rolling = false; void FinishAttack() { fish.launchingAttack = false; stopTime = Time.time; } PetUtility.WaitAndDo(fish.rollingGap, FinishAttack); return; } else if (rolling) { //setting velocity Vector2 velocity = fish.GetComponent <Rigidbody2D>().velocity; velocity.x = fish.rollingSpeed * direction; fish.GetComponent <Rigidbody2D>().velocity = velocity; } } else if (Time.time - fish.rollingGap >= stopTime) { //start Rolling fish.launchingAttack = true; rolling = true; Init(animator); } }