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

اشنایی با برنامه نویسی ادیتور در انجین یونیتی: قسمت دوم

مقدمه: اشنایی با برنامه نویسی ادیتور در انجین یونیتی: مقدمه

قسمت اول: اشنایی با برنامه نویسی ادیتور در انجین یونیتی: قسمت اول

توجه:این مقاله برای سطح متوسط به بالا نوشته شده و ممکنه برای افراد مبتدی یونیتی گیج کننده باشه.


تو قسمت اول سه گزینه زیر رو بررسی کردیم:

  • نمایش و ویرایش editor
  • نمایش اجزای موجود در کد ها
  • نکاتی در نمایش اجزای موجود در کد ها

و تو این قسمت گزینه های زیر رو با هم یاد میگیریم:

  • افزودن اجزای جدید برای دسترسی و ویرایش کد ها
  • کار با توابع و راه اندازی ان ها
  • نمایش editor window

همچنین در ادامه توضیحات بیشتری درباره برنامه نویسی ادیتور میدم.

مانند قبل برای خوانایی راحت تر متغییر ها از _ استفاده کردم.


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

افزودن اجزای جدید برای دسترسی و ویرایش کد ها

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

با اضافه کردن دو ارایه جدید کار رو ادامه میدیم.

مثل قبل تو ادیتور نمایش میدیم.

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

راه حل این رسم نشدن خیلی راحته فقط باید یه true به رسم ارایه ها اضافه کنید.

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

با اضافه شدن این فیلد ارایه به صورت کامل رسم میشه.

خب این این ارایه رو برای اموزش های پیش رو اضافه کردم و اموزش رو با اضافه کردن این دو ادامه میدیم.


افزودن اجزای جدید برای دسترسی و ویرایش کد ها

خود ادیتور امکاناتی برای رسم فیلد هایی برای انجام کار های متنوع و متفاوت میده این فیلد ها میتونن کاربرد های متفاوتی داشته باشن که در ادامه با مثال های خیلی ساده برای اشنایی پیش میریم.

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

نوع متغییر از نوع کد ای هستش که برای اون کد ادیتور مینویسیم و چیزی که داخل پارانتز هستش برای مشخص کردن مقداری هستش که به وسیله = به متغییر داده میشه (تو برنامه نویسی به این حالت cast کردن گفته میشه)

در خط زیر با اضافه کردن یه فیلد int متغییر health رو با اون مقدار دهی میکنیم.

میدونم برای مثال اول یکم سخته اما خب لازمه اینم باهم یاد بگیریم و فقط چون متغییر اولیمون private هستش نیاز به این نوع نوشتن داریم و بقیه با دسترسی که با متغییر ie دادیم میتونیم ویرایش رو انجام بدیم.

تو خط 48 با استفاده از دسترسی که بالا با استفاده از SerializedProperty health ایجاد کردیم به خود متغییر private دسترسی پیدا میکنیم که intValue رو اینجور در نظر میگیریم که متغییر از نوع int هستش.

میرسیم به توضیح نحوه عملکرد کد IntField متد رسم یه فیلد از نوع int هست که ورودی اسم و مقدار رو بهش دادیم دومین ورودی برای مقدار در واقع مقداری هستش که قبل تغییر در اون وجود داره بعد تغییر مقدار با استفاده از = مقدار تغییر داده شده رو به همون متغییر انتقال میدیم.

اگه الان به ادیتور برگردید یه فیلد جدید در اخر کد اضافه شده که اگه اون رو تغییر بدید مقدار health در بالا هم تغییر میکنه بدون هیچ کار اضافی این قسمت خودش کاربرد های خودش رو داره.

در ادامه یه دکمه و یه متغییر برای جلوگیری از تغییر خودکار و به منظور جلوگیری از اشتباه اضافه میکنیم.

نکته ای که اینجا وجود داره اینه که متغییر های توی کلاس ادیتور همه از نوع private هستند که نیازی به نوشتن کلید واژه رو ندارن. (در واقع ننوشتن نوع متغییر قبل از انتخاب type به نشونه private اون متغییر هستش)

متغییر رو در این قسمت اضافه میکنیم و کلمه E که جلوی متغییر گذاشتم برای تمایز و نشون دادن اینکه این متغییر ادیتور هستش نوشتم و نیاز نیست شما هم تو همه اسم گذاری ها اینو رعایت بکنید اما لازمه که روشی که باهاش راحت هستید رو انجام بدید که متغییر هارو از هم تشخیص بدید.

خب حالا مقدار دهی رو هم تغییر میدیم که مقدار این متغییر رو تغییر بدیم نه متغییر اصلی.

الان اگه مقدار فیلد رو تغییر بدید میبینید که مقدار متغییر اصلی تغییر نمیکنه پس شروع میکنیم به نوشتن کد دکمه برای اعمال تغییر به متغییر.

کد دکمه رو به این صورت اضافه میکنیم مقدار ورودی اسمی هستش که برای دکمه در نظر گرفتیم و روی دکمه نشون داده میشه اما با کمی دقت متوجه میشید که این قسمت رو داخل یه if قرار دادم که این هم به این دلیل هستش که موقع کلیک روی دکمه بتونیم کلیک رو تشخیص بدیم و کار لازم رو انجام بدیم که در اینجا اعمال کردن مقدار به متغییر اصلی هست.

عکس بالا ادیتوری هستش که الان داریم که قسمت ها در هم قرار گرفتن و تشخیص قسمت ها از هم کار سختیه پس با اضافه کردن متن های راهنما این کار رو راحت تر میکنیم.

