Há algum tempo, comecei a trabalhar com o Unity e ainda luto com a questão de scripts fortemente acoplados. Como posso estruturar meu código para evitar esse problema?
Por exemplo:
Eu quero ter sistemas de saúde e morte em scripts separados. Eu também quero ter diferentes scripts de caminhada intercambiáveis que me permitam mudar a maneira como o personagem do jogador é movido (controles inerciais baseados em física, como em Mario, versus controles apertados e contorcidos, como em Super Meat Boy). O script Health precisa conter uma referência ao script Death, para que ele possa acionar o método Die () quando a saúde do jogador atingir 0. O script Death deve conter alguma referência ao script de caminhada usado, para desativar a caminhada na morte (I estou cansado de zumbis).
Normalmente , eu criaria interfaces como IWalking
, IHealth
e IDeath
, para poder alterar esses elementos por um capricho, sem interromper o restante do meu código. Eu gostaria que eles fossem configurados por um script separado no objeto player, digamos PlayerScriptDependancyInjector
. Talvez esse script teria públicas IWalking
, IHealth
e IDeath
atributos, de modo que as dependências podem ser definidos pelo designer nível do inspetor, arrastando e soltando scripts apropriados.
Isso me permitiria simplesmente adicionar comportamentos aos objetos do jogo facilmente e não me preocupar com dependências codificadas.
O problema na unidade
O problema é que, no Unity, não posso expor interfaces no inspetor, e se eu escrever meus próprios inspetores, as referências não serão serializadas e é muito trabalho desnecessário. É por isso que fiquei escrevendo código fortemente acoplado. Meu Death
script expõe uma referência a um InertiveWalking
script. Mas se eu decidir que quero que o personagem do jogador controle firmemente, não posso simplesmente arrastar e soltar o TightWalking
script, preciso alterá-lo Death
. Isso é péssimo. Eu posso lidar com isso, mas minha alma chora toda vez que faço algo assim.
Qual é a alternativa preferida para interfaces no Unity? Como corrijo esse problema? Eu encontrei isso , mas ele me diz o que eu já sei, e não me diz como fazer isso no Unity! Isso também discute o que deve ser feito, não como, não aborda a questão do forte acoplamento entre os scripts.
Em suma, acho que eles foram escritos para pessoas que vieram para o Unity com experiência em design de jogos que apenas aprendem a codificar, e há muito poucos recursos no Unity para desenvolvedores regulares. Existe alguma maneira padrão de estruturar seu código no Unity ou preciso descobrir meu próprio método?
The problem is that in Unity I can't expose interfaces in the inspector
Acho que não entendo o que você quer dizer com "expor a interface no inspetor" porque meu primeiro pensamento foi "por que não?"