Page 1 sur 1
task Manager
Publié : 13 Fév 2021 16:37
par stcp
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.
Re: task Manager
Publié : 14 Fév 2021 23:22
par youtpout
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.
Re: task Manager
Publié : 16 Fév 2021 21:13
par stcp
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
pour la priorité je pense à une mise à jour de cette liste avec une mise en ordre par Priority
et sa suffirai ?
Re: task Manager
Publié : 16 Fév 2021 21:21
par youtpout
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);
Re: task Manager
Publié : 17 Fév 2021 21:10
par stcp
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
Re: task Manager
Publié : 18 Fév 2021 11:05
par youtpout
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();