Ejemplo n.º 1
0
    /// <summary>
    /// Asigna una acción al personaje de manera automatica de todas las que haya. De momento el criterio a seguir será el siguiente:
    /// - Prioridad más alta.
    /// - Distancia más cercana al personaje.
    /// TODO:
    /// - Despues de prioridad, que busque la acción que más se adapte a sus habilidades.
    /// </summary>
    /// <param name="character"></param>
    public void AssignActionCharacter(Personaje character)
    {
        if (character.IsWorking())
        {
            Debug.Log("AssignActionCharacter error: Actualmente el personaje tiene alguna acción que reallizar");
            return;
        }

        //Ahora buscará la mejor acción para el personaje.
        GameAction ChosenAction = null;
        int        priority     = 0;
        float      distance     = 10000;
        int        i            = 0;

        foreach (GameAction action in actions.Keys)
        {
            if (action.worker != null || action.desactivado || (action.atributo != ATRIBUTO.Salud && !character.attributes.IsActive(action.atributo)))
            {
                continue;
            }

            float thisDistance = Vector3.Distance(character.transform.position, (Vector3)action.node.GetPosition());
            if (action.prioridad > priority)
            {
                priority     = action.prioridad;
                ChosenAction = action;
                distance     = thisDistance;
            }
            else if (thisDistance < distance)
            {
                ChosenAction = action;
                distance     = thisDistance;
            }

            i++;
        }

        //No ha encontrado una acción
        if (ChosenAction == null)
        {
            Debug.Log("AssignActionCharacter error: No ha encontrado una buena acción para el personaje.");
            return;
        }

        //Devuelve el camino más cercano entre el personaje y el nodo donde se encuentra la acción.
        //De no encontrar el lugar devolverá [0, 0] y desactivará la acción durante 5s.
        PathResult resultado = manager.path.PathFind(character, new PathSetting(ChosenAction.node.GetPosition()));

        if (resultado.GetFinalPosition() == new IntVector2(0, 0))
        {
            ChosenAction.Desactivar(5f);
            return;
        }

        //Por último se añade la acción al personaje para que realice la acción y le traza la ruta más cercana.
        ChosenAction.AssignCharacter(character);
        character.SetPositions(resultado.path);
    }
Ejemplo n.º 2
0
 /// <summary>
 /// Utilizado cuando se devuelve una acción DESACTIVADA a la cola a la espera de que se active.
 /// </summary>
 public void ReturnAction(GameAction action)
 {
     if (actions.ContainsKey(action))
     {
         //TODO: Arreglar esto
         action.worker.RemoveAction(action, false);
         action.UnassingCharacter();
         action.Desactivar(5f);
     }
 }