Convidamos futuros alunos do curso "Unity Game Developer. Professional" a participarem de um webinar aberto sobre o tema "Inteligência artificial avançada de inimigos em atiradores".
Entretanto, sugerimos a leitura da tradução de um artigo útil.
Introdução
Ao longo dos anos trabalhando em muitos projetos, desenvolvi uma abordagem clara para a estruturação de projetos de jogos no Unity, o que provou ser particularmente extensível e sustentável.
Por muito tempo, eu queria escrever meus pensamentos, convertendo-os em um formato adequado para o público.
Este artigo é uma versão atualizada da minha palestra GDC de 2017 (“Arquiteturas de vinculação de dados para criação rápida de IU no Unity”).
Aviso: você deve entender que estas são apenas recomendações práticas que desenvolvi que refletem minha experiência e perspectiva de desenvolvimento, e não uma solução universal para todos os problemas e definitivamente não a única abordagem correta para cada projeto ou equipe.
:
, . , -, , . . , , , .
(inversion of control)
(MPI)
/ / (MVC)
(Unit testing)
, :
ClassA ServiceA/ServiceB. ClassA .
(DI — Dependency Injection) — . :
(Builder) ClassA, . ClassA , , , , .
Zenject/Extenject. . (reflection-baking), .
--
— . -- (Model-View-Controller — MVC), Unity, :
Monobehaviour- Unity (View), , , Unity. . [SerializeField] drag’n’drop Unity. , .
- . , Unity. , .
, , - . — , .
, (Message Passing). .
, , - . : . .
(notification messages), / (events):
:
struct MessageType {}
bus.Subscribe<MessageType>(()=>Debug.Log("Msg received"));
bus.Fire<MessageType>();, (Signals) — MVC. — , .
, UniRx, , , , . , , , .
() .
Unity NUnit NSubstitute .
:
var level = Substitute.For<ILevel>();
var buildings = Substitute.For<IBuildings>();
// test subject:
var build = new BuildController(null,buildings,level);
// smoke test
Assert.AreEqual(0, build.GetCurrentBuildCount());
// assert that `GetCurrent` was exactly called once
level.ReceivedWithAnyArgs(1).GetCurrent(); . , NSubstitute, , .
- 0:
var level = Substitute.For<ILevel>();
var bus = _container.Resolve<SignalBus>();
var buildCommandSent = false;
bus.Subscribe<BuildingBuild>(() => buildCommandSent = true);
// test subject
var build = new BuildController(bus,new BuildingsModel(),level);
// test call
build.Build(0);
Assert.AreEqual(1, build.GetCurrentBuildCount());
// assert signals was fired
Assert.IsTrue(buildCommandSent); , GetCurrentBuildCount 0. , — , .
"-, , Zenject?" ( )
, , SignalBus , NSubstitute -— , .
, .
. :
, Unity -, Unity , Unity . , Unity ( playmode ).
, , , , , :
,
SDK