Arquitectura extensible y mantenible para juegos de Unity

Invitamos a los futuros alumnos del curso "Unity Game Developer. Professional" a asistir al webinar abierto sobre "Inteligencia artificial avanzada de enemigos en shooters".

Mientras tanto, sugerimos leer la traducción de un artículo útil.


Introducción

A lo largo de los años trabajando en muchos proyectos, he desarrollado un enfoque claro para estructurar proyectos de juegos en Unity, que ha demostrado ser particularmente extensible y mantenible.

Durante mucho tiempo, quise anotar mis pensamientos, convertirlos en un formato adecuado para el público.

Este artículo es una versión actualizada de mi charla sobre GDC de 2017 ("Arquitecturas de enlace de datos para la creación rápida de UI en Unity").

Descargo de responsabilidad: debe comprender que estas son solo recomendaciones prácticas que he desarrollado que reflejan mi experiencia y perspectiva sobre el desarrollo, y no una solución universal para todos los problemas y definitivamente no es el único enfoque correcto para cada proyecto o equipo.

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