Arsitektur yang dapat diperluas dan dipelihara untuk game Unity

Kami mengundang calon siswa kursus "Pengembang Game Persatuan. Profesional" untuk menghadiri webinar terbuka tentang "Kecerdasan buatan lanjutan dari musuh dalam penembak".

Sementara itu, kami sarankan membaca terjemahan artikel yang bermanfaat.


pengantar

Selama bertahun-tahun mengerjakan banyak proyek, saya telah mengembangkan pendekatan yang jelas untuk menyusun proyek game di Unity, yang telah membuktikan dirinya sangat dapat dikembangkan dan dipelihara.

Untuk waktu yang lama, saya ingin menuliskan pemikiran saya, mengubahnya menjadi format yang cocok untuk publik.

Artikel ini adalah versi terbaru dari ceramah GDC 2017 saya ("Arsitektur Pengikatan Data untuk Pembuatan UI Cepat dalam Kesatuan").

Penafian: Anda harus memahami bahwa ini hanya rekomendasi praktis yang telah saya kembangkan yang mencerminkan pengalaman dan pandangan saya tentang pembangunan, dan bukan solusi universal untuk semua masalah dan jelas bukan satu-satunya pendekatan yang benar untuk setiap proyek atau tim.

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