Question sur les Entity/Component System

a marqué ce sujet comme résolu.

Bonjour à tous,

Voilà, depuis quelques jours, je lis certains articles concernant la mise en place d'un système d'ES en C++, mais malgré tous, j'ai encore beaucoup de mal à me conceptualiser la chose.

J'entend dire qu'on a d'un côté les entités, donc tous les objets du jeu, représentés seulement et uniquement sous forme d'identifiant, à côté les composants qui contiennent la matière qui va composer les entités et les systèmes qui vont permettre de faire "vivre" le tout.

Est-ce que vous pourriez, par un simple exemple/schéma, m'expliquer les relations qui existent entre ces trois entité et comment, grâce à de simple identifiant, les entités peuvent être lié aux composants ?

Merci d'avance de votre aide.

D'accord mais dans le cas d'un jeu 2D, on aura par exemple une classe Entity qui ne va rien faire à part contenir les ID de chaque objets du jeu, mais dans le concret (dans le code), comment cette classe est-elle utilisée ?

De même, une classe Component va permettre l'ajout de logique mais, comment se caractérise-t-elle ? En quoi est-elle différente d'une classe system ?

PS: UE4 est basé sur ce genre de système ou est-ce que les classes sont basé sur de l'héritage pure ?

Héritage pure, je sous-entend que toute les classes du moteur se basent sur un arbre d'héritage (un peu comme dans Qt).

Donc si je comprends bien, une classes "Entité" ne va contenir que des objets de type "Composant" et c'est grâce à ça quelle sera extensible à l'infinie ?

Et le système sert à quoi concrètement ? A interagir justement avec les composants de chaque entité ?

L'ECS est quelque chose d'assez mal défini, du fait que cette approche est assez récente (une dizaine d'années) et que chaque jeu/moteur l'adapte a ses besoins. Unity est un cas particulier d'ECS.

La définition la plus courante est la suivante :

  • les entités sont simplement des ID
  • les composants ne contiennent que des données
  • les systèmes contiennent les algorithmes

A chaque update, les systèmes parcourent la liste des entités, demandent si elles ont un composant correspondant au système et applique un traitement si c'est le cas.

Cela n'est pas incompatible avec ce que propose Unity. Je crois qu'il faut distinguer comment un moteur de jeux implémente en interne l'ECS (ce qui sera utilisé quand le jeu tourne et donc besoin de performances) et comment il présente l'ECS dans son éditeur (pas besoin de performances, le jeu ne tourne pas). En particulier, on peut remarquer que les systèmes sont des éléments internes au moteur, qui ne peuvent pas être manipulés par les concepteurs de jeux, ce qui n'est pas le cas des entités et des composants. Il peut donc tout à fait présenter les entités comme une liste de composants, même si en interne, il ne gère pas comme cela.

(ce sont des hypothèses de ma part, je ne connais pas comment unity est implémenté. Le principal est qu'il est possible que ces 2 visions de l'ECS ne sont pas incompatible)

On a un article sur les ECS en C++ en cours. Il traîne depuis septembre, donc j'essaie de le finir pour le mettre rapidement en beta.

+1 -0

Ce que tu décris est complètement exact côté moteur mais il faut garder en tête qu'à un moment, c'est aussi présenté à l'utilisateur. Dans les implémentations, en pratique, l'entité va quand même être une classe, parce que c'est l'objet que l'utilisateur va utiliser pour écrire son code, quitte à servir de simple helper.

Stranger

Oui, je parlais du cas général. En pratique, on trouvera des implémentations avec une classe pour l'id, voire des classes Entity avec des vector de Component, etc.

Attention, ça dépend du moteur ça. C'est vrai pour Source, pour Ogre3D si tu as un éditeur, je ne sais pas ce que fait Unity aujourd'hui mais Unreal par exemple n'a pas du tout cette distinction, l'éditeur est bâti intégralement autour du jeu (moteur de rendu, de GUI, tout est commun) et tu compile l'éditeur en même temps que tu compile ton jeu.

Stranger

Oui, je ne faisais pas la distinction entre éditeur intégré dans le moteur et éditeur externe. Dans les 2 cas, l’éditeur peut présenter les choses différemment de comment c'est implémenter en interne. Ou pas. Je disais juste que cela n’était pas incompatible

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte