عطا قائم آذر
عطا قائم آذر
خواندن ۶ دقیقه·۴ سال پیش

اشنایی با DOTS در یونیتی entity spawn

قسمت اول: اشنایی با DOTS و توضیح علمکرد این تکنولوژی در انجین unity

تو این قسمت سیستم DOTS رو نصب میکنیم و سعی میکنیم یه spawner ساده برای تست راه بندازیم

توجه: این اخرین ورژنی هستش که خودم با یونیتی تست کردم ممکنه به خاطر اپدیت ها در اینده این کد ها تغییر پیدا بکنن چون این سیستم هنوز در حال تکامل هست و نهایی نشده و این مقاله با استفاده از یونیتی 2019.3 تست شده و خروجی گرفته شده.

توجه2: این مقاله هم مثل مقاله قبلی برای افراد متوسط به بالای یونیتی مناسب هستش.

اول از همه لازمه که پکیج های DOTS رو نصب کنیم (این سیستم به صورت پکیج منتشر شده) برای اینکار لازمه از داخل پکیج منیجر یونیتی پکیج های لازم برای این سیستم رو دانلود بکنیم.

پکیج منیجر یونیتی رو میتونید با انتخاب window و انتخاب گزینه package manager باز کنید.


چون یه تعداد از پکیج های DOTS هنوز در حالت preview هستن با انتخاب گزینه advanced و از انتخاب گزینه show preview packages مطمئن بشید که اون پکیج ها هم براتون نشون داده بشه (البته اگه از یونیتی 2020 استفاده میکنید این گزینه به جای دیگه ای منتقل شده که با یه سرچ ساده میتونید پیداش بکنید) در اخر هم مطمئن بشید که گزینه کنار علامت + به جای in project در حالت all packages باشه

خب به ترتیب پکیج های مورد نیاز رو با توضیحاتی که چی هستند رو نصب میکنیم:

  • Burst:

کامپایلری که در قسمت قبل دربارش توضیح دادم هستش

  • Entities

پکیج Entity component system هستش که در قسمت قبل توضیح دادم و شامل هر سه قسمت زیر مجموعه خودش هم هستش

  • Hybrid Renderer

این پکیج سیستم رسم و رندر DOTS هست و بدون این پکیج entity ها رندر و در صفحه نمایش داده نمیشن

  • Jobs

پیکج سیستم C# job system هست که در قسمت قبل دربارش توضیح دادم

  • Mathematics

برای دستورات ریاضی در DOTS از این پکیج استفاده میشه

بعد از نصب تمامی پکیج های بالا میتونیم استفاده از DOTS رو شروع بکنیم

اولین چیزی که باید در یاد داشته باشیم معماری Entity component system در این سیستم هستش که در مقاله قبلی توضیح دادم و تمامی اجزا طبق اون معماری باید از هم جدا باشند
در قسمت هدر کد ها برای مواقعی که از سیستم DOTS استفاده میکنیم باید از using های مربوط به این سیستم استفاده بکنیم

از قسمت ساده تعریف prefab برای spawn شروع میکنیم

کد prefab
کد prefab

خط بالایی که GenerateAuthoringComponent هستش برای تبدیل کد به mono هستش که در inspector قابل نمایش باشه

یادتون باشه که طبق معماری Entity component system کد های تعریف متغییر ها از نوع struct هستند و از IComponentData ارث بری میکنند (اینترفیس تعریف متغییر) و در این بلاک فقط متغییر ها تعریف میشن

در داخل بلاک entity با نام prefabb تعریف شده که این ابجکت رو در زمان اجرا instantiate میکنیم

این کد رو به یک گیم ابجکت خالی متصل کنید تا ابجکت مورد نظرتون رو بهش assign کنید

بعد از اتصال کد در قسمت add component عبارت convert to entity رو تایپ کنید تا در زمان اجرا این گیم ابجکت از حالت مونو به entity تبدیل بشه

