In 2D o 3D, un sistema di componenti di entità (ECS) dovrebbe almeno avere accesso al sistema di interfaccia grafica, se non fa parte dello stesso ECS.
Personalmente, non mescolerei i due. La riusabilità del codice per una GUI avviene davvero solo al massimo livello. Risposta al mouse / tastiera, rendering e così via. Le funzioni che assumono pulsanti diversi o le informazioni visualizzate da determinati elenchi non sono in realtà qualcosa che può essere reso abbastanza generico da riutilizzarlo.
Ad esempio, immaginerei che i componenti per le entità della GUI sarebbero qualcosa del genere position
, render
e gui
. Dove il componente GUI definirebbe il tipo di azione intrapresa dall'entità GUI. Tuttavia, tale azione sarà piuttosto unica e specifica per il contesto. Ciò comporta che il sistema che gestisce i componenti della GUI è molto grande ed essenzialmente progettato per gestire ciascuna delle funzioni della GUI (carica gioco, salva gioco, trova server, ecc.). Sembra disordinato.
Preferirei fare un file di classe standard per ogni "schermata" della GUI. Avere tutte le funzionalità per quella schermata in un unico posto (con riferimenti a una classe di funzionalità comune). È molto più ordinato e più facile da gestire.
Tuttavia, come ho detto, l'ECS dovrebbe avere accesso al sistema di interfaccia grafica. Deve essere in grado di fornire informazioni alla GUI in base alle entità nei suoi sistemi. Ad esempio, passando con il mouse sopra un'unità alleata si aprirà una finestra della GUI con tutte le informazioni su quell'unità. Il passaggio del mouse su un'unità nemica fa apparire una finestra della GUI con informazioni limitate. Probabilmente non vuoi programmare la GUI per conoscere la differenza tra i due, vuoi chiedere all'entità di visualizzare le sue informazioni.
Pertanto, le entità avranno probabilmente un qualche tipo di componente GUI, ma saranno entità "in gioco", non entità GUI. Questo componente utilizzerà il sistema di GUI esterno per creare la sua interfaccia GUI.