5 راه برای حرکت دادن یک شی سه بعدی در یونیتی

فروردین 8, 1398     افسانه کریمی    

انواع روش های حرکت اشیا سه بعدی در یونیتی

5 راه برای حرکت دادن یک شی سه بعدی در یونیتی

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

همه اشیا در یونیتی ، کامپوننت transform رو دارن. از این کامپوننت برای ذخیره سازی موقعیت ، چرخش و اندازه استفاده میشه. میتونیم ازش اطلاعاتی رو خونده یا مقادیرش رو عوض کنیم .
به راحتی با کد قابل دسترسه . میشه بصورت مستقیم داخل کد دریافتش کرد . ( مثلا : public Transform transform ) یا اگر یک شی دارید میتونین با MyObject.transform بهش دسترسی پیدا کنین.

تنظیم موقعیت با transform

زمانی که به transform شی دسترسی دارین چنتا روش برای حرکت دادنش هست. این متد ها با جزئیات بیشتر پایین توضیح داده شده .

  • تنظیم موقعیت بصورت مستقیم برای تغییر موقعیتش در دنیای بازی
  • تنظیم موقعیت محلی ( localPosition ) برای تغییر موقعیت محلی شی
  • استفاده از متد translate برای حرکت شی در یک جهت و مسیر مشخص
  • وصل کردن یک شی به اشیا دیگه برای حرکت گروهی ( بصورت والد – فرزندی )

حرکت مستقیم transform در موقعیت دنیا بازی

موقعیت دنیا بازی ، موقعیتی در صحنه هست که همیشه ثابته . اهمیتی نداره شی شما کجاست . به عنوان مثال :
( X : 0 , Y : 0 , Z : 0 ) همیشه اشاره به مرکز زمین بازی داره .

برای تنظیم در موقعیت دنیا از ویژگی position استفاده میکنیم که یک vector 3 رو دریافت میکنه .

transform.position = new Vector3 ( 120f , 50f , 45f );

تو این مثال شی شما یهویی از جایی که بوده میره به این ادرس . این ادرس یعنی : X :120 ، Y : 50 و Z : 45 در دنیا.
اگر قصد دارین شی اروم حرکت کنه و به موقعیت دلخواهتون بره میتونین از Lerp استفاده کنین که تو این مقاله بهش پرداختیم.

حرکت مستقیم transform به یک موقعیت محلی

قبل از توضیح بیشتر درباره موقعیت محلی باید بدونیم عمق ، والد ها و فرزندا چطور کار میکنن. موقعیت محلی با توجه به موقعیت والد متفاوته . ( که بهتون اجازه میده داخل یک فضا جداگانه حرکت کنین . مثلا حرکت داخل یک صفینه فضایی بدون نیاز به محاسبه موقعیت جدید با توجه به موقعیت جدید صفینه !🤯)
برای تنظیم موقعیت محلی مثل موقعیت عادی از یک Vector3 استفاده میکنیم . البته این موقعیت به مرکز والدش وابستس و به مرکز دنیامون کاری نداره .

transform.localPosition = new Vector3( 120f , 50f , 45f )

از مثال سلسله مراتب ماشین (همون هایراکی ) استفاده میکنیم . اگر فرض کنیم این موقعیت محلی که نوشتیم برای قطعه های ماشینه و خود ماشین ( والدمون ) تو موقعیت ( X : 50 , Y : 0 , Z : 0 ) در دنیاس بنابراین موقعیت قطعه ها تو دنیا میشه ( X : 170 , Y : 50 , Z : 45 ) .

عمق ها و سیستم والد و فرزندی اشیا تو یونیتی چطور کار میکنه ؟

