<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های Seyed Morteza Kamali</title>
        <link>https://virgool.io/feed/@MrKamali</link>
        <description></description>
        <language>fa</language>
        <pubDate>2026-06-10 12:55:03</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/37535/avatar/M4R3fh.jpg?height=120&amp;width=120</url>
            <title>Seyed Morteza Kamali</title>
            <link>https://virgool.io/@MrKamali</link>
        </image>

                    <item>
                <title>تجربیات من در بازی سازی</title>
                <link>https://virgool.io/@MrKamali/%D8%AA%D8%AC%D8%B1%D8%A8%DB%8C%D8%A7%D8%AA-%D9%85%D9%86-%D8%AF%D8%B1-%D8%A8%D8%A7%D8%B2%DB%8C-%D8%B3%D8%A7%D8%B2%DB%8C-clx7qfjpji2v</link>
                <description>سلام دوستان تو این پست قصد دارم تجربیاتم رو در زمینه بازی سازی بگم(دقت کنید که چیز هایی که نوشتم تجربه شخصی بوده و ممکنه برای شما فرق کنه)همون طور که خودتون می دونید بازی کردن با بازی ساختن خیلی فرق دارهساخت یک محصول همیشه سخت و طاقت فرساست مثلاً برای ساخت یک فیلم یا بازی ممکنه چندسال زمان گذاشته بشهساساخت بازی چالش های زیادی داره که تو تیم های کوچیک بیشتر احساس میشهاز ایده پردازی و گیم دیزاین گرفته تا برنامه نویسی و ساخت پروژه و مارکتینگتوصیه من اینه تنهایی بازی نسازید و تیمی بازی بسازیدپول یا علاقه؟اگر برای علاقه وارد بازی سازی شدید باید یاد بگیرید چطور درآمد زایی کنیدولی اگر برای درآمد زایی وارد بازی سازی شدید باید بگم راه سختی رو در پیش دارید چون تو ایران درآمد زایی در این شغل کار سختی است.بدترین سناریواگر ساکن تهران نیستید پیدا کردن کار در حوزه بازی سازی به مراتب سخت تر است چون اغلب کارها در تهران حضوری هستند و بعضی شرکت ها فقط نیروی دورکار قبول می کنند.بهترین روش درآمد زاییهر موقع جایی پیشنهاد درصدی شنیدید بدونید توش پول نیستپروژه ای اصلاً قبول نکنید چون معلوم نیست فاز های پروژه چقدر طول بکشه و ممکنه پولی هم آخرش دریافت نکنید ریسکش بالاست مخصوصاً اگر مشتری شما چیزی از بازی سازی نمی دونه کار سخت تر میشهبهترین روش حقوق ماهیانه است که ریسکش کمتره و شما حتی اگر پروژه هم شکست بخوره پولتون رو گرفتیددرآمد بازی سازی در ایران برای  Junior زیر ۱۵ میلیون تومان است و برای Mid-Level و Senior بین رنج ۱۵ تا ۳۵ میلیون تومان است بستگی به شرکتش داره مثلاً شاید یکجا به Senior حقوق بین ۲۰-۲۵ بدندقت کنید این رقم ها در طول زمان تغییر می کنند.نکات مهم قبل از کارکردن با شرکت های ایرانیاز امضا کردن قرارداد های عجیب غریب و سفته های سنگین خود داری کنیدیه بار برای همیشه به نسل جوان که تازه دارن وارد بازار کار می‌شن:به هیچ عنوان برای استخدام سفته ندید!به هیچ عنوانبه هیچ عنوانبه هیچ عنوانشرکتی که حرفه‌ای باشه قراداد محرمانگی NDA با شما امضا می‌کنه.اگر هم خواستید سفته بدید فقط و فقط برای حسن‌ انجام کار بدید.قبل از کارکردن با شرکت رزومه شرکت را بررسی کنید و اگر بازی تا به حال منتشر نکرده سمتش نروید چون اغلب چیزی از بازی سازی نمی دونند یا تازه وارد این عرصه شدند و کار برای شما سخت تر می شود.پروژه ای یا درصدی قبول نکنیدبلف های شرکت های ایرانی✅ ما اینجا یه خانواده‌ایم❌ ترجمه: یه کاری می‌کنیم قشنگ حس کنی بین اعضای خانوادتی. یکی کولرو خاموش می‌کنه، یکی سرکوفت می‌زنه بهت، یکی میگه چایی بیار، تازه ممکنه لباساتم بقیه بپوشن. خلاصه غریبی نکن.✅ واست رزومه میشه ❌ ترجمه: جوری ازت کار بکشیم، جوری ازت کار بکشیم که هرجا بگی فلان جا کار کردم، درجا استخدام بشی :)✅ حقوق توافقی❌ ترجمه: ما یه عددی می‌گیم، تو باید موافقت کنی وگرنه ناراحت می‌شیم. تو که دوست نداری ما ناراحت بشیم؟ :)✅ حقوق پایه وزارت کار❌ ترجمه: مهم نیست چقدر تخصص داری و چند سال سابقه کار. ما اینجا به قانون پایبندیم، هرچی وزارت کار بگه! :)✅ محیط پویا و جوان❌ ترجمه: اینجا یه مشت بچه دور هم جمع شدن که چون کم سن و سالن و توقعشون پایینه استخدامشون کردیم. محیط به قدری پویاست که ممکنه همکارای امروزتو فردا دیگه نبینی!!✅ کار در شرکت معتبر و مشهور❌ ترجمه: موقع استخدام‌، بزرگترین شرکت خاورمیانه و حومه‌ایم؛ ولی موقع تسویه، یه زیر پله اجاره کردیم و محصولاتمون رو می‌ذاریم داخل پلاستیک مشکی می‌دیم دست مشتری :)✅ دارای اتاق فکر و بازی ❌ ترجمه: یه فوتبال دستی رنگ و رو رفته داریم که تار عنکبوت بسته چون هیچکس حق نداره ازش استفاده کنه. مهد کودک که نیومدی، اینجا رو مثل اردوگاه کار اجباری آلمان نازی ببین.منبع : linkdin post / sima abbasiکار خارجیپیدا کردن کار خارجی هم داستان داره رزومه ای که می نویسید باید خیلی استاندارد باشه چون توسط ATS خونده میشه و امتیاز داده میشه.فرض کنید برای یک شرکت 1000 نفر Apply می کنند کلی نیرو می خواد همشو بررسی کنه به خاطر همین از ATS استفاده می کنند.به نظرم من حتماً قبل از نوشتن رزومه کامل تحقیق کنید و حتی از هوش مصنوعی علیه ATS استفاده کنید.نرم افزار ATS مخفف عبارت Applicant tracking system یک نرم افزار مدیریت استخدام جهت بهبود فرآیند استخدام است. سیستم ATS به شما کمک می‌کند تا به طور چشمگیری زمان آنالیز رزومه ها را کاهش دهید. در واقع سیستم ATS یک سیستم جدید در جهت مدیریت بهینه فرآیند استخدام است که به عنوان پایگاهی برای ذخیره اطلاعات کارجوها عمل می‌کند و امکان جمع‌آوری، دسته‌بندی، امتیاز دهی و بایگانی رزومه های دریافتی را به کارفرما می‌دهد.حتماً چندتا آموزش هم درمورد رزومه نوشتن ببینید در آمد بازی ساز هم در اروپا ۱۵۰۰ تا ۴۵۰۰ و آمریکا ۲۰۰۰ تا ۸۰۰۰ دلار است.نکته مهم: پیدا کردن کار خارجی زمان بر است و ممکن است بین ۱ تا ۶ ماه زمان ببرد و ممکن است 100 تا شرکت شما را Reject کنند و کاملاً طبیعی است و نا امید نشویدپیجای ردیت:https://www.reddit.com/r/INAT/https://www.reddit.com/r/gameDevClassifieds/https://www.reddit.com/r/gameDevJobs/سایتایی که برا ایندیا مناسبه:https://www.workwithindies.comhttps://remotegamejobs.comhttps://itch.io/board/10020/help-wanted-or-offeredhttps://forum.unity.com/forums/commercial-job-offering.49/سایتایی که نفسشون از جای گرم بلند میشه و به درد ما نمیخوره:https://arcadjobs.com/https://hitmarker.net/https://gamingjobs360.comhttps://gracklehq.com/jobshttps://www.gamesjobsdirect.comhttps://gamejobhunter.comhttps://gamedevjobs.iohttps://gamejobs.cohttps://www.linkedin.comhttps://jobs.gamasutra.comhttps://docs.google.com/document/d/1H34_z043mJrLahXw7fCgwf5w4ZWyrB2GBE9XAXufjmQ/previewhttps://jobs.gamesindustry.bizسرورای دیسکورد:https://discord.gg/QQd3FhHyhttps://discord.gg/Jzdz2UKhhttps://discord.gg/WznGxxkkhttps://discord.gg/bj6reKXphttps://discord.gg/n8qgQZWQhttps://discord.gg/Sp6cU5sShttps://discord.gg/nf5ua4Nنکته:  به نظر من Linkedin هم برای پیدا کردن شغل مناسبه فقط قید شرکت های بزرگ رو بزنید چون نفسوش از جای گرم بلند میشه و خیلی سخت گیرند. همچنین ATS رو اصلاً دست کم نگیرید و حتماً درموردش مطالعه کنید.درجه سختی پروژه های بازی سازیبازی های Hyper Casualدرجه سختی: 5/10ساخت بازی هایپر کژوال به ظاهر سادست اما موفقیت در آن خیلی دشواره چون رقابت بالاستناشر ها هم اصلاً به خود بازی کار ندارن بیشتر ایده و متریک ها براشون مهمهدرسته بازی های کوچیک و سادست اما ممکنه 1000 تا بازی هایپرکژوال بسازید اما هیچکدوم موفق نشه!ساختن پروتوتایپ زیاد و شکست خوردن حس بدیه اما حداقل ریسکش از پروژه های بزرگ کمترهمن به شخصه با هایپر کژوال حال نکردم انگار داری Trash می سازی و تبلیغات فیک هم باید داشته باشی کاربر جذب بشه از همه توانایی هات هم شاید تو یک پروژه استفاده نشه اگر برنامه نویس بدون تجربه هستی به نظرم هایپرکژوال مناسب ترهخلاقیت و ساخت پروتوتایپ در کمترین زمان، دقت در تجزیه و تحلیل داده‌ها، و جذابیت بازی‌ها از جمله عوامل کلیدی برای موفقیت در بازار بازی‌های هایپر کژوال هستند. اینم یکسری منابع مفید در این زمینهhttps://hc.games/basic-metrics-of-hyper-casual-games/https://naringames.com/tutorial/hyper-casual/ساختن بازی های Cross Platformدرجه سختی: 7/10اگر می خواید بازی بسازید یک پلتفرم رو انتخاب کنید تا سختی کار کمتر میشهچون یک ویژگی در هر پلتفرم ممکنه متفاوت باشه و یا حتی پشتیبانی نشه!سم ترین پلتفرم ها به نظرم IOS و Webgl هست برای یونیتیالبته اگر Mac دارید خروجی گرفتن IOS ساده تره چون من از Unity Cloud Build استفاده می کردم و کلی مشکل داشت.درمورد Webgl هم باید بگم یونیتی کلی مشکلات داره تو این زمینه و کلاً بی خیالش بشید.بازی های شبیه سازیدرجه سختی: 8/10بازی‌های شبیه‌سازی به بازی هایی میگن که فعالیت‌های دنیای واقعی را شبیه‌سازی می کند.ساختنشون سخته چون باید شبیه واقعیت باشه و بهتره تجربه دنیای واقعی رو داشته باشیدمثلاً اگر بازیتون درمورد شبیه سازی آشپزیه اگر تا حالا آشپزی نکردید شاید براتون گنگ باشه.تو این جور بازی ها به نظرم دانش فنی خیلی مهمه چون شاید لازم باشه مثلاً مکانیک خاصی رو پیاده کنید مثل تکه کردن اجسام ، شبیه سازی مایعات و....اگر تجربه زیادی تو ساخت بازی ندارید سمت اینجور بازی ها نریدبازی های شبیه سازی فیزیکدرجه سختی: 9/10بازی های شبیه سازی فیزیک به بازی هایی میگن که فیزیک نقش پر رنگی داره مثل شبیه سازی فیزیک وسایل نقلیه یا هواپیما و...میشه گفت این بازی ها زیر مجموعه بازی های شبیه سازی هستند ولی به نظرم جا داشت که این رو مطرح کنمفیزیک کلاً مبحث پیچیده ایه خیلی سخته اگر هم میرید سعی کنید اگر پکیج های آماده استفاده کنیدمن یک پروژه بیلیارد آنلاین بود خوب شد قبول نکردم خیلی سخت بودبیلیاردشو نتونستم بسازم چه برسه آنلاینشچون فیزیک یونیتی Non Deterministic هست یعنی هر بار اجرا کنی نتیجه متفاوت داره و تو شبکه محاسباتش سخت میشه مخصوصاً بیلیارد که حساس تره و یک سانتیمر خطا نتیجه متفاوتی داره.بازی های Multiplayerدرجه سختی: 10/10من هم تجربه کار کردن با Photon و Unet دارم هم تجربه ساخت بازی های آنلاین که از صفر زده شده.واقعاً به ومعنای واقعی Nightmare هست اصلاً به هیچ وجه سمتش نریددرد سرش خیلی زیاده و اصلاً ارزشش رو ندارهدردسر های دیتابیس و هزینه های سرور و جلوگیری از هک خودش داستانهبا نت ضعیف ایران مخصوصاً به نظرم ساخت این جور بازیا اشتباههبازی های بلاکچینیدرجه سختی: 10/10این بازی ها Trash خالص هستند و به نظرم بیشترشون کلاهبرداریه چون Shit Coin رو تو پاچه مردم می کنند. خداروشکر دیگه ترند هم نیستند.ساخت این جور بازیا به شدت سخته جدا از اینکه یک نفر باید برای بازی قرارداد هوشمند بنویسه (ارز دیجیتال و NFT)  و به زبان solidity مسلط باشه ، بحث بازاریابی و درآمدزایی ازش سخت تره و میشه گفت تو ایران جایی نداره.تو شبکه های مجازی هم باید خیلی فعال باشید و یک نفر می خواد مخصوص پست گذاشتنتوصیه من اینه نسازید ولی اگر هم خواستید بسازید من تجربیاتم رو اینجا نوشتم:https://t.me/CryptoGamesLabمرحله 1: - نوشتن وایت پیپر سند گیم دیزاین (GDD NFT game whitepaper)مرحله 2: - یک نقشه راه با فاز های مختلف تعریف کنید.مرحله 3: - یک توکن ایجاد کنید و آن را در یک شبکه (مانند بایننس) منتشر کنید.مرحله 4: - بازار NFT خود را ایجاد کنید.مرحله 5: - طرح بندی های پیش نمایش برای ایده بازی خود ایجاد کنید.مرحله 6: - توکن بازی را List (قیمت گذاری) کنید.مرحله 7: - وب سایت پیش فروش توکن بازی را ایجاد کنید.مرحله 8: - به گروه های تلگرام و دیسکورد بپیوندید و FOMO را ایجاد کنید.مرحله 9: - آثار هنری / کلکسیونی بازی NFT را طراحی کنید.مرحله 10: بازی را طبق نقشه راه توسعه دهید.پیشگیری از فرسودگی شغلی۱. نه گفتن را یاد بگیریدشما ممکن است از آن دسته افرادی باشید که دوست دارید کارهایی را برای رضایت دیگران انجام دهید، که اغلب به آنها «راضی‌کننده مردم» می‌گویند. با این حال، این ویژگی می‌تواند منجر به فرسودگی شغلی شود. به خاطر سلامتی خود، از نه گفتن نترسید. سعی کنید دیپلماتیک باشید. به عنوان مثال، می‌توانید ببینید که آیا یکی از همکاران شما می‌تواند کار را به جای شما انجام دهد یا خیر. یا اگر مدیرتان از شما می‌خواهد کار دیگری را نیز انجام دهید، درباره حجم کاری خود صحبتی صادقانه با او داشته باشید.۲. خواب کافی داشته باشیدبا اطمینان از داشتن خواب طبیعی خوب، به پیشگیری از فرسودگی شغلی کمک کنید. منظور از خواب طبیعی، خواب با داروهای خواب‌آور نیست. این داروها ممکن است در خوابیدن شما موثر باشند، اما در چرخه طبیعی خواب بدن اختلال ایجاد می‌کنند و کیفیت خواب را تحت تاثیر قرار می‌دهند.۳. با دوستان صحبت کنیداسترس و کار بیش از حد اغلب منجر به انزوا و تنهایی می‌شود. یعنی شما نمی‌خواهید در اطراف مردم باشید تا حدی به این دلیل که وقت ندارید اما شاید دلیل اصلی این باشد که شما از استرس ناشی از حضور در جمع، فرار می‌کنید. اما حضور و شرکت در برنامه‌های دوستان ممکن است دقیقا همان چیزی باشد که شما به آن نیاز دارید. زمانی را برای دور شدن از کار در نظر بگیرید و در کنار افرادی باشید که به شما اهمیت می‌دهند و در حین صحبت در مورد ناامیدی‌ها و استرس‌هایتان به شما گوش می‌دهند.۴. کار خود را در محل کار رها کنیدافرادی که درگیر فرسودگی شغلی هستند، اغلب کار خود را با خود به خانه می‌برند. وقتی شما این کار را انجام دهید، فشار و استرس مضاعفی را متحمل خواهید شد. ضمن اینکه ممکن است این استرس به زندگی و اعضای خانواده شما نیز منتقل شود. همه ما نیاز داریم که خانه پناهگاه و محل آسایش باشد. پس باید از این فضا محافظت کنیم و فشارهای ناشی از کار را در اداره رها کنیم.۵. استراحت‌های کوتاه را جدی بگیریددر زمان‌‌هایی از روز خود را مجبور کنید که از میز کار فاصله بگیرید و بلند شوید و حرکت کنید (حداقل هر یک یا دو ساعت یک بار قهوه و چای بنوشید یا کمی پیاده‌روی کنید) چند دقیقه به چیزی غیر از صفحه نمایش نگاه کنید و به چیزی غیر از کار فکر کنید. هر روز زمانی را برای خود در تقویم قرار دهید و از آن زمان برای مدیتیشن یا نوشتن یادداشت روزانه استفاده کنید.۶. ناهار را در جایی غیر از پشت میزتان بخوریدوقتی برای انجام کار تحت فشار هستید، به راحتی می‌توانید در حین کار و پشت میز خود غذا بخورید یا به طور کلی ناهار را حذف کنید. در عوض، زمان ناهار خود را در تقویم روزانه خود برنامه‌ریزی کنید تا زمانی که زمان صرف غذا را یادآوری کند و سپس یک استراحت کامل ناهار داشته باشید، چه نیم ساعت باشد چه یک ساعت. اگر نمی‌توانید هر روز برای ناهار، بیرون از خانه غذا بخورید، ناهار را بسته‌بندی کنید اما آن را در کافه تریا یا جایی غیر از دفتر کار خود میل کنید. اگر بیرون خوب است و فضای مناسبی دارد، قدم بزنید و جایی را پیدا کنید که بتوانید در آرامش بنشینید و غذا بخورید.۷. ورزش کافی داشته باشیدورزش منظم نه تنها راه خوبی برای از بین بردن استرس است، بلکه شما را از میز و فضای کار هم دور می‌کند. قبل یا بعد از کار به دویدن بروید یا در کلاس ورزشی مورد‌علاقه‌تان ثبت‌نام‌ کنید و باشگاه رفتن را به صورت روتین به برنامه روزانه‌تان اضافه کنید. ورزش می‌تواند به بهبود خلق‌و‌خو و روحیه شما کمک کند و بر کیفیت زندگی تأثیر بسیار مثبتی بگذارد.۸. خودتان را درمان کنیدمواردی را در برنامه خود بگنجانید که نه تنها ذهن شما را از کار دور می‌کند بلکه باعث لبخند زدن شما نیز می‌شود. یک استراحت روزانه بستنی یا نوشیدنی بعد از ساعت کاری را در نظر بگیرد و برای پایان هفته و تعطیلات برنامه‌ریزی کنید. همچنین وقتی یک پروژه مهم را به پایان می‌رسانید، جشن بگیرید.۹. با مدیر خود صحبت کنیداگر فکر می‌کنید که درگیر علائم فرسودگی شغلی هستید، در اسرع وقت با مدیر خود صحبت کنید. ببینید آیا می‌توان بخشی از کارهای شما را به دیگران داد یا خیر. این به نفع مدیر شما است که شما را سالم و با روحیه نگه دارد، بنابراین مدیر احتمالا باید برای جلوگیری از کاهش بهره‌وری تیم، با شما همکاری کند.10.چالش vs پاداشاگر در کاری استخدام شدید که چالش زیادی دارد ولی حقوق و پاداش کمی دارد ممکن است باعث فرسودگی شغلی شود.نکته پایانیفرسودگی شغلی فقط به معنای خستگی و بی‌انگیزگی نیست؛ بلکه یک مسئله چند وجهی است که نیاز به یک راه حل چند وجهی دارد. قبل از اینکه محل کارتان را ترک کنید، واقعا به این فکر کنید که دقیقا چه چیزی دلیل فرسودگی شغلی شماست و و سعی کنید با شناسایی مشکلات، تغییراتی ایجاد کنید. اگر متوجه شدید که علی‌رغم تلاش‌هایتان، چیز کمی تغییر کرده است، ببینید آیا ماندن در شرکت منطقی است یا زمان استعفا فرا رسیده است.منبع: https://www.irantalent.com/blog/what-is-burnout</description>
                <category>Seyed Morteza Kamali</category>
                <author>Seyed Morteza Kamali</author>
                <pubDate>Mon, 31 Jul 2023 10:36:34 +0330</pubDate>
            </item>
                    <item>
                <title>شیوه محاسبه Batching در یونیتی</title>
                <link>https://virgool.io/@MrKamali/%D8%B4%DB%8C%D9%88%D9%87-%D9%85%D8%AD%D8%A7%D8%B3%D8%A8%D9%87-batching-%D8%AF%D8%B1-%DB%8C%D9%88%D9%86%DB%8C%D8%AA%DB%8C-q2eshgcfkcjh</link>
                <description>ارتباط بین GPU و CPUدر پست قبلی گفتیم که draw call دستوری برای رسم Mesh است که توسط CPU فراخوانی و توسط GPU دریافت می شود.درسته GPU به صورت موازی کار می کنه اما چه ارتباطی بین CPU و GPU وجود داره؟ آیا CPU باید منتظر بمونه تا GPU کار هاشو تموم کنه تا بتونه دستورات جدید رو دریافت کنه؟خوشبختانه نه! به خاطر اینکه که چنین ارتباطی bottlenecks ایجاد می کنه (مثلاً وقتی CPU نمی تونه دستورات کافی رو سریع تحویل بده) و کار موازی را غیرممکن می کنه.راه حل لیستیه که توش دستورات توسط CPU اضافه و توسط GPU خوانده بشه - اینطوری مستقل از یکدیگرند! به این لیست Command Buffer میگن.نکته: draw call ربطی به تعداد vertex نداره!نکته: draw call ربطی به اندازه تکسچر نداره!فرمول محاسبه Batchبه ازای هر متریال 1 Batch داریمپس حواستون باشه که موقع Export گرفتن مدل از نرم افزار مدلسازی متریال هاش کم باشهچون تو مثال پایین 6 تا متریال داره در نتیجه 6 تا Batch حساب میشه!تعداد Batch به تعداد تکه های Mesh هم ربط داره!پس تا می تونید مدلی Export بگیرید که تعداد تکه های کمی داشته باشه!توضیح SetPass Callاین Pass مربوط به Shader ، Texture و Blending هست10 تا آبجکت با متریال های یکسان ، 10 تا Batch داره و یک Set Pass call10 تا آبجکت با متریال های مختلف 10 تا Batch داره و 10 تا SetPass Callاینا با هم مساوی نیستندپس حتی اگر 10 تا آبجکت متفاوت داشته باشیم و متریالشون یکی باشه فقط یک SetPass Calls داریممنبع:Batch! Let&#x27;s take a look at Batching! - Unite Seoul 2016</description>
                <category>Seyed Morteza Kamali</category>
                <author>Seyed Morteza Kamali</author>
                <pubDate>Fri, 26 Feb 2021 09:49:36 +0330</pubDate>
            </item>
                    <item>
                <title>تعریف Draw Call و Batching به زبان ساده</title>
                <link>https://virgool.io/@MrKamali/%D8%AA%D8%B9%D8%B1%DB%8C%D9%81-draw-call-%D9%88-batching-%D8%A8%D9%87-%D8%B2%D8%A8%D8%A7%D9%86-%D8%B3%D8%A7%D8%AF%D9%87-pjykndrnpsmy</link>
                <description>تعریف Draw Callدرواقع draw call دستوری برای رسم یک Mesh است که توسط CPU فراخوانی و توسط GPU دریافت می شود.به بیان ساده تر CPU میگه فلان Mesh رو رسم کن و GPU هم رسم می کنه!
