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

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

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


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

شروع به کار

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

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

public class AutoMove : MonoBehaviour {

	public Transform target;
	public float speed = 0.1f;

	void Update () {
		if (target) {
			transform.position = Vector3.MoveTowards (transform.position, target.position, speed);
			if(Vector3.Distance(transform.position, target.position) < 0.1f){
				print ("FullKade.Com");
			}
		}
	}
}

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

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

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

پاسخ ما:

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

if(Vector3.Distance(transform.position, target.position) < 0.1f){

}

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

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class AutoMove : MonoBehaviour {

	public Transform target;
	public float speed = 0.1f;

	void Update () {
		if (target) {
                    if(Vector3.Distance(transform.position, target.position) > 0.1f) {
                        transform.position = Vector3.MoveTowards (transform.position, target.position, speed);
                    } else {
                        ایستاده است و میتوانید شلیک کنید.
                    }
		}
	}
}

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

پاسخ دهید

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

cp-codfk

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

    1. noname کاربر مهمان گفت:

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

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

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

        1. noname کاربر مهمان گفت:

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

          11
        2. noname کاربر مهمان گفت:

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

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

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

            1. noname کاربر مهمان گفت:

              دمتون گرم♥

              11
    2. noname کاربر مهمان گفت:

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

      11
    3. iman کاربر مهمان گفت:

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

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

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

    4. سیاوش کاربر مهمان گفت:

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

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

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

    5. صالح کاربر مهمان گفت:

      سلام من این کد رو نوشتم دقیقا عین همین فقط بازیم دوبعدیه اما به محض اینکه کد اجرا میشه اون گیم تمام مختصات مکانش با مختصات مکان شیع اصلی یکی میشه با اینکه سرعتش هم رو 0.1f گزاشتم.
      چی کار کنم؟!

      11
    6. امیر کاربر مهمان گفت:

      سلام
      توی یک بازی عین 41148 سکانس تیراندازی زیر زمین، علاوه بر اینکه تیر به سمت موقعیت کلیک شده می رفت، دست هم طوری می چرخید که روبروی اون نقطه قرار بگیره. همچین چیزی رو چطور بسازیم؟

      یه سوال دیگه هم داشتم که چطور عین بازی 1:011 متن ها یهویی نیان و با افکت تایپ شدن تک تک حروف بیان؟

      چون اینارو هرجوری سرچ کردم پیدا نشد

      خواهشا جواب بدید
      با تشکر

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

        سلام. سوال اول شما نیاز به بررسی بازی داره.
        برای سوال دوم هم می‌تونید از «این لینک» کمک بگیرید

توضیحات پیشنهادی نظرات اشتراک