تو سلسله مراتب اشیا میتونن داخل همدیگه قرار بگیرن . ( میتونین بِکشینشون تو هم یا از کدنویسی استفاده کنین .)
یک شی زمانی داخل یک شی دیگه قرار میگیره فرزند نامیده میشه . و اون شی که فرزندارو داخل خودش داره والد نامیده میشه. ( و به روندی که یک شی رو داخل یکی دیگه میکشین parenting میگن )

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

 

  • کمترین عمق ، عمق 0 که با رنگ سبز نشون داده شده و ریشه اصلی ماشینمونه و بقیه اجزا ماشین همگی زیر مجموعش هستن. اگر ماشینمونو تو صحنه حرکتش بدیم همه فرزنداش هم حرکت میکنن.
  • عمق 1 با رنگ آبی نشون داده شده. تو این مثال از این عمق برای دسته بندی و مرتب سازی اجزا ماشین استفاده شده مثلا نور ها ، قطعه ها ، کولایدر چرخ ها و …
  • عمق 2 با رنگ نارنجی نمایش داده شده. این اشیا بعضی قسمتا به عنوان عمق اخر استفاده شده مثل کولایدر چرخ ها ولی خب بعضی جاهام هنوز چندین شی هست که میتونن مرتب تر بشن مثل نورها.
  • در نهایت عمق 3 که با رنگ قرمز نشون داده شده . هنوزم میتونستیم اینارو ریزتر دسته بندی کنیم مثلا نور های جلو ماشین ، نور های عقب ماشین و .. ولی خب برای فهمیدن کلیتش همینقدر کافی بود . 😊

 

 

 

حرکت یک شی با استفاده از متد Transform Translate

متد translate بهتون این امکان رو میده که یک شی رو با توجه به جهت و فاصله حرکت بدین . همچنین میتونین مشخص کنین که میخواین طبق موقعیت محلی یا دنیا بازی حرکتش بدین .
پارامتر اصلی که این تابع دریافت میکنه انتقاله (translate) که یک Vector3 هست و مشخص میکنه شی شما چقدر از موقعیت فعلیش باید جابجا بشه.
اول از همه باید بدونین تو چه جهتی میخواین حرکت کنین. میتونین از جهت های دنیا بازی مثل :

Vector3.forward , Vector3.right , Vector3.up

یا یک جهت محلی وابسته به موقعیت فعلیتون استفاده کنین مثل :

myTransform.forward , myTransform.right , myTransform.up

(میتونین از یک مقدار منفی استفاده کنین تا خلاف اون جهت حرکت کنه . مثلا :

-myTransform.forward

که متناسب با موقعیت شی عقب میره .)
حالا که فهمیدین تو چه جهتی میخواین حرکت کنین کافیه فاصله رو در اون ضرب کنین .

myTransform.Translate(myTransform.forward * 10f)

این کد شی تونو 10 متر جلو میبره .

تنظیم موقعیت با Rigidbody

کامپوننت Rigidbody زمانی استفاده میشه که میخواین به شی تون فیزیک بدین. بصورت دستی تو اینسپکتور به شی اضافه میکنین . تو اسکریپت هم میتونین از طریق تعریف متغیر public Rigidbody یا با فراخوانی GetComponent<Rigidbody>() از خود شی یا transform بهش دسترسی پیدا کنین.

تغییر مستقیم موقعیت Rigidbody

مشابه تنظیمات موقعیت transform ، ریجید بادی هم ویژگی position و localPosition داره که مستقیما شی رو جابجا میکنه . البته این فقط یک میانبر برای تغییر موقعیت ها نیست و از موتور فیزیکی استفاده میکنه !
میتونین تو این مقاله بیشتر درباره فیزیک بخونین .

استفاده از متد AddForce

وارد کردن نیرو در جهت دلخواه به Rigidbody هم میتونه باعث حرکت شی بشه . البته توجه کنید که اگر شی شما تحت تاثیر نیروی جاذبه باشه روی نیروی داده شده هم اثر میذاره .

myRigidbody.AddForce(myTransform.forward * 10f, ForceMode.Force);

این تابع یک نیرو شتاب دهنده به ریجید بادی اضافه میکنه که تحت تاثیر جرمشه . تو این مثال نیرویی رو جلو به اندازه 10 وارد میکنه.

استفاده از Velocity

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

بهترین استفاده ازش برای جاهایی مثل پرش تو بازی FPS هست که انتظار تغییر یهویی دارین . تو هر قدم فیزیکی نباید ازش استفاده نشه مثلا دویدن طولانی کاربرتو بازی هایی مثه zigzag چون منجر به شبیه سازی های غیرواقعی میشه و براتون مشکل ایجاد میکنه.

rg.Velocity = new Vector3 (0,10,0);

تو این مثال هم شتابی به اندازه 10 در جهت y به شی وارد میشه . و درصورتی که این شتاب تحت تاثیر جاذبه نباشه میتونه مدت خیلی طولانی به حرکتش ادامه بده .

امیدوارم براتون مفید واقع شده باشه . موفق باشید .

منبع : unity3dtips

دسته‌بندی‌ : بازی سازی, بلاگ

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

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

Rating*