تبلیغات

متد MoveTowards در یونیتی – حرکت مستقیم به یک نقطه دیگر

تابع MoveTowards در یونیتی | حرکت مستقیم به یک نقطه مشخص

تابع MoveTowards در یونیتی
حرکت مستقیم و خودکار از یک نقطه به یک نقطه دیگر


بعضی اوقات شاید بخواهید که یک GameObject از یک نقطه به یک نقطه‌ی دیگری که مشخص کرده‌ایم، به طور مستقیم و خودکار حرکت کند و زمانی که به آن جا رسید از حرکت بایستد! و البته نوشتن کد چنین چیزی ساده است؛ اما یونیتی تابعی را در کلاس های Vector بدین منظور آماده کرده است که می‌توانیم از آن استفاده کنیم.

شروع به کار

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

  1. یک صحنه‌ی جدید ایجاد کنید.
  2. یک Cube در صحنه ایجاد کنید.
  3. یک EmptyGameObject در صحنه ایجاد کنید و آن را در جایی دورتر از Cube قرار دهید. (قرار است کیوب به مختصات این گیم‌آبجکت حرکت کند)
  4. یک اسکریپت به اسم AutoMove یا هر اسم دیگری ایجاد کرده و آن را به صورت زیر کامل کنید.

در این جا ما یک فیلد از جنس Transform ایجاد کرده‌ایم تا EmptyGameObject را از Inspector به آن درگ کنیم! و کیوب قرار است به این نقطه حرکت کند. همچنین یک فیلد دیگری به اسم speed ایجاد کرده‌ایم تا سرعت حرکت را در آن مشخص کنیم.

در داخل Update، ابتدا بررسی کرده‌ایم که آیا مقصدی وجود دارد یا خیر (منظور همان target است) و اگر هدفی وجود داشت، مختصات نقطه‌ی فعلی گیم‌آبجکت را برابر با مختصات جدیدی که توسط MoveTowards ایجاد می‌شود قرار داده‌ایم.

در واقع تابع MoveTowards با گرفتن «مختصات گیم آبجکتی که می‌خواهیم حرکت را برای آن حساب کنیم»، «مختصات مقصد»، و «سرعت حرکت»، آبجکتی از جنس Vector3 به ما برمی‌گرداند. و به عبارت ساده‌تر، MoveTowards مختصات جدیدی بین مختصات اول و دوم را با تنظیم سرعتی که دریافت کرده است به ما می‌دهد و ما می‌توانیم از آن برای حرکت یک آبجکتی استفاده کنیم.

در ادامه با استفاده از تابع Distance بررسی کرده‌ایم که اگر فاصله‌ی نقطه‌ی فعلی از مقصد کمتر از 0.1 بود، یعنی به مقصد رسیده است و بنابراین پیامی را چاپ کند! اما چرا 0.1؟!
چون قرار نیست دقیقا 0 شود! و حتی ممکن است به خاطر وجود Collider اطراف مقصد، از 0.1 نیز بیشتر شود! ولی به هرحال این ساده‌ترین روش برای بررسی این که به مقصد رسیده است یا خیر می‌باشد.

در بازی دوبعدی به جای Vector3 کافیست از Vector2 استفاده کنیم.
برای این که پیام پشت سرهم چاپ نشود، می توانیم از یک boolean استفاده کنیم! یا target را null کنیم و البته به این شرط که مثل کد بالا target را بررسی کرده باشیم که null نباشد.

تمرین

یک اسکریپتی بنویسید که با استفاده از متد MoveTowards، آبجکتی را از یک نقطه به یک نقطه‌ی دیگری حرکت داده و سپس برگرداند و دوباره همین کار را از ابتدا شروع کند؛ و همچنین در هربار که به مقصد می‌رسد، تاخیری داشته باشد و سپس به عقب برگردد! (شاید نیازتان شود: آموزش اجرای کد بعد از گذشت یک ‌زمان در یونیتی + یک مثال ساده)

سوال یکی از کاربران

سلام
آقا این الان به مقصد رسید خب حالا می میخوایم ایست کنه باید چی کار کنیم؟؟؟

پاسخ ما:

ما وقتی از دستور زیر برای بررسی این‌که کاراکتر به مقصد رسیده است یا نه استفاده می‌کنیم:

می‌توانیم این دستور را به صورت برعکس و قبل از جابه‌جایی به کار ببریم! به شکل زیر:

این‌جا بررسی می‌کنیم که اگر فاصله تا مقصد بیشتر از 0.1 باشد، یعنی به مقصد نرسیده است و می‌تواند دوباره حرکت کند! ولی اگر خلاف این شرط باشد، یعنی به مقصد رسیده است!

تبلیغات
کانال تلگرام فول کده
تبلیغات

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

هادی اکبرزاده

[ مدیر فول کده ]

علاقه‌مند به اشتراک گذاری اطلاعات در هر زمینه‌ای / برنامه‌نویس و دانشجوی ارشد رشته شبیه‌ساز هوشمند - در حال نوشتن یه رمان (اگه خدا بخواد و تموم شه ?)

پاسخ دهید

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

نظرات ثبت شده 11 دیدگاه

    1. noname گفت:

      سلام
      آقا این الان به مقصد رسید خب حالا می میخوایم ایست کنه باید چی کار کنیم؟؟؟
      ممنون میشم سریع تر جواب بدید

      1. هادی اکبرزاده گفت:

        سلام؛ توی کد مشاهده می‌کنید که فاصله رو بررسی کردیم و گفتیم که اگه فاصله تا مقصدش کمتر از 0.1f باشه یعنی به مقصد رسیده! قبل از این بررسی کردنم جابه‌جایی رو انجام دادیم!
        و خب حالا واضحه که شما باید این بررسی فاصله رو قبل از جابه جایی انجام بدین تا اگه کمتر بود دیگه جابه جا نشه و درنتیجه آبجکت از حرکت میاسته!
        پس یه کد بنویسین و بگین اگه از 0.1f بزرگتر بود، آبجکت رو جابه‌جا کنه

        1. noname گفت:

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

        2. noname گفت:

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

          1. هادی اکبرزاده گفت:

            خب واضح توضیح دادم ولی نمیدونم چرا متوجه نشدین
            جواب شما به انتهای پست اضافه شد

            1. noname گفت:

              دمتون گرم♥

    2. noname گفت:

      سلام
      ببخشید یه سوال داشتم
      میشه به یه آبجکت دو تا انیمیشن داد؟
      یا حتی بیشتر؟
      اگه میشه خواهشا یه توضیحی بدید
      ممنون میشم
      مثلا میخوام وقتی کاراکتر راه بره با یه انیمیشنی حرکت کنه و وقتی تیر میخوره یه انیمیشنی اجرا بشه
      هر کاری میکنم نمیشه
      یا هر دو ادغام میشن یا فقط مجبورم از یه انیمیشن استفاده کنم

    3. iman گفت:

      با سلام من کدی میخام سرعت دوربین به عنوان مثال از 5 شروع بشه و پس از گذشت 15 ثانیه به سرعت 10 برسه و رو سرعت 10 هم بمونه . سوال بعدی یک شیئ سه بعدی دارم پس برخورد با یک گیم آبجکت سرعت دوربین دوباره از اول شروع بشه از 5 بعد 15 ثانیه به 15 برشه

      1. هادی اکبرزاده گفت:

        سلام؛ دو مطلب زیر برای هدف پروژتون کارسازه:
        مطلب اول
        مطلب دوم

    4. سیاوش گفت:

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

      1. هادی اکبرزاده گفت:

        سلام؛ درخواست شما مورد بررسی قرار میگیره