Infinite coolOff in the console during playing

Hello,
for an unknew reason, everything workss well even the fact that I’ve infinit coolOff in the console after ending the shoot:

I don’t understand too much why?

Here is my shoot script :

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;

public class ShootAction : BaseAction
{
    // Script test basé sur le script move action
    private enum State
    {
        Aiming,
        Shooting,
        Cooloff,
    }

    [SerializeField] private Sprite ShootActionIcon;

    private State state;
    private int maxShootDistance = 7;
    private float stateTimer;
    private Unit targetUnit;
    private bool canShootBullet;

    public override string GetActionName()
    {
        return "Shoot";
    }

    public override string CurrentActionName()
    {
        return "Shooting";
    }

    public override Sprite GetActionIcon()
    {
        return ShootActionIcon;
    }

    private void Update()
    {
        if (!isActive)
        {
            return;
        }

        //Création du compte à rebours.
        stateTimer -= Time.deltaTime;

        //Création du basculement entre les 3 états avant le tir, la visée (aiming) le tir (shoot) et le relachement (cooloff) 
        switch (state)
        {
            case State.Aiming://Création de l'orientation de l'unité avant le tir vers la cible.

                Vector3 aimDir = (targetUnit.GetWorldPosition() - unit.GetWorldPosition()).normalized;//Définition du vector d'orientation

                float rotateSpeed = 10f;
                transform.forward = Vector3.Lerp(transform.forward, aimDir, Time.deltaTime * rotateSpeed);//On oriente le personnage dans la direction de déplacement.

                break;
            case State.Shooting:
                if (canShootBullet)
                {
                    Shoot();
                    canShootBullet = false;
                }

                break;
            case State.Cooloff:
                break;
        }

        if (stateTimer <= 0)//Si le compte à rebours atteind 0
        {
            NextState();
        }
    }

    private void Shoot()
    {
        targetUnit.Damage();
    }


    private void NextState()
    {
        switch (state)
        {
            case State.Aiming:
                state = State.Shooting;//Alors l'état suivant est le tir
                float shootingStateTime = 0.1f;//La durée de transition sera de 0.1 seconde.
                stateTimer = shootingStateTime;
                break;
            case State.Shooting:
                state = State.Cooloff;//Alors l'état suivant est le relachement
                float cooloffStateTime = 0.5f;//La durée de transition sera de 0.5 seconde.
                stateTimer = cooloffStateTime;
                break;
            case State.Cooloff:
                //L'unité n'est plusa ctive, On lance la méthode onActionComplete
                onActionComplete();
                break;
        }

        Debug.Log(state);
    }


    //Pour tester la distance d'une cible on calque sur le pricipe du déplacement suivant le nombre de cases autorisées.
    //On remplace les maxMoveDistance par notre maxShootDistance
    public override List<GridPosition> GetValidActionGridPositionList()//Création de la liste des cases valides pour le déplacement
    {
        List<GridPosition> validGridPositionList = new List<GridPosition>();//Création de la liste nommée validGridActionPosition

        GridPosition unitGridPosition = unit.GetGridPosition();//On récupère l'information de la position de l'unité en allant la chercher dans le script Unit.

        for (int x = -maxShootDistance; x <= maxShootDistance; x++)
        {
            for (int z = -maxShootDistance; z <= maxShootDistance; z++)
            {
                GridPosition offsetGridPosition = new GridPosition(x, z);
                GridPosition testGridPosition = unitGridPosition + offsetGridPosition;//La variable TestPosition est le vecteur 2D X,Z qui correspond à la position actuelle de l'unité + la valeur de l'offset choisie.

                if (!LevelGrid.Instance.IsValidGridPosition(testGridPosition))//N'affiche que les positions atteignables mais aussi la position d'origine. ! logique inverse
                {
                    //Si la case vérifiée n'est pas dans celles possible, logique inverse, alors on continue de chercher les possibles.
                    continue;
                }

                if (!LevelGrid.Instance.HasAnyUnitOnGridPosition(testGridPosition))
                {
                    //Si la case n'est occupée par aucune unité, alors on continue la recherche des possibles.
                    continue;
                }

                //Définition de l'unité ciblée.
                Unit targetUnit = LevelGrid.Instance.GetUnitAtGridPosition(testGridPosition);

                //Test pour vérifier que l'unité ne cible pas une unité du même camp:
                if(targetUnit.IsEnemy() == unit.IsEnemy())
                {
                    continue;
                }

                validGridPositionList.Add(testGridPosition);
                //Debug.Log(testGridPosition);
            }
        }

        return validGridPositionList;//On renvoie la liste des positions d'arrivée valide
    }

    public override void TakeAction(GridPosition gridPosition, Action onActionComplete)
    {
        ActionStart(onActionComplete);

        targetUnit = LevelGrid.Instance.GetUnitAtGridPosition(gridPosition);//On récupère l'information concernant l'unité ciblée.

        Debug.Log("Aiming");
        state = State.Aiming;
        float aimingStateTime = 1f;//La durée de transition sera de 0.1 seconde.
        stateTimer = aimingStateTime;

        canShootBullet = true;

    }

}

any idea ?
I precise everything works nice. Only this infinite cooloff message…
Thanks.
François

It’s because the Update() continues to execute and your ShootAction is in the cooloff state. It looks like you are calling onActionComplete() (the callback) directly from the cooloff state. You are supposed to call the ActionComplete() of the base class. It performs more actions when completing the action, like setting _isActive = false; for example

Should be

            case State.Cooloff:
                //L'unité n'est plusa ctive, On lance la méthode onActionComplete
                ActionComplete(); // <-- THIS
                break;
2 Likes

errfff… the dumb i am sometime :slight_smile:
It’s so logical…
It can be difficult some time to have enought step back :slight_smile:
When I close my eyes I see code line … everywhere… everytime :stuck_out_tongue:
Thanks Bixarrio.
Have a nice day.

It’s my pleasure. Have a nice day, too

This topic was automatically closed 24 hours after the last reply. New replies are no longer allowed.

Privacy & Terms