ایجاد رویدادهای سفارشی
در این سند در مورد نحوه ایجاد یک رویداد جدید توت فرنگی و نحوه استفاده از آن بحث خواهیم کرد.
ایجاد کلاس رویداد:
تمام رویدادها در سیستم رویداد توت فرنگی باید رابط IStrawberryEvent را پیادهسازی کنند. تنها عضوی که باید override کنید، ویژگی EventCallTime است. این ویژگی نشاندهنده زمانی است که رویداد شما فراخوانی خواهد شد.
اطلاعات بیشتر در مورد زمان فراخوانی رویداد اینجا
مقدار پیشفرض این ویژگی EventCallTime.OnUpdate است.
public enum PlayerActions
{
MoveLeft,
MoveRight,
Jump,
Shoot
}
public struct PlayerInputEvent : IStrawberryEvent
{
public PlayerInputComponent Caller;
public PlayerActions Action;
}
این شیء رویداد است که قرار است از آن استفاده کنیم. ما قصد داریم یک جزء (Component) ایجاد کنیم که ورودیهای صفحه کلید را گوش میدهد و رویدادی را اجرا (fire) میکند که کامپوننتهای دیگر بتوانند به آن گوش دهند و بر اساس آن عمل کنند.
.
.
.
public class PlayerInputComponent : BaseComponent
{
.
.
.
public override void OnUpdate()
{
base.OnUpdate();
if (GameContext.InputManager.Keyboard.IsKeyDown(Keys.Left))
{
EventManager.Invoke<PlayerInputEvent>(this, new PlayerInputEvent()
{
Caller = this,
Action = PlayerActions.MoveLeft
});
}
// And other conditions for other events.
}
}
همانطور که در کد بالا مشاهده میکنید، ما به ورودیهای صفحه کلید گوش میدهیم و وقتی کلیدی پایین نگه داشته شده، رویداد را اجرا میکنیم. حالا کامپوننتهای دیگر میتوانند به این رویداد (PlayerInputEvent) اشتراکگذاری کنند، مانند آنچه در این بخش انجام دادیم.
بهترین شیوهها
ما رویداد خود را به صورت struct پیادهسازی کردیم. دلیل آن نحوه کار Garbage Collector در C# است و ایجاد new از یک کلاس در هر فریم (Update) باعث اسپایکهای Garbage Collection میشود که میتواند منجر به افت فریمریت شود. میتوانید رویدادهای خود را cache کنید یا از struct به جای class استفاده کنید.
مراجع: