Em 2D ou 3D, um sistema de componente de entidade (ECS) deve ter pelo menos acesso ao sistema da GUI, se não fizer parte do mesmo ECS.
Pessoalmente, eu não misturaria os dois. A reutilização do código para uma GUI realmente acontece apenas no nível superior. Respondendo ao mouse / teclado, renderização e assim por diante. As funções que diferentes botões executam ou as informações exibidas por determinadas listas não são realmente algo que possa ser tornado genérico o suficiente para ser reutilizado.
Por exemplo, eu imaginaria que os componentes para entidades da GUI seriam algo como position
, render
e gui
. Onde o componente da GUI definiria o tipo de ação que a entidade da GUI executa. No entanto, essa ação será única e específica ao contexto. Isso resulta no sistema que lida com os componentes da GUI ser muito grande e essencialmente projetado para lidar com cada uma das funções da GUI (carregar o jogo, salvar o jogo, encontrar o servidor, etc.). Parece bagunçado.
Eu preferiria criar um arquivo de classe padrão para cada "tela" da GUI. Tenha todas as funcionalidades dessa tela em um só lugar (com referências a uma classe de funcionalidade comum). É muito mais limpo e fácil de gerenciar.
No entanto, como eu disse, o ECS deve ter acesso ao sistema GUI. Ele precisa fornecer informações à GUI com base nas entidades em seus sistemas. Por exemplo, passar o mouse sobre uma unidade aliada abriria uma janela da GUI com todas as informações sobre essa unidade. Onde pairar sobre uma unidade inimiga apareceria uma janela da GUI com informações limitadas. Você provavelmente não deseja programar a GUI para saber a diferença entre os dois; você deseja solicitar à entidade que exiba suas informações.
Portanto, é provável que as entidades ainda tenham algum tipo de componente da GUI, mas estarão entidades "em jogo", não entidades da GUI. Este componente usará o sistema GUI externo para criar sua interface GUI.