دیزاین پترن Observer در یونیتی
مقدمه
در دنیای اطرافمان یکسری سیستم ها برای آگاه سازی ساخته شدند.این سیستم ها یک مورد را تشخیص و به صاحبان خود اطلاع می دهند.
مثل سیستم های امنیتی و هشدار دزدگیر
یا سیستم های اطفاء حریق برای اطلاع و خاموش کردن آتش
خوبی این سیستم ها این است که یکپارچه هستند و می توان از آنها در جاهای دیگر استفاده کرد
یعنی یکبار این سیستم را پیاده می کنید و هر جا که خواستید استفاده می کنید!
دیزاین پترن Observer
این دیزاین پترن به شما این امکان را میدهد که یک شئ به نام (subject) و فهرست وابستگی هایش به نام (observers) را نگه دارید و هر اتفاقی که روی شئ افتاد را به ناظران خبر بدهید.
کاربرد دیزاین پترن Observer در یونیتی
چندین نمایشی ها!
شاید تا به حال برای شما پیش آمده باشد که خواسته باشید تعداد سکه یا مقادیر دیگر را در چند منوی مختلف نشان دهید.پس از زیاد شدن سکه باید سیستمی باشد که تمام این مقادیر آپدیت شوند تا مثل هم باشند.
ساخت سیستم تغییر زبان
وقتی زبان عوض می شود باید به اطلاع تمام Text ها برسد که زبان عوض شده و مقادیر آنها ترجمه شود
ساخت سیستم Achievement
وقتی بازیکن یک کاری را انجام می دهد باید لیست دست آورد ها آپدیت شود تا دست آورد را کسب کند
پیاده سازی Observer در یونیتی
ابتدا یک کلاس به نام Observer می سازیم و سپس یک تابع به نام OnNotify تعریف می کنیم تا هر شئ که از آن ارث می برد ملزم به پیاده سازی این تابع شود.
برای اینکه چنین سیستمی پیاده کنیم به لیستی از ناظران نیاز داریم تا آنها را Subscribe کنیم
همان طور که می بینید یک شئ (Subject ) و لیستی از ناظران (Observers) داریم:
حالا این تابع را در هر شئ که می خواهیم Subscribe کنیم پیاده می کنیم:
تعریف Delegate
اگر با مفهوم pointer در زبان های c++/c آشنایی دارید در یک کلام بگم که delegate معادل pointer است.
و اگر آشنایی ندارید در یک جمله بگم که همون طور که از متغیر ها برای نگهداری داده ها استفاده می کنید از delegate برای نگهداری رفرنس توابع استفاده میشه و با استفاده از متد Invoke می تونید توابعش رو صدا بزنید.
استفاده از Delegate برای پیاده سازی Observer
ابتدا یک delegate تعریف می کنیم:
حالا رفرنس تابع را به Delegate اضافه می کنیم
اگر بخواهیم کد را خلاصه تر بکنیم می توانیم از Action استفاده کنیم
درواقع Action یک Delegate سادست!
اگر Action را دیکامپایل کنید به این موضوع پی می برید:
حال به کد قبلی باز می گردیم و به جای استفاده از delegate از شکل خلاصه آن یعنی Action استفاده می کنیم:
مطلبی دیگر از این انتشارات
معماری Scriptable Object بخش سوم - پیاده سازی
مطلبی دیگر از این انتشارات
تکنیک Object Pooling چیست و چطور راندمان بازی شما را افزایش می دهد _unity
مطلبی دیگر از این انتشارات
بازی های مستقل چطور روح صنعت بازی را زنده نگه داشتهاند؟