Hello Bixarrio.
I’ve checked my method, nothing seems different for me from the native code …
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;
}
//Création de la variable de test de distance de tir
//On additionne la valeur absolue en x et en z de la valeur des cases (leurs coordonnées x et z)
int TestShootDistance = Math.Abs(x) + Math.Abs(z);
//Si cette valeur est supèrieure à la valeur de tir alors on ne fait rien et on continue le script.
if (TestShootDistance > maxShootDistance)
{
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
}
The thing I don’t understand is that my first unit at the beginning is already out of range when I choose Shoot and I haven’t error message:
It’s when I want to go away with the second unit and ending the turn that the problem appears…
At the beginning of the third round, by default I’m in the moving action so I haven’t yet the error.
If I select the other unit nearest us and select shoot action, it’s out of range so the square ender the enemy doesn’t appear, no error message:
but if I select the most far unit, the one I’ve moved, it’s out of shoot range, like the other but I have the message error:
…
The error messages for Unity seem to come from the GetGridObject method in the GridSystem script:
public GridObject GetGridObject(GridPosition gridPosition)
{
return gridObjectArray[gridPosition.x, gridPosition.z];
}
From the level grid, the line where we create the gridObject variable (the first line)
public bool HasAnyUnitOnGridPosition (GridPosition gridPosition)
{
GridObject gridObject = gridSystem.GetGridObject(gridPosition);
return gridObject.HasAnyUnit();//Récupère la valeur de la booléenne du script gridObject qui vérifie si une unité est déjà sur la case.
}
From the line in the shootAction Script in the GetValidGridPositionList method:
if (!LevelGrid.Instance.HasAnyUnitOnGridPosition(testGridPosition))
{
//Si la case n'est occupée par aucune unité, alors on continue la recherche des possibles.
continue;
}
In the GridSystemVidual, in the update method, the last line ( ShowGridPositionList(
selectedAction.GetValidActionGridPositionList()):
public void UpdateGridVisual()
{
HideAllGridPosition();
BaseAction selectedAction = UnitActionSystem.Instance.GetSelectedAction(); // Ancienne ligne avec problème 2022-10-15
ShowGridPositionList(
selectedAction.GetValidActionGridPositionList()); //Ancienne ligne avec problème 2022-10-15
}
And the last in the GridSystemVisual scripot, in the Update method:
public void Update()
{
UpdateGridVisual();
}
If it can help
Thanks, take care.
François