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.
task Manager
Re: task Manager
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.
Tu peux aussi trier ta liste en fonction d'une propriété de ta classe.
Re: task Manager
des class dans une liste .
Ok,.
un peut comme ça
et pour faire une liste de cette class
pour la priorité je pense à une mise à jour de cette liste avec une mise en ordre par Priority
et sa suffirai ?
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; }
}
Code : Tout sélectionner
public List<Task> TaskList = new List<Task>();
et sa suffirai ?
Re: task Manager
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
En reprenant ton code pour trier
Code : Tout sélectionner
var orders = TaskList.OrderBy(t => t.Priority);
var ordersDesc = TaskList.OrderByDescending(t => t.Priority);
Re: task Manager
Je suis content du résultat de ce test qui fonctionne
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
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);
}
}
}
}
Reste a déterminer comment la tache se termine. dans le temps ou l'action faite
Re: task Manager
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
cette ligne suffit JobList = JobList.OrderBy(x => x.Priority).ToList();
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);
}
}
}