task Manager

Questions à propos du scripting. Hors Shader, GUI, Audio et Mobile.
stcp
Messages : 56
Inscription : 07 Mai 2011 08:24

task Manager

Message par stcp » 13 Fév 2021 16:37

Bonjour à la communautés !
Alors je me pose la question comment géré les divers taches dans un RTS.
Exemple : construire un bâtiment, récolter, alimenter un bâtiment en ressource.

J’imagine qu'il faut créer une liste de job avec une option de priorité,
Comment créer cette liste ?

Comment dire a mon NavMesh agent va faire çà et ensuite tu fera ça !

Je pense créer une liste d'agent qui ne travail pas, et dès qu'une tache est crée dans la Job-Liste je sélectionne l'agent ne travaillant pas le plus proche pour effectuer le job.

Des avis sur la question ?
Merci.

youtpout
Messages : 71
Inscription : 15 Nov 2020 15:54

Re: task Manager

Message par youtpout » 14 Fév 2021 23:22

Tu as le type list en c# (tu peux utiliser un tableau sinon), ta liste peux contenir un object (une classe), à toi de définir les différentes propriétés de ta classe pour que ça corresponde à ce que tu attends.
Tu peux aussi trier ta liste en fonction d'une propriété de ta classe.

stcp
Messages : 56
Inscription : 07 Mai 2011 08:24

Re: task Manager

Message par stcp » 16 Fév 2021 21:13

des class dans une liste .
Ok,.
un peut comme ça

Code : Tout sélectionner

public class Task
{
    public int Priority { get; set; }
    public int TaskID { get; set; }
    public Vector3 TaskPos { get; set; }
}
et pour faire une liste de cette class

Code : Tout sélectionner

 public List<Task> TaskList = new List<Task>();
pour la priorité je pense à une mise à jour de cette liste avec une mise en ordre par Priority
et sa suffirai ? :roll:

youtpout
Messages : 71
Inscription : 15 Nov 2020 15:54

Re: task Manager

Message par youtpout » 16 Fév 2021 21:21

Oui c'est ça attention de ne pas appeler ta classe Task qui est déjà le nom d'une classe du framework .net.

En reprenant ton code pour trier

Code : Tout sélectionner

        var orders = TaskList.OrderBy(t => t.Priority);
        var ordersDesc = TaskList.OrderByDescending(t => t.Priority);

stcp
Messages : 56
Inscription : 07 Mai 2011 08:24

Re: task Manager

Message par stcp » 17 Fév 2021 21:10

Je suis content du résultat de ce test qui fonctionne

Code : Tout sélectionner

public class Job
{
    public int Priority { get; set; }
    public int JobID { get; set; }
    public Vector3 JobPos { get; set; }
    public NavMeshAgent Agent { get; set; }

}

Code : Tout sélectionner

using System.Collections.Generic;
using UnityEngine.AI;
using UnityEngine;
using System.Linq;

public class JobManager : MonoBehaviour
{
    public List<Job> JobList = new List<Job>();
    public NavMeshAgent agent;
    int IdJob = 0;

    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            RaycastHit hit;

            if (Physics.Raycast(Camera.main.ScreenPointToRay(Input.mousePosition), out hit, 100))
            {
               MoveToJob(hit.point, Mathf.FloorToInt(Random.Range(0,5)));

            }
        }
    }

    public void MoveToJob(Vector3 Target, int Prioritize)
    {
        IdJob++;

        Job NewJob = new Job()
        {
            JobID = IdJob,
            Priority = Prioritize,
            Agent = agent,
            JobPos = Target
        };
        JobList.Add(NewJob);
        UpJobListe();
    }

    void UpJobListe()
    {
        if (JobList.Count > 0)
        {
            JobList = JobList.OrderBy(x => x.Priority).Reverse().ToList();
            JobList = JobList.OrderByDescending(x => x.Priority).Reverse().ToList();

            for (int i = 0; i < JobList.Count; ++i)
            {
                Debug.Log(JobList[i].JobID + " / " + JobList[i].Priority);
            }
        }
    } 
}
Je m’attendais a quelque chose de plus lourd !

Reste a déterminer comment la tache se termine. dans le temps ou l'action faite

youtpout
Messages : 71
Inscription : 15 Nov 2020 15:54

Re: task Manager

Message par youtpout » 18 Fév 2021 11:05

Heu mes 2 exemple était l'un pour trier par ordre croissant et l'autre par ordre décroissant, tu utilises soit l'un soit l'autre

Code : Tout sélectionner

 void UpJobListe()
    {
        if (JobList.Count > 0)
        {
            JobList = JobList.OrderBy(x => x.Priority).ToList();

            for (int i = 0; i < JobList.Count; ++i)
            {
                Debug.Log(JobList[i].JobID + " / " + JobList[i].Priority);
            }
        }
    } 
cette ligne suffit JobList = JobList.OrderBy(x => x.Priority).ToList();

Répondre

Revenir vers « Scripting »