/// <summary> /// Sortie de l'état "PATH" /// </summary> public void Update() { // S'il y a un chemin if (parent.MyPath != null) { // Déplacement vers la destination transform.position = Vector2.MoveTowards(transform.position, destination, speed * Time.deltaTime); // Active le layer parent.ActivateLayer("WalkLayer"); // Position de la cellule de destination Vector3Int dest = parent.MyAstar.MyTilemap.WorldToCell(destination); // Position de la cellule de courante Vector3Int nodeCurrent = parent.MyAstar.MyTilemap.WorldToCell(currentNode); // Distance à parcourir float distance = Vector2.Distance(destination, transform.position); // Distance totale float totalDistance = Vector2.Distance(parent.MyTarget.transform.parent.position, transform.position); // Direction vers le bas if (nodeCurrent.y > dest.y) { parent.MyDirection = Vector2.down; } // Direction vers le haut else if (nodeCurrent.y < dest.y) { parent.MyDirection = Vector2.up; } if (nodeCurrent.y == dest.y) { // Direction vers la gauche if (nodeCurrent.x > dest.x) { parent.MyDirection = Vector2.left; } // Direction vers la droite else if (nodeCurrent.x < dest.x) { parent.MyDirection = Vector2.right; } } // Si on dans dans la zone d'attaque if (totalDistance <= parent.MyAttackRange) { // Passage à l'état d'attaque parent.ChangeState(new AttackState()); } // Si la distance est nulle if (distance <= 0f) { // S'il y a un chemin à faire if (parent.MyPath.Count > 0) { // Mise à jour du noeud courant currentNode = destination; // Mise à jour de la destination destination = parent.MyPath.Pop(); // Si la cible n'est pas au même endroit if (targetPosition != Player.MyInstance.MyCurrentTile.position) { // Passage à l'état de recherche parent.ChangeState(new PathState()); } // Si l'ennemi est sur la même tile mais trop loin du joueur else if (Player.MyInstance.MyCurrentTile.position == parent.MyCurrentTile.position) { // Passage à l'état de poursuite parent.ChangeState(new FollowState()); } } else { // Réinitialise le chemin parent.MyPath = null; // Passage à l'état d'évasion parent.ChangeState(new EvadeState()); } } } }
public void Update() { if (parent.MyPath != null) { transform.position = Vector2.MoveTowards(transform.position, destination, parent.CurrentSpeed * Time.deltaTime); parent.ActivateLayer("WalkLayer"); Vector3Int dest = parent.MyAstar.MyTilemap.WorldToCell(destination); Vector3Int cur = parent.MyAstar.MyTilemap.WorldToCell(current); float distance = Vector2.Distance(destination, transform.position); float totalDistance = Vector2.Distance(parent.MyTarget.transform.parent.position, transform.position); if (cur.y > dest.y) { parent.Direction = Vector2.down; } else if (cur.y < dest.y) { parent.Direction = Vector2.up; } if (cur.y == dest.y) { if (cur.x > dest.x) { parent.Direction = Vector2.left; } else if (cur.x < dest.x) { parent.Direction = Vector2.right; } } if (totalDistance <= parent.MyAttackRange) { parent.ChangeState(new AttackState()); } else if (Player.MyInstance.MyCurrentTile.position == parent.MyCurrentTile.position) { parent.ChangeState(new FollowState()); } if (distance <= 0f) { if (parent.MyPath.Count > 0) { current = destination; destination = parent.MyPath.Pop(); if (targetPos != Player.MyInstance.MyCurrentTile.position) //Then the player has moved { parent.ChangeState(new PathState()); } } else { parent.MyPath = null; parent.ChangeState(new PathState()); } } } }