La respuesta de Josh es asombrosa, pero me gustaría agregar:
Una de las mejores características de Entity / Component es la forma basada en datos en la que cada "cosa" en su juego es creada y administrada. Por lo que he visto, una vez que haya creado una buena biblioteca de tipos de componentes y sistemas, puede construir casi cualquier cosa con mínimas modificaciones de código. (Nota: mínimo! = 0 )
Al definir tu juego en términos de comportamiento y al darte la posibilidad de modificar esos comportamientos sobre la marcha, en tiempo de ejecución, durante la inicialización cargándolos desde un script o base de datos, etc., abres un mundo entero de nuevas posibilidades. ¿Quieres ver por qué tus sombras no aterrizan donde esperas? Agregue un componente de cámara / POV a su luz.
Entidad / componente te permite construir lo que quieras, siempre que hayas creado los bloques.
Además, la herencia múltiple causa el mismo problema que la herencia única. Cuando agrega un atributo o comportamiento en la jerarquía, se propaga. Mientras esté haciendo jerarquías profundas, se encontrará con situaciones en las que tendrá un peso innecesario, duplicará código o resolverá conflictos. La mayor parte de eso se puede evitar cuando imaginas tu juego como datos.
Acabo de empezar a jugar con esto en las últimas semanas, pero estoy impresionado de lo simples que se han vuelto las cosas. No es una bala de plata: me he encontrado con algunos casos en los que conectar una lambda a un componente era la forma más limpia y conveniente de resolver un problema, pero es un patrón bastante bueno, si se puede llamar así.
En una nota ligeramente relacionada: uno de los grandes y aburridos generadores de mantenimiento en aplicaciones centradas en datos (sitios web, etc.) está mapeando objetos jerárquicos en bases de datos relacionales. Tenemos muchas soluciones ingeniosas, pero en última instancia, todas son hacks diseñados para aplanar las jerarquías. En lugar de construir su modelo de modo que sirva para el propósito de la aplicación, termina comprometiéndose entre una jerarquía efectiva y una representación relacional lógica. He estado jugando con la idea de reconstruir una jerarquía bastante grande en una de mis aplicaciones como un sistema de entidad / componente, deshacerse de la jerarquía y hacer que la base de datos sea el Estándar de Oro para el resto de la implementación, y es prometedor.
Cuando integra capacidades como la generación dinámica de código / almacenamiento en caché de código que puede abordar problemas de rendimiento, termina con una arquitectura rápida, flexible y lógica que podría alcanzar el objetivo de código reutilizable de OOP de una manera mucho, mucho mejor.