Пример #1
0
    /// <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());
                }
            }
        }
    }
Пример #2
0
    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());
                }
            }
        }
    }