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