Hace algún tiempo comencé a trabajar con Unity y todavía lucho con el tema de los scripts estrechamente acoplados. ¿Cómo puedo estructurar mi código para evitar este problema?
Por ejemplo:
Quiero tener sistemas de salud y muerte en guiones separados. También quiero tener diferentes guiones de caminata intercambiables que me permitan cambiar la forma en que se mueve el personaje del jugador (controles inerciales basados en la física como en Mario versus controles apretados y nerviosos como en Super Meat Boy). El script de Salud debe contener una referencia al script de Muerte, para que pueda activar el método Die () cuando la salud de los jugadores alcance 0. El script de Muerte debe contener alguna referencia al script de caminar utilizado, para deshabilitar caminar sobre la muerte (I Estoy cansado de zombies).
Yo normalmente crear interfaces, como IWalking
, IHealth
y IDeath
, de modo que pueda cambiar estos elementos en un capricho sin romper el resto de mi código. Me gustaría tenerlos configurados por un guión separado en el objeto jugador, por ejemplo PlayerScriptDependancyInjector
. Tal vez ese guión tendría públicas IWalking
, IHealth
y IDeath
atributos, de manera que las dependencias pueden ser establecidas por el diseñador de niveles del inspector de arrastrar y soltar los scripts apropiados.
Eso me permitiría simplemente agregar comportamientos a los objetos del juego fácilmente y no preocuparme por las dependencias codificadas.
El problema en la unidad
El problema es que en Unity no puedo exponer interfaces en el inspector, y si escribo mis propios inspectores, las referencias no se serializarán, y es un trabajo innecesario. Es por eso que me queda escribir código estrechamente acoplado. Mi Death
guión expone una referencia a un InertiveWalking
guión. Pero si decido que quiero que el personaje del jugador controle estrictamente, no puedo simplemente arrastrar y soltar el TightWalking
guión, necesito cambiar el Death
guión. Eso apesta. Puedo lidiar con eso, pero mi alma llora cada vez que hago algo así.
¿Cuál es la alternativa preferida a las interfaces en Unity? ¿Cómo soluciono este problema? Encontré esto , pero me dice lo que ya sé, ¡y no me dice cómo hacerlo en Unity! Esto también analiza lo que debe hacerse, no cómo, no aborda el problema del acoplamiento estrecho entre scripts.
En general, creo que están escritos para personas que vinieron a Unity con experiencia en diseño de juegos y que simplemente aprenden a codificar, y hay muy pocos recursos en Unity para desarrolladores habituales. ¿Hay alguna forma estándar de estructurar su código en Unity, o tengo que descubrir mi propio método?
The problem is that in Unity I can't expose interfaces in the inspector
No creo entender lo que quieres decir con "exponer la interfaz en el inspector" porque mi primer pensamiento fue "¿por qué no?"