Arquitetura extensível e sustentável para jogos Unity

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.

: , , , , Kolibri Games :

:

, . , -, , . . , , , .

  1. (inversion of control)

  2. (MPI)

  3. / / (MVC)

  4. (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):

Zenject Signals.

:

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


- "Unity Game Developer. Professional" .

- " " .





All Articles