Architecture extensible et maintenable pour les jeux Unity

Nous invitons les futurs étudiants du cours "Unity Game Developer. Professional" à assister au webinaire ouvert sur "L'intelligence artificielle avancée des ennemis dans les tireurs".

En attendant, nous vous suggérons de lire la traduction d'un article utile.


introduction

Au fil des années, travaillant sur de nombreux projets, j'ai développé une approche claire de la structuration de projets de jeux dans Unity qui s'est avérée particulièrement extensible et maintenable.

Pendant longtemps, j'ai voulu enregistrer mes pensées, les convertir dans un format adapté au public.

Cet article est une version mise à jour de ma conférence GDC 2017 («Architectures de liaison de données pour la création rapide d'interface utilisateur dans Unity»).

Avertissement: vous devez comprendre que ce ne sont que des recommandations pratiques que j'ai développées qui reflètent mon expérience et ma vision du développement, et non une solution universelle à tous les problèmes et certainement pas la seule approche correcte pour chaque projet ou équipe.

: , , , , 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