اشیا (GameObjects) و اجزا (Components) در یونیتی

اسفند 28, 1397     افسانه کریمی    

اموزش بازی سازی با موتور یونیتی

اشیا و اجزا در یونیتی

تو مقاله های قبلی با موتور یونیتی اشنا شدیم . فهمیدیم که یونیتی یک موتور بر مبنا اجزا یا همون Component-based هست . اما اینکه این چیه و چجوری باهاش کار کنیم رو تو این مقاله بررسی میکنیم.

اشیا (GameObjects)

اشیا مهمترین بخش در یونیتی هستن. هر چیزی که تو بازی وجود داره یک شی حساب میشه. هر چند که یک شی خودش به تنهایی نمیتونه کاری انجام بده . باید بهش اجزایی (Components) رو اضافه کنیم.

اجزا (Components)

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

  • یک شی میسازیم (GameObject)
  • یک مدل سه بعدی هیولا بهش اضافه میکنیم . (Component)
  • جز جون (Health) رو بهش اضافه میکنیم . (Component)
  • جز مهارت هاشو (Skills) بهش اضافه میکنیم . (Component)
  • جز حرکاتش (Movement) رو بهش اضافه میکنیم . (Component)
  • جز هوش مصنوعی (AI) رو بهش اضافه میکنیم . (Component)
  • جز صدا (Sound) رو بهش اضافه میکنیم . (Component)

بنابراین هرزمان که میخوایم چیزی به دنیای بازیمون اضافه کنیم یک شی میسازیم و بهش اجزایی اضافه میکنیم .
در یونیتی ، اجزا میتونن اسکریپت ، صدا ، مش ( مدل سه بعدی ) ، ریجید بادی ، کولایدر و … باشن.

تو مثال بالا ، جون هیولا ، مهارتهاش،حرکات و هوش مصنوعیش اسکریپت هستن.

حالا سوال اینه که خب چرا همه ی اینهارو تو یک اسکریپت ننویسیم و به این همه بخش شکستیمش ؟

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

  • یک شی میسازیم (GameObject)
  • یک مدل سه بعدی بهش اضافه میکنیم . (Component)
  • جز جون (Health) رو بهش اضافه میکنیم . (Component)
  • جز مهارت هاشو (Skills) بهش اضافه میکنیم . (Component)
  • جز حرکاتش (Movement) رو بهش اضافه میکنیم . (Component)
  • جز صدا (Sound) رو بهش اضافه میکنیم . (Component)
  • جز اسلحه هاشو بهش اضافه میکنیم . (Component)
  • جز شیلد یا همون سپر براش اضافه میکنیم . (Component)

خب اینجا قسمت قشنگ یک سیستم بر مبنا اجزاست : میتونیم از اجزایی که برای شی هیولا ساخته شده مجددا استفاده کنیم!

بنابراین همه کاری که باید بکنیم ساخت یک بازیکنه و از بیشتر اجزایی که برای هیولا ساختیم مثل جونش ، حرکاتش و … استفاده کنیم. و یکسری اجزا دیگه مثل سپر و اسلحه و .. بهش اضافه میکنیم .
اینکار مارو از کلی کدنویسی تکراری نجات میده!!

توسعه بر مبنا اجزا : نکات و حقه ها

دسترسی به اجزا ی داخل یک شی

بنابراین بازیکن ما دو اسکریپت داره :

  • Health
  • Movement

جز جون ، وضعیت فعلی و بیشترین جون رو داره به اینصورت :

جز حرکت هم که کاربر رو با کلیک کردن جابجا میکنه . به اینصورت :

هروتا اسکریپت رو به بازیکن میدیم. بنابراین الان داریم:

اسکریپت جون و حرکت بازیکن

خب از اونجایی که وقتی کاربر میمیره (جونش صفر میشه) باید حرکتش متوقف بشه . چطور میتونیم بین این دو جز (اسکریپت ها) ارتباط برقرار کنیم ؟

خوشبختانه فعلا هردو این ها داخل یک شی هستن و ارتباطشون خیلی راحت امکان پذیره .
راه اسونی به اسم GetComponent وجود داره. اینطوری میتونیم به جون بازیکن دسترسی داشته باشیم :

(به زبون ساده یعنی اسکریپت جون کاربر رو بگیر !)

حالا که اینو داریم ببینیم چجوری ازش تو اسکریپت حرکت استفاده میشه :

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

دسترسی به اجزا ی یک شی دیگر

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

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

اینسپکتور هیولا

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

اسکریپت های جون ، حرکت و تست بازیکن

خب چجوری از داخل تست به جون هیولا دسترسی پیدا کنیم ؟

باید یک متغیر عمومی از نوع Health تعریف کنیم . اسمشو جون هیولا میذاریم.

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

متغیر عمومی جون هیولا

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

انتخاب هیولا و کشیدن ان در متغیر مربرطه

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

دسترسی به اجزا ی یک شی دیگر

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

منبع : noobtuts.com

دسته‌بندی‌ : بازی سازی

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

Rating*