کد اول کدی هستش که بالا نوشتیم و پایینی کد تبدیل تبدیل حالت مونو به DOTS و Entity هستش
کد اول کدی هستش که بالا نوشتیم و پایینی کد تبدیل تبدیل حالت مونو به DOTS و Entity هستش


خب حالا که prefab رو داریم کد spawn رو تو یه فایل جدا مینویسیم

کد پایینی نیازی نیست که به یه گیم ابجکت متصل باشه و خودکار عملیاتش رو انجام میده
کد spaw
کد spaw

این کد برای spawn پریفب ها می باشد که میتونید با تغییر اعداد اون زمان spawn رو تغییر بدید

این کد از نوع class و از ComponentSystem (اینترفیس تعریف کد های عملیات) ارث بری میکنه

تابع Oncreate در واقع همان تابع Start در مونو هستش و تابع OnUpdate هم همانند تابع Update مونو عمل میکنه

اول تایمری مشخصی میکنیم و در هر Update از اون کم میکنیم و در زمان خودش اجازه فراخوانی کد spawn رو بهش میدیم

خط 12 برای new کردن متغییر random هستش

خط 21 ام برای پیدا کردن entity هایی هستش که کد entityholder رو بهشون اضافه کردیم در واقع این کد به این اشاره میکنه که به ازای هر Entity که ref (دارای) کد entityholder (کد تعریف prefab) باشه این عملیات رو انجام بده که ما فقط یک Entity با این مشخصات داریم میتونید با Duplicate کردن همون یه گیم ابجکت به جای یه Entity در همون زمان مشخص 2 تا Entity همزمان spawn کنید

بعد از پیدا کردن entity که این کد رو داره در داخل بلاک با استفاده از توابع DOTS اون رو ایجاد میکنیم ( همونطور که میبینید برای Instantiate یک Entity از تابع EntityManager استفاده میکنیم) و در خط بعدی Translation که همان Transform مونو هستش رو در یه محل random در صفحه قرار میدیم (در ورژن فعلی DOTS برای ایجاد تغییر مشخصات بعضی از کامپوننت ها و یه تعداد کد های دیگه از توابع EntityManager استفاده میکنیم)

اعداد برای گوشی ها هست ولی باز ممکنه برای بعضی از گوشی ها خارج از محدوده باشه

خب تا به جای اینکار entity هارو در محل های متفاوت spawn کردیم و به کمک پکیج Hybrid Renderer نشون داده میشن

اما در قسمت inspector گیم ابجکتی اضافه نمیشه چون entity ها در یه tab مخصوص نشون داده میشن برای نمایش این tab این مسیر رو باز کنید window -> analysis -> Entity Debugger تو این پنجره تمامی entity ها نمایش داده میشن

Entity Debugger
Entity Debugger

الان بعد اجرا میتونید ببینید به خاطر کد convert to entity به طور خودکار ابجکتی که پریفب رو داخلش قرار دادید تبدیل به entity شده و دیگه تو inspector نیست و در داخل این تب نشون داده میشه

من اسم گیم ابجکت رو prefab گذاشتم و همین اسم هم تبدیل شده اگه اسمش رو هم تغییر بدید یا اسم دیگه ای براش انتخاب کرده باشید هم مشکلی ایجاد نمیشه

و در ادامه میتونید ابجکت هایی که در حال spawn شدن هستن رو در ببینید

تو نسخه فعلی Entity ها تو پنجره Scene نشون داده نمیشن



این قسمت دوم این مجموعه هستش که منتشر میکنم و امیدوارم مفید واقع بشه اگه نکته ای بود که از قلم افتاده یا پیشنهادی دارید میتونید با ارسال کامنت یا با ارسال پیام تو توییتر با من در ارتباط باشید

ادرس مطلب در توییتر : توییت

یونیتیunityunity dotsاموزش بازی سازیdots
برنامه نویس
شاید از این پست‌ها خوشتان بیاید