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.
:
, . , -, , . . , , , .
(inversion of control)
(MPI)
/ / (MVC)
(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):
:
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