Erweiterbare und wartbare Architektur für Unity-Spiele

Wir laden zukünftige Studenten des Kurses "Unity Game Developer. Professional" zu einem offenen Webinar zum Thema "Fortgeschrittene künstliche Intelligenz von Feinden in Schützen" ein.

In der Zwischenzeit empfehlen wir, die Übersetzung eines nützlichen Artikels zu lesen.


Einführung

Im Laufe der Jahre, in denen ich an vielen Projekten gearbeitet habe, habe ich einen klaren Ansatz für die Strukturierung von Spielprojekten in Unity entwickelt, der sich als besonders erweiterbar und wartbar erwiesen hat.

Lange wollte ich meine Gedanken aufschreiben und in ein für die Öffentlichkeit geeignetes Format umwandeln.

Dieser Artikel ist eine aktualisierte Version meines GDC- Vortrags 2017 („Datenbindungsarchitekturen für die schnelle Erstellung von Benutzeroberflächen in Unity“).

Haftungsausschluss: Sie sollten verstehen, dass dies nur praktische Empfehlungen sind, die ich entwickelt habe und die meine Erfahrung und meine Entwicklungsperspektive widerspiegeln, und keine universelle Lösung für alle Probleme und definitiv nicht der einzig richtige Ansatz für jedes Projekt oder Team.

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