ندعو الطلاب المستقبليين لدورة "Unity Game Developer. Professional" لحضور ندوة مفتوحة عبر الإنترنت حول موضوع "الذكاء الاصطناعي المتقدم للأعداء في الرماة".
المقدمة
على مر السنين من العمل في العديد من المشاريع ، قمت بتطوير نهج واضح لهيكلة مشاريع الألعاب في Unity ، والتي أثبتت أنها قابلة للتوسعة والصيانة بشكل خاص.
لوقت طويل ، كنت أرغب في تسجيل أفكاري ، وتحويلها إلى تنسيق مناسب للجمهور.
هذه المقالة هي نسخة محدثة من حديثي لعام 2017 حول GDC ("بُنى ربط البيانات لإنشاء واجهة مستخدم سريعة في الوحدة").
إخلاء المسؤولية: يجب أن تفهم أن هذه ليست سوى توصيات عملية قمت بتطويرها وتعكس تجربتي وتوقعاتي بشأن التنمية ، وليست حلاً شاملاً لجميع المشكلات وبالتأكيد ليست الطريقة الصحيحة الوحيدة لكل مشروع أو فريق.
:
, . , -, , . . , , , .
(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