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, IHealthe 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, IHealthe IDeathatributos, 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 Deathscript expõe uma referência a um InertiveWalkingscript. Mas se eu decidir que quero que o personagem do jogador controle firmemente, não posso simplesmente arrastar e soltar o TightWalkingscript, 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 inspectorAcho que não entendo o que você quer dizer com "expor a interface no inspetor" porque meu primeiro pensamento foi "por que não?"