¿Hay alguna forma de hacer enlace bidireccional de datos en Unity?
Os cuento mi problema: me dedico al desarrollo del software de forma profesional, pero no al desarrollo de videojuegos. Hace un tiempo empecé un proyecto personal en Unity, simplemente por probar algo nuevo. Como era mi primer videojuego, pensé en hacer algo muy sencillo: un sudoku.
Estoy intentando programar de la forma más clara y limpia posible, y por ello pensé en separar el "motor" del juego de la parte visual. Por eso, mi motor está escrito en C# plano, sin usar ninguna clase de Unity, y luego tengo por separado la parte que sí que depende de Unity (por ejemplo, clases que heredan de MonoBehaviour).
Por poner un ejemplo, en la parte del motor tengo una clase para el tablero, la cual contiene una matriz 9x9 de objetos de clase Celda. Estas celdas tienen atributos como el valor (entero de 0 a 9), un booleano para indicar si es editable o no, etc. Y luego, por otra parte, en el namespace "GUI" tengo otra clase Celda, la cual hereda de MonoBehaviur, y la cual contiene un enlace a la instancia de Celda del motor, además de otras funciones relacionadas con Unity, como por ejemplo una referencia a un objeto TextMeshProUGUI en el que se muestra el valor de la celda, funciones para la rotación de la celda (estoy haciendo la GUI en 3D, por practicar), etc.
El problema que tengo es que cada vez que quiero actualizar el valor de "GUI.Celda", también tengo que actualizar "Motor.Celda", y viceversa. Por ejemplo, digamos que el usuario introduce un valor de una celda. En este caso, tendría que actualizar el valor del objeto TextMeshProUGUI y, además, actualizar el valor de "Motor.Celda". Del mismo modo, me gustaría que cuando yo cambiase el valor de una celda desde el motor, la GUI se actualizase automáticamente.
¿Hay alguna forma de hacer esto? Por un lado he encontrado esta librería, pero parece que está un poco abandonada y no la utiliza mucha gente: https://github.com/Real-Serious-Games/Unity-Weld. Por otro lado, siempre podría usar "GUI.Celda" en mi motor y eso resolvería el problema, pero eso rompería la separación de conceptos (separation of concerns, no sé cuál es el término correcto en español), y el código estaría quizá peor estructurado. O quizá estoy intentando rizar el rizo y lo normal en la industria de los videojuegos es mezclar el backend y el frontend (por así decirlo), ya que los juegos son inherentemente visuales.
El motivo de querer hacer esto así es porque en todos los tutoriales que he visto por internet (tanto en YouTube como escritos), la calidad del código que he visto siempre es bastante baja: clases con demasiadas responsabilidades, código espagueti, los tests ni los mencionan de pasada, etc. Por eso estaba intentando escribir código algo más mantenible de lo que he visto, ya que en todos los tutoriales que he visto se centran mucho en conseguir un resultado rápido, y el código resultante funciona, pero a la larga sería inmantenible.