Ok tres bien j'ai mis ca en place et ca marche nikel.
De plus j'ai rajoute une petite condition dans le test du raycast pour anticiper la partie "points de mouvement". En gros si le point d'impact est a plus de 3 cases du player alors on highlight pas la case et du coup impossible de se deplacer jusqu'a cette case.
Le 3 sera remplace par les points de mouvement effectif du joueur plus tard mais c'etait juste pour mettre une limite parce que la le joueur pouvait partir a l'autre bout de la map en 1 coup sans complexe. A noter que le pathfinding n'est toujours pas code pour le moment, les deplacements s'effectuent a coup de teleportation.
EDIT : Bon voila je viens de commencer mon algo de Astar et je voudrais savoir ce que vous en pensiez (si c'est totalement degueulasse ou pas) :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 | using UnityEngine; using System.Collections; using System.Collections.Generic; public class AstarScript : MonoBehaviour { private Vector3 currentPosition; private Vector3 arrivalPosition; private List<Vector3> openList; private List<Vector3> closeList; // Use this for initialization void Start () { openList = new List<Vector3> (); closeList = new List<Vector3>(); } // Update is called once per frame void Update () { } public void init (Vector3 currPosition, Vector3 arrPosition) { currentPosition = currPosition; arrivalPosition = arrPosition; openList.Add(currentPosition); closeList.Clear(); Astar (); } private void Astar() { int cheapestElementIndex; int cheapestElementCost; bool checkBool = computeCosts (out cheapestElementIndex, out cheapestElementCost); closeList.Add (openList [cheapestElementIndex]); openList.RemoveAt (cheapestElementIndex); } private bool computeCosts (out int cheapestIndex, out int cheapestCost) { int h; //heuristic from element to arrivalPostion int g; //cost of movement from currentPosition to element int f; //cost of path from currentPosition to arrivalPosition going through element for (int i = 0; i < openList.Count; i++) { //heuristic is equal to manhattan distance h = (int) Mathf.Abs(arrivalPosition.x - openList[i].x) + Mathf.Abs(arrivalPosition.z - openList[i].z); //corst of movement if equal to 1 since every movement have the same weight (might change later) g = 1; //cost of path is equal to addition of heuristic and cost of movement f = h + g; //if it is the first element we check or if it is cheaper than previous ones if(cheapestCost == null || f < cheapestCost) { //then we store its cost and its index cheapestCost = f; cheapestIndex = i; } } } } |
a savoir que pour ma fonction computeCosts je suis pas bien sur de l'utilite de renvoyer un bool mais j'ai vu que c'etait pas mal utilise sur les fonctions avec des parametres out … (j'avoue ne pas trop maitriser cet aspect du c#) De meme pour les List c'est a peut pret le premier programme dans lequel je les utilise en C# et deja en C++ je maitrisais pas vraiment le concept alors bon :/
EDIT 2 : bon apparemment je n'ai pas pige le concept des parametres out puisque je me tape une erreur Assets/Scripts/AstarScript.cs(60,28): error CS0269: Use of unassigned out parameter `cheapestCost'
De plus j'ai un soucis avec mon cast sur l'attribution de la valeur a h :
Assets/Scripts/AstarScript.cs(54,25): error CS0266: Cannot implicitly convert type float' to
int'. An explicit conversion exists (are you missing a cast?)
J'avoue ne pas comprendre puisque justement je fais le cast …
EDIT 3 : bon ok pour le cast je suis un boloss, j'ai remplace le cast (int) en System.Convert.ToInt32() et ca marche nikel. Je savais pas que ce type de cast ne marchait pas en C# mais bon je le saurai pour la prochaine fois. Par contre toujours pas de solution pour l'autre erreur
EDIT 4 : toujours aussi con … fallait juste instancier les variables out dans la fonction tout simplement …
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | private void Astar() { int cheapestElementIndex; int cheapestElementCost; bool checkBool = computeCosts (out cheapestElementIndex, out cheapestElementCost); closeList.Add (openList [cheapestElementIndex]); openList.RemoveAt (cheapestElementIndex); } private bool computeCosts (out int cheapestIndex, out int cheapestCost) { int h; //heuristic from element to arrivalPostion int g; //cost of movement from currentPosition to element int f; //cost of path from currentPosition to arrivalPosition going |through element cheapestCost = System.Convert.ToInt32(Mathf.Infinity); cheapestIndex = System.Convert.ToInt32(Mathf.Infinity); for (int i = 0; i < openList.Count; i++) { //heuristic is equal to manhattan distance h = System.Convert.ToInt32(Mathf.Abs(arrivalPosition.x - openList[i].x) + |Mathf.Abs(arrivalPosition.z - openList[i].z)); //corst of movement if equal to 1 since every movement have the same weight (might |change later) g = 1; //cost of path is equal to addition of heuristic and cost of movement f = h + g; //it is cheaper than previous ones if(f < cheapestCost) { //then we store its cost and its index cheapestCost = f; cheapestIndex = i; } } return true; } |