با اضافه کردن خط 50 یه label به ادیتور اضافه میکنیم که قابل ویرایش نیست و فقط در ادیتور برای نوشتن متن استفاده میشه و متن ورودی در ادیتور نمایش داده میشه.

خب حالا یکم بهتر شد و قابل تشخیص تر میتونید با استفاده از GUIStyle هم استایل خودتون رو به این فیلد و بقیه فیلد ها اعمال کنید.

خب حالا با اضافه کردن یه تیکه دیگه ادامه میدیم که تیکه بعدی از ارایه data_string دیتایی رو به text منتقل میدیم.

نکته این قسمت GetArrayElementAtIndex هستش که این تابع باعث میشه تیکه ای که از ارایه رو بهش لازم داریم رو نشون بده و همونطور که میبینید الان با دسترسی ie به متغییر ها دسترسی پیدا میکنیم و اونهارو ویرایش میکنیم.

حالا ادیتوری شبیه بالا داریم که با زدن دکمه مقدار به text کپی میشه.

اگه ارور هایی در کنسول مشاهده میکنین یا مقداری نمایش داده نمیشه ارایه data_string رو مقداردهی کنید.


کار با توابع و راه اندازی ان ها

توابع هم مثل متغییر ها به صورت private هستند و مثل بقیه کد فقط در ادیتور و زمان های مشخص شده کار میکنند و خارج از ادیتور و در خروجی تاثیری ندارند.

خود کاربرد توابع فکر نکنم نیازی به توضیح داشته باشه یا نیاز به مثال چون نحوه نوشتن و نحوه پیاده سازی مثل بقیه توابع و با کمک روش های بالا صورت میگیره تنها چیزی که نیاز به توضیح هستش تابع OnSceneGUI هست.

این تابع برای ویرایش اجزا و محیط scene میتونه استفاده بشه مثلا با استفاده از این تابع میشه در mesh ابجکت ها تغییراتی انجام داد یا جهت ها یا همون gizmos جدیدی به همون مش اضافه شده اضافه کرد تا بشه مش جدید رو تغییر مکان داد و مواردی از این قبیل که همه اونها در محیط scene اعمال میشن.

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


نمایش editor window

تقریبا میشه گفت تنها تفاوت editor با editor window نحوه نمایش editor window هستش که تو مقدمه بهش پرداختیم پس فعلا فقط یه تیکه کد از نحوه راه اندازی و نمایش editor window رو توضیح میدم.

تو مقدمه یه تیکه از همین editor window رو براتون نشون دادم که کد همون تیکه رو با هم بررسی میکنیم.

کتابخونه های مورد استفاده که تغییری نداریم فقط باید دقت کنید که اینجا در خط 7 که تعریف کلاس هستش به جای editor از editor window ارث بری میکنیم. (اسم کلاس مهم نیست من فقط اسم رو یکی انتخاب کردم و میتونید تغییرش بدید)

خط 9 در واقع محلی هستش که دکمه نشون دادن قراره قرار بگیره که میتونید منو های جدیدی هم ایجاد بکنید چیزی که باید دقت بکنید اینه که اگه بخواید زیر مجموعه های منوی های موجود باشه میتونید از اسم خود منو ها بعد با / گزینه خودتون رو ایجاد بکنید کاری که من با نوشتن Window کردم که باعث میشه این گزینه زیر مجموعه منوی موجود باشه و دکمه Editor Window Example رو به این منو اضافه بکنه.

خط 10 خطی هستش که موقع کلیک بر روی دکمه گفته شده اجرا میشه و در واقع پنجره اون منو رو باز میکنه در ورژن های قبل تر از هر پنجره فقط یکی باز میشد و اگه حتی با روش هایی که بود دو تا از اون رو باز میکردید هر دوشون یه جارو نشون میدادن اما تو نسخه های جدید (دقیق یادم نیست این گزینه از 2020 به بعد اضافه شده یا بر روی 2019.4 هم هست) میشه از پنجره inspector چندین گزینه باز کرد که هر کدوم یه قسمتی رو نشون میدن.

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

و خط 15 این پنجره رو نمایش میده به این صورت که اگه پنجره قبلا باز باشه روش فوکوس میشه و اگه پنجره ای باز نشده باشه پنجره جدیدی رو با استفاده از کد خط 12 نمایش میده.

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


توضیحات بیشتر

این مجموعه قسمت ها فقط نحوه نوشتن کد ها و نحوه استفاده رو توضیح میدادند که زیر مجموعه VisualElement API هست. اما بعد از این قسمت ها دو گزینه دیگه هم هستش که برای نحوه نمایش و ویرایش چیدمان این گزینه ها به کار میره که ادیتور های تمیز تر و بهتری داشته باشید این دو گزینه

  • UI Document:

که نحوه چیدمان المان های ادیتور رو مشخص میکنه.

  • USS:

که همون css هستش با کمی تفاوت جزئی که همونطور که در وب برای نحوه استایل دهی استفاده میشه دقیقا در همینجا هم برای همینکار استفاده میشه.

اگه وقت باشه در اینده درباره این دو گزینه هم مقاله مینویسم همراه با مثال هایی برای ادیتور. فعلا زمان سربازی من هستش که 1 دی شروع میشه و متاسفانه برای مدتی نمیتونم مقاله جدیدی منتشر بکنم هر چند بین مقاله اول دوم هم فاصله ای افتاد به خاطر همین اما خوشحالم که با همه دردسر هایی که بود تونستم مقاله رو تموم بکنم امیدوارم مشکلی نداشته باشه و مفید باشه.





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

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