هر کدوم از اینا یک draw call محسوب میشهتعریف Batchingوقتی قراره چیزی رندر بشه اول از کانال پردازش CPU میگذره و CPU سعی میکنه هرچندتاش رو که میتونه جمع کنه و بصورت یکجا بفرسته به GPU که به این عمل Batch میگن.به بیان ساده تر به گروهی از draw call ها Batching میگن.مثال 1) سه تا آبجکت با متریال های یکساندر تصویر بالا همون طور که میبینید سه تا آبجکتهBatches : 1Saved by batching : 2تعداد Batch هامون 3 تا هست ولی چون متریال هاشون یکی هست 1 Batch حساب میشهمثال 2 ) سه تا آبجکت با متریال های متفاوتاگر متریال هاشون یکسان نباشه میشه 3 تا Batchاین مطلب برای تازه کار ها بوددر پست های بعدی شیوه محاسبه Batch ها و static/dynamic batching رو میگم.</description>
                <category>Seyed Morteza Kamali</category>
                <author>Seyed Morteza Kamali</author>
                <pubDate>Fri, 26 Feb 2021 09:34:33 +0330</pubDate>
            </item>
                    <item>
                <title>آشنایی با Zenject در یونیتی</title>
                <link>https://virgool.io/@MrKamali/%D8%A2%D8%B4%D9%86%D8%A7%DB%8C%DB%8C-%D8%A8%D8%A7-zenject-%D8%AF%D8%B1-%DB%8C%D9%88%D9%86%DB%8C%D8%AA%DB%8C-rgyjbddocyjn</link>
                <description>زنجکت یک فریم ورک بهینه برای تزریق وابستگی در یونیتی است.https://github.com/modesttree/Zenjectقبل از اینکه درمورد نحوه کار با Zenject توضیح دهیم بهتر است بدانیم که چرا باید از Zenject استفاده کنیم؟مزایای استفاده از Zenjectوقتی از یک فریم ورک DI استفاده می کنید ، طبیعتاً design pattern ها را بهتر دنبال خواهید کرد ، زیرا این امر شما را مجبور می کند که بیشتر در مورد interface بین کلاس ها فکر کنید.وقتی از تزریق وابستگی استفاده می کنید و کد loosely coupled است؛ خیلی راحت تر می شود Refactor کرد. شما می توانید بخشی از code base را کاملاً تغییر دهید بدون اینکه این تغییرات باعث خرابی قسمت های دیگر شود.نوشتن Unit Test یا User-Driven Tests خیلی راحت تر می شود.تزریق وابستگی تزریق وابستگی ( Dependency Injection یا به اختصار DI) فرآیندی می باشد که هدف اصلی آن حذف وابستگی‌ های موجود بین دو کلاس با استفاده از یک رابط (Interface) است.تزریق وابستگی vs روش سنتیزمانی که یک کلاس مانند کلاس A به کلاس B وابستگی دارد و نیازمند یک شی از کلاس B برای انجام عملیات مورد نظر خود است، شاید اولین راهی که به نظر برسد تعریف یک فیلد از کلاس B در کلاس A است.با استفاده از این فیلد کلاس A می تواند عملیات مورد نظر خود را انجام دهد. متاسفانه، این روش باعث ایجاد Tight Coupling یا همان در هم تنیدگی کلاس ها می شود.روش بهتر انجام این وابستگی در قالبی است که باعث Loose Coupling یا همان وابستگی سست گردد.حذف وابستگی بین کلاس A و B با استفاده از تزریق وابستگیوارونگی کنترلوارونگی کنترل ( Inversion of Control یا به اختصار IOC ) ، روش بهبود یافته ی تزریق وابستگی است.در واقع، IOC Container به عنوان یک کلاس وظیفه انجام هر چه ساده تر Dependency Injection را به عهده دارد.آشنایی با مفاهیم و شیوه استفاده IOC Containerمفهوم ContractTypeنوعی که می خواهید برای آن یک اتصال (Binding) ایجاد کنید.مفهوم ResultTypeنوعی که به آن متصل شود.مفهوم Scopeاین مقدار تعیین می کند که نمونه تولید شده هر چند وقت یک بار (یا در صورت وجود) در چندین تزریق استفاده شود.انواع Scopeبه عنوان گذرا AsTransientهر بار که درخواست داده می شود یک نمونه ساخته می شود حتی در صورت وجود نمونه قبلی دوباره از آن استفاده نمی شود.به عنوان ذخیره شده AsCachedهر بار که درخواست داده می شود در صورت وجود نمونه قبلی دوباره از آن استفاده می شود.به عنوان تک AsSingleیک نمونه فقط ساخته می شود و در تمام طول عمر بازی استفاده می شود.به بیان دیگر این روش خیلی شبیه AsCached هست با این تفاوت که یک نمونه بیشتر از آن وجود ندارد.چرا از IOC Container استفاده کنیم؟در حالت عادی مجبور هستیم برای دسترسی به کلاس مورد نظر یک شئ از آن بسازیم.این روش جالبی نیست چرا که ممکن است بعداً بخواهیم یک AudioService دیگر جایگزین آن کنیم در نتیجه ناچاریم به صورت دستی تمام Audio Service ها را تغییر دهیم.پس بهتره یک نفر وظیفه ساختن نمونه ها رو بر عهده بگیره و اون کسی نیست جز IOC Container که فریم ورک Zenject آن را برای ما پیاده سازی کرده است.روش بهتر استفاده از Constructor و پاس دادن اینترفیس IAudioService است.برای اینکه از قابلیت IOC Container استفاده کنید باید کلاسی بسازید که از MonoInstaller استفاده کند.سپس می توانیم اینترفیس IAudioService را به کلاس AudioService متصل کنیم.به این معنی که هروقت به اینترفیس IAudioService دسترسی پیدا کردیم یک شئ از کلاس AudioService ساخته شود.مزیت استفاده از Zenject این است که خیلی راحت می توانیم به جای AudioService هر کلاس دیگری مثل کلاس DebugAudioService را جایگزین کنیم.در نهایت می توانیم کلاس EnemySpawner را Bind کنیم.در نتیجه بعد از ساختن شئ از این کلاس اینترفیس IAudioService به این کلاس پاس داده می شود.در اینجا از NonLazy استفاده شده است. در حالت عادی ResultType فقط زمانی وجود دارد که اتصال برای اولین بار استفاده شود. با این حال ، هنگامی که از NonLazy استفاده می شود ، ResultType بلافاصله هنگام راه اندازی ایجاد می شود.مثال عامیانه برای درک بهتر حالت Lazy و NonLazyدر حالت تنبل (Lazy) وقتی که بهش بگویید برو نان بخر می رود نان بخرد.ولی در حالت غیر تنبل (NonLazy) بدون اینکه بهش بگویند نان را می خرد.به بیان ساده تر حالت NonLazy همانند ساختن شئ در تابع Awake عمل می کند. تزریق وابستگی در GameObject تزریق وابستگی در کلاس هایی که از MonoBehaviour ارث می برند که در واقع یک GameObject هستند متفاوت است. چون در حالت عادی Constructor ندارند!سوال: چطور ما یک نمونه از IAudioService را به یک  GameObject تزریق کنیم؟برای رفع این مشکل می توانیم از اتربیوت [Inject] استفاده کنیم.وقتی بازی اجرا می شود Zenject تمام Method هایی که از اتربیوت [Inject] استفاده می کنند را پیدا می کند و تلاش می کند وابستگی های آن را برطرف کند.در بعضی موارد بهتره از MonoBehaviour استفاده نکنید چون باعث میشه کدتون سنگین بشه.به جاش می تونید از Interface هایی که Zenject در اختیارتون گذاشته استفاده کنید. آشنایی با Signal Busبه بیان خیلی ساده Signal ها در Zenject شبیه Event عمل می کند و همچنین از دیزاین پترن Observer پیروی می کند.دیزاین پترن Observerبه شما این امکان رو میده که یک شئ به نام (subject) و فهرست وابستگی هاش به نام (observers) نگه دارید.بعد هر اتفاقی که روی شئ بیوفته به ناظران خبر بدید.بررسی مثالی از Signal Busروش پیاده سازی دیزاین پترن Observer بدون استفاده از Zenject به صورت زیر است:موقع Enable شدن سیگنال را اضافه و موقع Disable شدن سینگال را باید حذف می کنیم. حال بهتر است روش پیاده سازی Observer در Zenject را بررسی کنیم:موقع Initialize شدن سیگنال را اضافه یا Subscribe و موقع Dispose شدن سینگال را حذف یا Unsubscribe می کنیم.</description>
                <category>Seyed Morteza Kamali</category>
                <author>Seyed Morteza Kamali</author>
                <pubDate>Fri, 20 Nov 2020 20:13:14 +0330</pubDate>
            </item>
                    <item>
                <title>معماری Scriptable Object بخش چهارم - معرفی نمونه کامل</title>
                <link>https://virgool.io/@MrKamali/%D9%85%D8%B9%D9%85%D8%A7%D8%B1%DB%8C-scriptable-object-%D8%A8%D8%AE%D8%B4-%DA%86%D9%87%D8%A7%D8%B1%D9%85-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-m6bf6sv67h0c</link>
                <description>در پست های قبلی با مفهوم معماری Scriptable Object آشنا شدیدمعماری Scriptable Object در کنفرانس های Unite Richard Fine و Ryan Hipple مطرح شد و Daniel Everland این معماری را به صورت کامل پیاده سازی کرده و به طور کاملاً رایگان در گیت هابش گذاشته!ویژگی ها:• تولید اتوماتیک کد Automatic Script Generation• متغیر ها - تمام متغیر های اولیه سی شارپ (Variables - All C# primitives)• مقادیر محدود شده بین یک بازه Clamped Variables•رفرنس های متغیر   Variable References• انواع ایونت  Typed Events• مجموعه ها در زمان اجرا Runtime Sets•آیکون های شخصی سازی شده  Custom Iconsخطایابی Visual ایونت ها تست کردن ایونت ها بدون نیاز به نوشتن یک خط کدآیکون های شخصی سازی شدهتولید اتوماتیک کدhttps://github.com/DanielEverland/ScriptableObject-Architecture</description>
                <category>Seyed Morteza Kamali</category>
                <author>Seyed Morteza Kamali</author>
                <pubDate>Wed, 13 May 2020 18:34:04 +0430</pubDate>
            </item>
                    <item>
                <title>معماری Scriptable Object بخش سوم - پیاده سازی</title>
                <link>https://virgool.io/@MrKamali/%D9%85%D8%B9%D9%85%D8%A7%D8%B1%DB%8C-scriptable-object-%D8%A8%D8%AE%D8%B4-%D8%B3%D9%88%D9%85-%D9%BE%DB%8C%D8%A7%D8%AF%D9%87-%D8%B3%D8%A7%D8%B2%DB%8C-qvsro9xaxgkz</link>
                <description>متغیر های ScriptableObjectمی توانیم اطلاعات را به صورت ScriptableObject در قالب Asset نگهداری کنیماز این متغیر float که به صورت Asset است می توان به عنوان HitPoints ، مقدار دمیج و اطلاعات زمان استفاده کرد.اگر بخواهیم این متغیر float را تکمیل کنیم می توانیم این حق انتخاب را بدهیم که مقدار constant را انتخاب شود و یا مقدار float که به صورت ScriptableObject  است.با این روش Data به راحتی بین prefab ها به صورت مستقیم به اشتراک گذاشته می شود و دیگر نیازی به یدک کشیدن Singleton نمی باشد.یعنی دیگر مجبور نیستیم به کلاس Player یا PlayerManager مراجعه کنیم تا به PlayerHP دسترسی داشته باشیم در نتیجه وقتی PlayerHP تغییر کند همه جا مقدارش اعمال می شود.معماری Eventدر بخش های قبلی توضیح دادیم که چطور یک مقدار را بین سیستم ها به اشتراک بگذاریماما موارد زیادی وجود دارد که پاس دادن برای ما اهمیتی ندارد!بلکه یک اتفاقی (Event) می افتد و می خواهیم به آن واکنش (Response) بدهیم.ویژگی های معماری Eventماژولار بودناستفاده در پروژه های دیگروقتی چیزی با ایونت پیاده شده باشد ما دیگر برای تغییر آن مجبور به کدنویسی نیستیم و کافیست واکنش هایی که به ایونت ها داده شده است را عوض کنیم.ایزوله کردن پریفبحتی پریفب می تواند به یک ایونت پاسخ دهد و اهمیتی ندهد از کجا آمدهبهینهفقط وقتی احتیاج شود صدا زده می شود.به عنوان مثال شما لازم نیست Player Health را هر ثانیه چک کنید می توانید بگویید وقتی صفر شد فلان ایونت Raise شود.قابل اشکال زداییایونت را می شود هم در بازی و هم در ادیتور صدا زد و آن را به راحتی تست کرد.معرفی UnityEventبا استفاده از UnityEvent بدون کدنویسی می توانید هر کاری کنید به عنوان مثال یک Game Object را غیر فعال کنید. که به صورت تابع Serialized شده فراخوانی می شود.مزایای UnityEventاستفاده آسان در ادیتوربا این روش ماژولار به راحتی می توانیم با چند کلیک ساده در ادیتور کاری که می خوایم را انجام دهیمکد کمتر ، فرض های کمتر!شما دیگر مجبور نیستید کدی بنویسید که آن را به سیستم دیگر متصل کند با استفاده از ایونت ها به راحتی می توانید این کار را انجام دهید.پاس دادن آرگومانبه شما اجازه می دهد که آرگومان پاس بدهید.توسعه جنریک &lt;UnityEvent&lt;T که به شما اجازه می دهد هر آرگومانی با هر نوعی را به صورت static/dynamic پاس بدهید.مشکلات UnityEventسفت و سخت و غیر انعطاف پذیر!رفرنس دادن سخت Button وقتی باید به آن واکنش دهدچیز هایی که به آن واکنش میدهد باید از قبل مشخص شده باشد!به عنوان مثال یک Button باید بداند که وقتی روی آن کلیک شد به چه چیزی واکنش دهددر نتیجه نمی توان از آن در Prefab استفاده کرد و آن را به UI متصل کرد.از آنجایی که نمی توان از Prefab استفاده کرد شما مجبورید همه جا یک کار تکراری را انجام دهید و بگید بعد از یک Event به چه چیزی واکنش داده شود.سریالازیشن محدودبا استفاده از UnityEvent فقط می توان چیز های ساده مثل int , string ,bool را در Inspector مشاهده کرد و برای Type های دیگر این امکان وجود ندارد.گاربیج الوکیشنهر دفعه که آن را فراخوانی کنید Garbage تولید می کند.ساخت ایونت های خودمانداده محورقابل ویرایش برای Designerقابل اشکال زداییمثال ساخت ایونتیک Scriptable Object می سازیم و با استفاده از یک حلقه for تمام ایونت های listener را Raise می کنیم!حال کلاس listener را تعریف می کنیم و یک ایونت و یک واکنش در آن تعریف می کنیم.و وقتی OnEnable می شود آن را  Register Listener می کنیموقتی OnDisable می شود آن را  UnRegister Listener می کنیم</description>
                <category>Seyed Morteza Kamali</category>
                <author>Seyed Morteza Kamali</author>
                <pubDate>Wed, 13 May 2020 18:19:19 +0430</pubDate>
            </item>
                    <item>
                <title>معماری Scriptable Object بخش دوم - مشکلات Singleton</title>
                <link>https://virgool.io/@MrKamali/%D9%85%D8%B9%D9%85%D8%A7%D8%B1%DB%8C-scriptable-object-%D8%A8%D8%AE%D8%B4-%D8%AF%D9%88%D9%85-%D9%85%D8%B4%DA%A9%D9%84%D8%A7%D8%AA-singleton-eyz8loa30xua</link>
                <description>در این پست قصد داریم مشکلات Singleton را بررسی کنیم.تعریف Singletonسینگلتون به شما اطمینان می‌دهد از یک کلاس، تنها یک نمونه یا شی (Object) ساخته شود. بنابراین در هر زمان که استفاده از این کلاس نیاز شود، سینگلتون یک دسترسی سراسری به تنها شی‌ای که از این کلاس ساخته شده است ایجاد می‌کند و اجازه ساخت شی جدیدی را از آن کلاس نمی‌دهد.کاربرد: بعضی کلاس ها هست که فقط باید یک نمونه از اونا باشه مثل GameManager یا SoundManager دیزاین پترن Singleton این تضمین رو میده که فقط و فقط یک نمونه از آنها باشه.مزایای Singletonهمه جا می تونیم بهش دسترسی پیدا کنیم مثل:PlayerManager.Instance.Nameحالت ماندگار:همون طور که می دونید Singleton یک Instance هست که به صورت DontDestroy استفاده میشه و حتی اگر Scene هم عوض شود آن نابود نمی شود!درک آسان:این الگو خیلی راحت و قابل فهم است و به راحتی می شود از آن استفاده کردالگوی ثابت قدم:از این الگو می توانیم در همه پروژه هایمان استفاده کنیم و کارمان را راحت می کندبرنامه ریزی آسان:خیلی راحت می توانیم برنامه بریزیم که مثلاً یک PlayerManager یا EnemyManager داشته باشیممشکلات Singletonاتصالات سفت و سخت:ماژولار نیست و به قسمت های دیگه وابسته است یعنی نمی شود آن کلاس به تنهایی کار کندبدون پلی مورفیسم:از شئ گرایی پیروی نمی کند و نمی توان Polymorphism داشت تا رفتار های متفاوت برای آن تعریف کرد.به خاطر همین شما ناچارید که کلاس های جداگانه تعریف کنید مثلPlayerManagerTutorialPlayerManagerGameModeA_PlayerManagerGameModeB_PlayerManagerغیر قابل اشکال زدایی:از آنجایی که نمی توان وظایف را Inject کرد و کلاس Manager بزرگ می شود تست کردن آن هم سخت می شود.کابوس وابستگی:بدی Singleton این است که در همه Scene ها هست و شاید اصلاً داخل یک Scene نیازی به آن نباشد.در نتیجه ناچاریم آن را همه جا به یدک بکشیم که همین باعث می شود که مرحله اشکال زدایی سخت تر انجام شود.وجود یک نمونه:بدی Singleton این است که یک نمونه بیشتر از آن نمی شود داشته باشیمبه عنوان مثال در بازی یک نفره یک PlayerManager داریدولی در بازی چندنفره نمی توانید برای هر Player یک PlayerManager داشته باشیددر نتیجه ناچارید آرایه ای از Player ها را در کلاس PlayerManager داشته باشید که این روش جالبی نیستراه حل ها:کاهش استفاده از global manager هاوارونگی کنترل:مثل تزریق وابستگی :یعنی اشیاء چیز هایی که نیاز دارند را مستقیم بگیرند نه اینکه وابسته به چیز دیگری باشند به عنوان مثال یک UI که قرار است نام بازیکن را نمایش دهد لزومی ندارد به کلاس PlayerManager وابسته شود و بنویسیم PlayerManager.Instance.Name می توان از Scriptable Object استفاده کرد تا Data بین آنها به اشتراک گذاشته شود.اصل Single Responsibility:هر کلاس یا کمپوننت شما یک کار را انجام دهد.اطلاعات ماژولارمثال Enemy Prefabفرض کنید شما یک دشمن در بازی دارید که در حالت عادی می توان سرعت دشمن را از EnemyManager گرفت ولی فرض کنید 20 تا دشمن دارید که هر کدام سرعت مختلفی دارند.این کار باعث می شود شما یک Hard Reference انجام دهید و Prefab دشمن را وابسته به EnemyManager کنید یعنی اگر این کلاس Load نشود یا به هر دلیلی از بین برود بازی به فنا می رود.حالا هر چقدر پروژه بزرگ تر شود گند این Singeton مشخص می شودبه عنوان مثالEnemy can&#x27;t find EnemyManagerPlayer can&#x27;t find PlayerManagerEnemyManager can&#x27;t find PlayerManagerPlayerManager can&#x27;t find Inventory Managerراه حل چیست؟همه آمارهای دشمن را با هم یکجا جمع کنیم؟افزونه ها و ماژولار بودن را محدود کنیم؟کدام بهتر است؟</description>
                <category>Seyed Morteza Kamali</category>
                <author>Seyed Morteza Kamali</author>
                <pubDate>Wed, 13 May 2020 18:06:38 +0430</pubDate>
            </item>
                    <item>
                <title>معماری Scriptable Object بخش اول - ستون های مهندسی</title>
                <link>https://virgool.io/@MrKamali/%D9%85%D8%B9%D9%85%D8%A7%D8%B1%DB%8C-scriptable-object-%D8%A8%D8%AE%D8%B4-%D8%A7%D9%88%D9%84-bpzdv66p16ml</link>
                <description>ستون های مهندسیقبل از اینکه سراغ معماری Scriptable Object بریم بیاید ستون های مهندسی را بررسی کنیم. سعی کنید همه چیز تا جایی که ممکنه ماژولار ، قابل ویرایش و قابل اشکال زدایی باشه که در ادامه آن را بررسی می کنیم:ماژولارسیستم ها نباید مستقیم به هم وابسته باشند یعنی فرض کنید شما یک Inventory System تو بازیتون دارید که قراره با سیستم های دیگه در تعامل باشه.اگر شما جوری بنویسیدش که در نبود سیستم های دیگه به مشکل بخوره و وابسته به اونا باشه دیگه ماژولار نیست.یعنی کدتان نباید مثل یک دیوار آجری باشد که برای تغییر حتماً باید خراب شود!بلکه مثل لگو انعطاف پذیر باشد یعنی بدون اینکه آن را عوض کنیم بتوانیم با آن هر چیزی را توسعه بدهیم!سین ها باید مانند صفحات تمیز باشند کثیف کاری توشون نباشه و هر سین رفتار منحصر به فرد خودش رو داشته باشه و اینطور نباشه که پر از چیز هایی که DontDestroy باشند (منظور Singleton هاست).تا جایی که ممکنه از Prefab ها استفاده کنید چون دیگه مجبور نیستید دستی تغییر بدید و وقتی تغییرات رو به یک Prefab اعمال می کنید برای بقیه هم اعمال میشه.همچنین پریفب ها طوری باشند که هر کدام عملکرد خودشان را داشته باشند و اطلاعاتشان داخل خودشان باشد.کمپوننت ها!سعی کنید کد های خود را به کد های کوچک تر تبدیل کنید و هر کد یک کار را انجام دهد (Single Responsibility) که بتوان از آن در جاهای دیگه به عنوان کمپوننت استفاده کرد.قابل ویرایشاطلاعات بازی باید طوری باید که قابل ویرایش باشد تمرکز روی داده هاوقتی روی داده ها تمرکز کنیم و تا جایی که ممکن باشد بازی را داده محور(data-driven) پیاده کنیم ، سیستم های ما مانند دستگاه هایی می شوند که داده ها را به عنوان دستورالعمل پردازش می کنند!به بیان ساده تر سعی کنید Data را از کد هایتان جدا کنید و در قالب Scriptable Object استفاده کنید.تغییر بازی بدون کدنویسیکدی که می نویسید باید طوری باشد که گیم دیزاینر و یا آرتیست هم بتواند آن ها را تغییر بدهد و مجبور نباشند مقادیر را در کد عوض کنند.طراحی اضطراریکدی که می نویسید باید طوری باشد که به صورت کمپوننت های کوچک باشد و هر کدام کاری را انجام دهد اینطوری گیم دیزاینر بدون نیاز به کدنویسی و با متصل کردن کمپوننت ها می تواند یک تغییر را اعمال کند.تغییر مقادیر در زمان اجرااولین ابزاری که برای تغییر داده ها به کار می رود Inspector هست که بدون نیاز به باز کردن کد می توان مقادیر آن را تغییر داد. اما یک بدی دارد ؛ وقتی از حالت play-mode خارج می شویم مقادیر آن ها ذخیره نمی شود!ولی وقتی که از Scriptable Object  استفاده کنید در زمان اجرا هم می توانید مقدار آن ها را عوض کنید!قابل اشکال زداییتست در فضای ایزوله (ماژولار بودن)هر قطعه کدی که می نویسید باید به تنهایی قابل تست باشد.نمایش اشکال زدایی در Inspectorبا استفاده از Custom Editor یونیتی می توانید ابزاری بسازید که به راحتی بتوانید کدتان را Debug کنید.اشکال زدایی ویژگی های پیاده سازی شدهبعد از اینکه یک ویژگی را در بازی خود اضافه کردید آن را تمام شده حساب نکنید بلکه آن را تست کنید و مطمئن شوید که درست کار می کندهرگز باگ را fix نکنید زیرا نمی فهمید!شما باید باگ را دنبال کنید ، آن را بفهمید و بعد آن را در مقابل خانواده آن بکشید!چنین کاری کار ساده ای نیست و ممکن است شما باگی دیگر ایجاد کنیدمبانی Scriptable Objectsتعاریف اولیهدرواقع Scriptable Object یک کلاس Serializable یونیتی شبیه MonoBehaviour هست که هیچ کمپوننتی مثل Transform نداره که به صورت فایل asset. ذخیره می شود.کاربرد های ساده Scriptable Objectمنبع : Unite Austin 2017 - Game Architecture with Scriptable Objects</description>
                <category>Seyed Morteza Kamali</category>
                <author>Seyed Morteza Kamali</author>
                <pubDate>Fri, 08 May 2020 18:45:50 +0430</pubDate>
            </item>
                    <item>
                <title>مفهوم Serialization در یونیتی</title>
                <link>https://virgool.io/@MrKamali/%D9%85%D9%81%D9%87%D9%88%D9%85-serialization-%D8%AF%D8%B1-%DB%8C%D9%88%D9%86%DB%8C%D8%AA%DB%8C-i6kdhyjy4ddc</link>
                <description>در علوم رایانه، در زمینهٔ ذخیره‌سازی داده، سریال سازی (serialization) یک فرایند ترجمه است که در آن ساختمان‌های داده، یا حالت شئ، به یک قالب (فرمت) ترجمه می‌شود که آن قالب توانایی ذخیره (مثلا در یک فایل) یا توانایی انتقال (مثلا در بین اتصال پیوند شبکه) دارد، و نیز توانایی بازساخت در آینده (احتمالا در یک  محیط رایانه ای متفاوت) را دارد.پس در واقع یک شئ را سریال سازی می کنیم تا فرمت استانداردی شود تا بتوان همه جا از آن استفاده کرد.Serialization and Deserialization of the objectsروش های مختلفی برای سریال سازی هست که معروف ترین آنها json , XML ,Yaml می باشند.مثال سادهفرض کنید شما قرار است لیستی از اعداد داشته باشید که در نرم افزار های مختلف از آن استفاده کنیدولی هر کدام از آن نرم افزار ها یک فرمت را قبول می کند!برای حل این مشکل می توان این اطلاعات را Serialize کرد و استفاده کرد!مثال پیچیده!فرض کنید کلاسی دارید که باید تبدیل به فرمت استانداردی شود.ابتدا ساختار کلی آن را می نویسیم:بعد این اطلاعات را باید به شکلی بنویسیم که استاندارد باشد یا به اصطلاح سریال سازی شود.برای این کار می توانیم از Json یا فرمت های دیگر استفاده کنیم. مفهوم Encapsulation یکی از مفاهیم مهم زبان های برنامه نویسی پیشرفته ، مفهوم Encapsulation یا کپسوله سازی است.وقتی می خواهیم یک برنامه بزرگ بنویسیم ، خیلی مهمه که برنامه قابل خوندن باشه.اگر با مفاهیم  access modifier ها آشنا باشید.ما گاهی اوقات نیاز داریم که یک متغیر در یونیتی سطح دسترسی private داشته باشد تا وقتی می خواهیم از کلاس های دیگر به آن کلاس دسترسی داشته باشیم آنها نمایش داده نشوند.مشکل نمایش دادن متغیر ها در زمان دسترسیمشکل نمایش private در Inspectorدر یونیتی فیلد های private را در Inspector نشان داده نمی شود!چون در حالت عادی یونیتی سطوح دستری private را Serialize نمی کند به خاطر همین باید آنها را Serialize کنید. سریال سازی برای نمایش در Inspectorعلت اینکه فیلد های public در Inspector قابل مشاهده هستند این است که یونیتی فقط فیلد های public را Serialize می کند.از اتریبیوت [SerializeField] برای سریال سازی field/property استفاده می شود.از اتریبیوت [Serializable] برای سریال سازی class/struct استفاده می شود.مثال سریال سازی فیلد https://gist.github.com/smkplus/3af8fd9b3316edcaa68c78d06c1e030f مثال سریال سازی کلاس https://gist.github.com/smkplus/444f96a8963c5090159771bc36995f34 </description>
                <category>Seyed Morteza Kamali</category>
                <author>Seyed Morteza Kamali</author>
                <pubDate>Thu, 16 Apr 2020 11:36:01 +0430</pubDate>
            </item>
                    <item>
                <title>اصل جداسازی Interface ها</title>
                <link>https://virgool.io/@MrKamali/%D8%A7%D8%B5%D9%84-%D8%AC%D8%AF%D8%A7-%D8%B3%D8%A7%D8%B2%DB%8C-interface-%D9%87%D8%A7-iwutbynfvgfc</link>
                <description>Interface Segregation Principle (ISP)داشتن interface های کوچیک بهتر از داشتن یک interface بزرگ است.این اصل درواقع شبیه Single Responsibility هست با این تفاوت که درمورد interface ها است.اینترفیس بزرگمثالفرض کنید قرار است در بازی شما یکسری Ability استفاده شود. https://gist.github.com/smkplus/c45b2030867cc51660ae0438da19adac به جای interface کلی IAbilities می توان برای هر کدام از Ability ها یک interface ساخت: https://gist.github.com/smkplus/3a17a3f234d629140e18fffb9e642519 </description>
                <category>Seyed Morteza Kamali</category>
                <author>Seyed Morteza Kamali</author>
                <pubDate>Fri, 10 Apr 2020 21:02:27 +0430</pubDate>
            </item>
                    <item>
                <title>اصل جایگزینی Liskov</title>
                <link>https://virgool.io/@MrKamali/%D8%A7%D8%B5%D9%84-%D8%AC%D8%A7%DB%8C%DA%AF%D8%B2%DB%8C%D9%86%DB%8C-liskov-gmxd5zkrmcv2</link>
                <description>Liskov Substitution Principle (LSP)کلاس والد باید مناسب تمامی کلاس های فرزند باشد و اگر کلاسی از کلاسی ارث بری میکند نباید رفتار کلاس والد خود را تغییر دهد.دو چیز متفاوت را بخاطر شباهت ظاهریشان نباید یکسان و مثل هم دانست!درسته تو عالم واقعیت شتر مرغ پرنده هست ولی تو کدنویسی فرق می کنه!فرض کنید در بازی دو نوع کاراکتر مختلف Warrior و Mage داریم و کاراکتر Mage تمام قابلیت های Warrior را دارد اگر به شیوه زیر ارث بری کنیم اشتباه است! https://gist.github.com/smkplus/1abf4e67148879f00fb10e2d8e18b7a9 به جای روش بالا می توانیم یک واسط تعریف کنیم: https://gist.github.com/smkplus/38cb37f4d30608bf77a9f7d8543759a0 </description>
                <category>Seyed Morteza Kamali</category>
                <author>Seyed Morteza Kamali</author>
                <pubDate>Fri, 10 Apr 2020 13:49:28 +0430</pubDate>
            </item>
                    <item>
                <title>اصل Open/Closed</title>
                <link>https://virgool.io/@MrKamali/%D8%A7%D8%B5%D9%84-openclosed-mzbcty5sk13p</link>
                <description>Open/Close Principle (OCP)هر کلاس باید قابل توسعه باشد ولی تغییر نکند.ضمانت می‌کند که کلاس ها قابل ارث بری و استفاده هستند ولی نباید از بیرون قابل تغییر باشند.به عنوان مثال بدون اینکه لگو را عوض کنیم می توانیم با آن هر چیزی که می خواهیم را توسعه بدهیم!یعنی کدتان نباید مثل یک دیوار آجری باشد که برای تغییر حتماً باید خراب شود!مثالفرض کنید یک کلاس برای محاسبه Damage سربازان مختلف داریم.همان طور که می بینید با اضافه شدن سربازان جدید به تعداد خط های کدمان اضافه می شود. https://gist.github.com/smkplus/5e640357f5390b57806d4507b1d75529 به جای اینکه با if , else یا switch نوع کلاس ها را بررسی کنیم می توانیم تعاریف را داخل خود کلاس ها Encapsulate کنیم. https://gist.github.com/smkplus/a76f2475aa1fde6092de7e97c38674bb </description>
                <category>Seyed Morteza Kamali</category>
                <author>Seyed Morteza Kamali</author>
                <pubDate>Fri, 10 Apr 2020 11:56:27 +0430</pubDate>
            </item>
                    <item>
                <title>اصل Single Responsibility</title>
                <link>https://virgool.io/@MrKamali/%D8%A7%D8%B5%D9%84-single-responsibility-ghmjirsth7gp</link>
                <description>Single Responsibility Principle (SRP)هر کلاس وظیفه انجام تنها و تنها یک کار را دارد هیچ کلاسی نباید دو یا چند عملیات انجام دهد.کلاس بزرگی که چندین کار را انجام می دهدهر کلاس وظیفه ای که به آن سپرده شده است را انجام می دهدمثالکمپوننت های یونیتی همه وظیفه مربوط به خودشان را به عهده دارند.به عنوان مثال کمپوننت Audio Source وظیفه پخش کردن صدا را دارد و وظیفه غیر مرتبط مثل عوض کردن Scene را ندارد!کمپوننت Audio Sourceپس همیشه سعی کنید وظایف کدها را از هم جدا کنید تا بتوانید جاهای دیگه هم از آنها استفاده کنید.نمونه ای از کلاس بزرگهمان طور که می بینید کلاس زیر خیلی بزرگ است: https://gist.github.com/smkplus/b734e0db74c4f12b5703a87db0f517b1 کلاس بالا دارای چند وظیفه هست که می توان آن ها را جدا سازی کرد:GameConstants https://gist.github.com/smkplus/1cfff3c7f08b9ba17d8130765b42b7c2 UIComponent https://gist.github.com/smkplus/ee419d48cf5e6848a41c732a3fd63829 AudioComponent https://gist.github.com/smkplus/5c30286d7fbb5c05bc0d717586b35464 CombatComponent https://gist.github.com/smkplus/9c9c61bbfb588e2094f91aaaebc206c2 </description>
                <category>Seyed Morteza Kamali</category>
                <author>Seyed Morteza Kamali</author>
                <pubDate>Thu, 09 Apr 2020 20:42:28 +0430</pubDate>
            </item>
                    <item>
                <title>دیزاین پترن Observer در یونیتی</title>
                <link>https://virgool.io/@MrKamali/%D8%AF%DB%8C%D8%B2%D8%A7%DB%8C%D9%86-%D9%BE%D8%AA%D8%B1%D9%86-observer-%D8%AF%D8%B1-%DB%8C%D9%88%D9%86%DB%8C%D8%AA%DB%8C-t2otilasfk5y</link>
                <description>مقدمهدر دنیای اطرافمان یکسری سیستم ها برای آگاه سازی ساخته شدند.این سیستم ها یک مورد را تشخیص و به صاحبان خود اطلاع می دهند.مثل سیستم های امنیتی و هشدار دزدگیریا سیستم های اطفاء حریق برای اطلاع و خاموش کردن آتشخوبی این سیستم ها این است که یکپارچه هستند و می توان از آنها در جاهای دیگر استفاده کردیعنی یکبار این سیستم را پیاده می کنید و هر جا که خواستید استفاده می کنید!دیزاین پترن Observerاین دیزاین پترن به شما این امکان را میدهد که یک شئ به نام (subject) و فهرست وابستگی هایش به نام (observers) را نگه دارید و هر اتفاقی که روی شئ افتاد را به ناظران خبر بدهید.کاربرد دیزاین پترن Observer در یونیتیچندین نمایشی ها!شاید تا به حال برای شما پیش آمده باشد که خواسته باشید تعداد سکه یا مقادیر دیگر را در چند منوی مختلف نشان دهید.پس از زیاد شدن سکه باید سیستمی باشد که تمام این مقادیر آپدیت شوند تا مثل هم باشند.ساخت سیستم تغییر زبانوقتی زبان عوض می شود باید به اطلاع تمام Text ها برسد که زبان عوض شده و مقادیر آنها ترجمه شودساخت سیستم Achievementوقتی بازیکن یک کاری را انجام می دهد باید لیست دست آورد ها آپدیت شود تا دست آورد را کسب کندپیاده سازی Observer در یونیتیابتدا یک کلاس به نام Observer می سازیم و سپس یک تابع به نام OnNotify تعریف می کنیم تا هر شئ که از آن ارث می برد ملزم به پیاده سازی این تابع شود. https://gist.github.com/smkplus/a20fe45b36e88d440acb0cb4c2ba30a3 برای اینکه چنین سیستمی پیاده کنیم به لیستی از ناظران نیاز داریم تا آنها را Subscribe کنیمهمان طور که می بینید یک شئ (Subject ) و لیستی از ناظران (Observers) داریم: https://gist.github.com/smkplus/6fef0686fdd36cdd6bb464bbaf24f54b حالا این تابع را در هر شئ که می خواهیم Subscribe کنیم پیاده می کنیم: https://gist.github.com/smkplus/f5485a40665ed0f5722ae070fd2e73a7 همان طور که می بینید پیام برای ناظران ارسال شدتعریف Delegate اگر با مفهوم pointer در زبان های c++/c آشنایی دارید در یک کلام بگم که delegate معادل pointer است.و اگر آشنایی ندارید در یک جمله بگم که همون طور که از متغیر ها برای نگهداری داده ها استفاده می کنید از delegate برای نگهداری رفرنس توابع استفاده میشه و با استفاده از متد Invoke می تونید توابعش رو صدا بزنید.استفاده از Delegate برای پیاده سازی Observerابتدا یک delegate تعریف می کنیم: https://gist.github.com/smkplus/5d72699c6251e06d62d363208b83746a حالا رفرنس تابع را به Delegate اضافه می کنیم https://gist.github.com/smkplus/71ca6bf19f9a9c45492717e575eec24c اگر بخواهیم کد را خلاصه تر بکنیم می توانیم از Action استفاده کنیمدرواقع Action یک Delegate سادست!اگر Action را دیکامپایل کنید به این موضوع پی می برید: https://gist.github.com/smkplus/a38343da8dbd408dc811ede9f4d76643 حال به کد قبلی باز می گردیم و به جای استفاده از delegate از شکل خلاصه آن یعنی Action استفاده می کنیم: https://gist.github.com/smkplus/b49b67e7a379e14e6634968df115d13a </description>
                <category>Seyed Morteza Kamali</category>
                <author>Seyed Morteza Kamali</author>
                <pubDate>Sun, 05 Apr 2020 23:16:31 +0430</pubDate>
            </item>
                    <item>
                <title>دیزاین پترن های رفتاری</title>
                <link>https://virgool.io/@MrKamali/%D8%AF%DB%8C%D8%B2%D8%A7%DB%8C%D9%86-%D9%BE%D8%AA%D8%B1%D9%86-%D9%87%D8%A7%DB%8C-%D8%B1%D9%81%D8%AA%D8%A7%D8%B1%DB%8C-%D8%A8%D9%87-%D8%B2%D8%A8%D8%A7%D9%86-%D8%B3%D8%A7%D8%AF%D9%87-al61lz1xyeet</link>
                <description>این نوع از دیزاین پترن ها جهت بهبود رفتار مشترک بین اشیا (Object) استفاده میشود.دیزاین پترن Chain of Responsibility همون طور که از اسمش پیداست زنجیره ای از مسئولیت هاستکه به صورت سلسله وار پشت سر هم اجرا میشهبه عنوان مثال تلفن گویا به این صورته که شما بعد از تماس باید یکسری دکمه رو زنجیره وار بزنید تا به جایی که می خواید وصل بشیدمثال دیگش ثبت نام در سایت هاستبعضی هاشون مراحلی دارند که طولانیه و باید طی بشه مگرنه نمی تونید از سرویس استفاده کنیددیزاین پترن Iteratorدیزاین پترن Iterator همون طور که از اسمش پیداست به تکرار کردن اشاره دارهفرض کنید شما یک مجموعه مثل دانش آموزان کلاس و... دارید و بهتون گفتند جوری بنویس که مثل دیتابیس هر جور خواستیم سرچ کنیمجستجوی دانش آموزان براساس هر چیزی می تونه باشهنمره ، سن ، قد و حروف الفبا و...دیزاین پترن Mediatorبه جای اینکه کلاس ها با هم ارتباط داشته باشند یک واسط بذاریم و بواسطه ی اون با بقیه ارتباط برقرار کنیمدرست مثل برج مراقبت به جای اینکه هواپیما ها با هم ارتباط برقرار کنند و بگن کی می خواد فرود بیاد از برج مراقبت می پرسنددیزاین پترن Commandاین دیزاین پترن ساخته شده تا خیلی راحت بتونیم دستورات رو تو پشته یا لیست بریزیم و در صورت نیاز Undo کنیمدیزاین پترن Memento هم مثل Command قابلیت Undo کردن رو داریم با این تفاوت که به صورت State ذخیره می کنیم و براش اسم می ذاریمدرست مثل گیت که به هر قدمی که می خوایم بر می گردیم تفاوت Command و Mementoفرض کنید یک بازی شطرنج هست که قراره حرکت ها رو ذخیره کنیم و Undo کنیماگر هزار تا حرکت با مهره ها انجام بدیم و قرار باشه برگردیم به حرکت اول برگردیم. با Command باید دونه دونه بریم عقب تا به حرکت اول برسیم چون به صورت پشته ذخیره شدهولی با استفاده از Memento راحت میگیم برگرد به &quot;First Step&quot; و راحت به حرکت اول بر می گردهدیزاین پترن Observerبه شما این امکان رو میده که یک شئ به نام  (subject) و فهرست وابستگی هاش به نام (observers) نگه دارید.بعد هر اتفاقی که روی شئ بیوفته به ناظران خبر بدید.دیزاین پترن Stateاین دیزاین پترن خیلی شبیه به ماشین‌های حالات متناهی (Finite state machines) هستند که یک رفتار رو در خود نگه می دارند و میگن در چه وضعیتی هستند.به عنوام مثال وقتی یک مقاله تو ویرگول می نویسید اول به حالت پیش نویس در میاد و اگر منتشرش کنید به حالت انتشار در میاد.دیزاین پترن Strategyبا این روش می تونید مجموعه ای از الگوریتم ها رو تعریف کنید و هر یک از اونا رو تو یک کلاس جداگانه قرار بدید و شئ هاشو قابل تعویض کنید.خوبی این روش اینه که الگوریتم ها به چیزی وابسته نیستند و جای همدیگه می تونند عوض بشند.به عنوان مثال وقتی تو Google Maps دو نقطه رو انتخاب می کنید ازتون می پرسه وسیله ی نقلیتون چیه؟بعد با استفاده از الگوریتم اون وسیله ی نقلیه بهتون میگه که کی به مقصد می رسید.دیزاین پترن Templateبا این روش می تونید یک قالب ایجاد کنید و خیلی راحت ازش شئ بسازید.به عنوان مثال برای درست کردن شیرینی و کیک از قالب استفاده میشه.مثال کاربردیش اینه که به جای اینکه دستی برای هر کارگر یک تابع work بنویسیم یک قالب کلی بسازیم و استفاده کنیم.دیزاین پترن Visitorیکی از وظایف اصلی این دیزاین پترن اینه که تعامل اشیا و وظایفشون رو از همدیگه جدا کنیم.به این صورت که اشیا بدون اینکه وابستگی بینشون باشه بتونند با همدیگه به راحتی ارتباط برقرار کنند.مثلاً وقتی شما (customer) به تاکسی تلفنی زنگ می زنید یک منشی تلفن رو بر میداره و براتون یک تاکسی میفرسته (visitor).دیگه منشی بعدش هیچ وظیفه ای نداره و نباید شما رو برسونه بلکه وظیفه ی تاکسی هست که شما رو برسونه!</description>
                <category>Seyed Morteza Kamali</category>
                <author>Seyed Morteza Kamali</author>
                <pubDate>Thu, 02 Apr 2020 18:45:42 +0430</pubDate>
            </item>
                    <item>
                <title>دیزاین پترن های ساختاری</title>
                <link>https://virgool.io/@MrKamali/%D8%AF%DB%8C%D8%B2%D8%A7%DB%8C%D9%86-%D9%BE%D8%AA%D8%B1%D9%86-%D9%87%D8%A7%DB%8C-%D8%B3%D8%A7%D8%AE%D8%AA%D8%A7%D8%B1%DB%8C-%D8%A8%D9%87-%D8%B2%D8%A8%D8%A7%D9%86-%D8%B3%D8%A7%D8%AF%D9%87-t2t7qds16aqz</link>
                <description>این نوع از دیزاین پترن ها جهت بهبود نظم و ساختار اشیا‌ (Objects) و ایجاد توابع جدید از شئ (Object) مورد نظر استفاده میشود.دیزاین پترن Adapterاین درواقع همون آداپتور خودمونه که دوتا چیز نا سازگار رو بوسیله ی یک مبدل سازگار می کنه.مثال عملیش اینه که فرض کنید دوتا فرمت متفاوت داریم xml و json که نمیشه به هم تبدیلشون کردیک واسط می سازیم که فرمت XML رو به Json تبدیل کنهدیزاین پترن Bridgeاسم این دیزاین پترن به این دلیل پله چون بین انتزاع (Abstraction) و  پیاده سازی (Implementation) یک پل ایجاد می کنه و اونا رو از هم جدا می کنه!این دیزاین پترن کلاس هایی بزرگ هستند و خیلی شبیه به هم هستند رو جدا سازی می کنه!برای مثال به جای اینکه برای وسایل مختلف کنترل بسازیم می تونیم یک کنترل داشته باشیم که وسایل مختلف رو خاموش و روشن کنه!بذارید یک مثال دیگه بزنمهمون طور که تو شکل زیر می بینید برای هر شکل و رنگ یک کلاس تعریف شده!به جای تعریف کلاس میشه Color و Type تعریف کرد!دیزاین پترن Compositeجاهایی استفاده میشه که یک دسته بندی مثل درخت باشهفرض کنید یک سایت داریم آنلاین داریم که وقتی چیزی ازش سفارش داده میشه می خوایم قیمت اجناس رو حساب کنیم.با استفاده از دیزاین پترن Composite خیلی راحت میشه از زیر مجموعه ها پرسید قیمتتون چنده و بعد با هم جمع زدبذارید یک مثال دیگه بزنمدرجه های سربازی تو هر کشوری وجود داره که به صورت درختیهفرض کنید یک ارتشبد می خواد وضعیت سرباز ها رو بدونهخب مسلماً از خود سرباز ها نمی پرسه بلکه از مقام های پایین تر خودش می پرسه و اونا بهش میگندیزاین پترن Decoratorهمون طور که تزئین کیک راحت و منعطفه کد ما هم باید اینطوری باشه!یعنی یک کیک Base داریم و هر جور که بخوایم تزئینش می کنیم!یا مثلاً بخش های مختلف یک تفنگ خیلی راحت سرهم و از هم جدا بشه.یا مثلاً فرض کنید تو یک سایت ثبت نام کردید و ازتون می پرسه نوتیفیکیشن هارو چطوری براتون بفرسته؟این حق انتخاب این امکان رو به کاربر میده که هر فیچری که خواست رو انتخاب کنه!دیزاین پترن Facade گاهی وقت ها شما از یک کتابخونه ی پیچیده تو برنامتون استفاده می کنید که به همه ی قابلیت هاش نیاز ندارید و فقط یک قابلیت کوچیکش رو می خوایدبه عنوان مثال شما یک کتابخونه ی تبدیل فیلم و عکس دارید که فقط نیاز به تبدیل png به jpg دارید!دیزاین پترن Flyweight ایده ی این دیزاین پترن از Cache کردن میاد! مثلاً الان که دارید این مقاله رو می خونید اگر رفرش کنید عکس هاش دوباره دانلود نمیشه!بلکه عکس ها از Cache لود میشه! مثال کاربردی:فرض کنید شما تو بازیتون هزاران پارتیکل داریداگر قرار باشه به طور معمولی پارتیکل ها تولید بشه Ram به فنا میرهالگوی Flyweight میگه چیز هایی که مشترکه و چیز هایی که متغییره جدا بشه!مثلاً پارتیکل اسپرایت ها و رنگش یکیه ولی مختصات و جهت و سرعتش فرق می کنهپس برای Instantiate کردن از قالب یکسال استفاده می کنیماز اونجایی که هزارتا فیلد Sprite فضای بیشتری نسبت به هزار تا فیلد float اشغال می کنهوقتی جدا سازی انجام بشه فضای کمتری اشغال می کنهدیزاین پترن Proxy
شما وقتی می خواید پول از بانک بگیرید به جای اینکه برید بانک می تونید از عابر بانک ها استفاده کنیدیا مثلاً شما به جای اینکه پول بدید می تونید از کارت عابر بانک استفاده کنید که یک Proxy محسوب میشهدیزاین پترن Proxy درواقع یک واسط بین مبدأ و مقصده در نتیجه می تونیم یکسری محدودیت ها مثل محدودیت های امنیتی رو لحاظ کنیم.یک کاربرد دیگه هم داره که باعث بهینه شدن کد میشهفرض کنید تو کد شما یک کلاس هست که برای دسترسی بهش باید ازش Instantiate بشهدر حالت عادی ممکنه 100 بار ازش Instantiate بشه که بهینه نیستمی تونیم با Proxy که واسط هست یکبار Instantiate کنیم و بعد Cache کنیم بعدش هر بار که Instantiate شدن فراخونی میشه اول چک می کنه وجود داره یا نه؟ اگر وجود داشت که استفاده می کنه و لی اگر نبود Instantiate می کنه</description>
                <category>Seyed Morteza Kamali</category>
                <author>Seyed Morteza Kamali</author>
                <pubDate>Thu, 02 Apr 2020 16:59:25 +0430</pubDate>
            </item>
                    <item>
                <title>دیزاین پترن های ایجادی</title>
                <link>https://virgool.io/@MrKamali/%D8%AF%DB%8C%D8%B2%D8%A7%DB%8C%D9%86-%D9%BE%D8%AA%D8%B1%D9%86-%D9%87%D8%A7%DB%8C-%D8%B3%D8%A7%D8%AE%D8%AA%D8%A7%D8%B1%DB%8C-%D8%A8%D9%87-%D8%B2%D8%A8%D8%A7%D9%86-%D8%B3%D8%A7%D8%AF%D9%87-fv9fnrgy0en1</link>
                <description>سلام دوستان در این پست قصد دارم خلاصه ای از دیزاین پترن های ایجادی بگمقبل از شروع باید این نکته رو بگم که شما مجبور نیستید اول کار بخش کدنویسیش رو یاد بگیریدبا مفاهیمش آشنا بشید و هر جا که لازم شد استفاده کنید.دیزاین پترن های ایجادیاین نوع از دیزاین پترن ها جهت بهبود ایجاد یک یا چند نمونه (Instance) از شئ (Object) مورد نظر استفاده میشود. دیزاین پترن Singletonسینگلتون  به شما اطمینان می‌دهد از یک کلاس، تنها یک نمونه یا شی (Object) ساخته شود. بنابراین در هر زمان که استفاده از این کلاس نیاز شود، سینگلتون یک دسترسی سراسری به تنها شی‌ای که از این کلاس ساخته شده است ایجاد می‌کند و اجازه ساخت شی جدیدی را از آن کلاس نمی‌دهد.کاربرد: بعضی کلاس ها هست که فقط باید یک نمونه از اونا باشه مثل GameManager یا SoundManager دیزاین پترن Singleton این تضمین رو میده که فقط و فقط یک نمونه از آنها باشه.دیزاین پترن Builderبه جای اینکه یک شئ رو یکجا بسازیم مرحله به مرحله بسازیم.کاربرد: برای جا هایی به درد می خوره که شئ پیچیده دارید که لازمه تو چند مرحله ساخته بشه.دیزاین پترن Prototypeنوع اشیاء را با استفاده از Prototype(نمونه اولیه) نمونه مشخص کنید و اشیاء جدید را با کپی کردن این Prototype ایجاد می کند.به عبارت دیگر تسریع روند نمونه سازی و ایجاد اشیا با کپی سازی از نمونه‌های از پیش موجود.دیزاین پترن Factory به جای اینکه یک چیز رو دستی بسازیم یک کارخونه براش بسازیم تا ساختار پویایی داشته باشه!کاربرد: فرض کنید قراره یک بازی داشته باشیم که دارای هزاران مرحله باشهAsteroids game (Atari 1979)به جای اینکه مرحله ها رو دونه دونه بسازیم یک کارخونه براش می سازیم که یکسری پارامتر میگیره و برامون مرحله Generate می کنه. مثلاً به کارخونه پارامتر سختی ، سرعت رو میدیم و برامون یک مرحله تولید می کنه.دیزاین پترن Abstract Factoryاین الگو شباهت زیادی به الگوی Factory دارد، و در حقیقت همونه فقط با دیدی کلی تر!به این الگو Factory of Factory هم میگن به این معنی که برای کارخونه هاتونم می تونید کارخونه بسازید!!!کاربرد : جایی به درد می خوره کارخونتون بزرگ شده و می خواید بخش های مختلف براش داشته باشید فرض کنید شما کارخونه شیر دارید.این کارخونه شیر مورد نیاز رو تولید می کنهخب حالا فرض کنید از همین شیر می خواهیم محصولات دیگری بسازیم مثل شیرکاکائو ، شیر توت فرنگی و...این ها درواقع مشتق شده از شیر هستند و می توان برای هرکدام یک Abstract Factory ساخت</description>
                <category>Seyed Morteza Kamali</category>
                <author>Seyed Morteza Kamali</author>
                <pubDate>Thu, 02 Apr 2020 14:05:32 +0430</pubDate>
            </item>
                    <item>
                <title>دیزاین پترن به زبان ساده</title>
                <link>https://virgool.io/@MrKamali/%D8%AF%DB%8C%D8%B2%D8%A7%DB%8C%D9%86-%D9%BE%D8%AA%D8%B1%D9%86-%D8%A8%D9%87-%D8%B2%D8%A8%D8%A7%D9%86-%D8%B3%D8%A7%D8%AF%D9%87-jm57bavunj19</link>
                <description>دیزاین پترن چیست؟دیزاین پترن یا الگوی طراحی راه حل هایی برای مشکلات رایج در طراحی نرم افزارها هستند.اسپاگتی کُد چیست؟اسپاگتی کد (Spaghetti Code) یا کد درهم تنیده اصطلاحی در حوزه برنامه نویسی رایانه ای است و به سورس کدهایی گفته می‌شود که فاقد ساختار مناسب بوده و به علت پیچیدگی غیرضروری، فهم و نگه داری آن به امری دشوار تبدیل می‌شود.این درهم تنیدگی و پیچیدگی می‌تواند ناشی از عوامل مختلفی از جمله نبود قوانین مناسب برای استایل‌های برنامه نویسی و تجربه یا دانش ناکافی فرد برنامه نویس باشد.دیزاین پترن به ما کمک می کند که از یک روش اصولی بریم و کدمان اسپاگتی نشود.انواع دیزاین پترن:ساختاری (Structural): که بیشتر به ساختار کلاسها و ترکیب اشیاء میپردازن.ایجادی (Creational): که بیشتر به اشیا و شیوه ی ایجادشون مرتبط هستن.رفتاری (Behavioral): که بیشتر به ارتباط اشیاء در عین جداسازی عملکردشون تأکید دارن.منابع خوب برای یادگیری دیزاین پترن ها:https://sourcemaking.com/design_patternshttps://refactoring.guru/design-patternsSmok Channel Youtube</description>
                <category>Seyed Morteza Kamali</category>
                <author>Seyed Morteza Kamali</author>
                <pubDate>Thu, 02 Apr 2020 14:03:35 +0430</pubDate>
            </item>
            </channel>
</rss>