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

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


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

تابع MoveTowards در یونیتی

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

  1. یک صحنه‌ی جدید ایجاد کنید.
  2. یک Cube در صحنه ایجاد کنید.
  3. یک EmptyGameObject در صحنه ایجاد کنید و آن را در جایی دورتر از Cube قرار دهید. (قرار است کیوب به مختصات این گیم‌آبجکت حرکت کند)
  4. یک اسکریپت به اسم AutoMove یا هر اسم دیگری ایجاد کرده و آن را به صورت زیر کامل کنید.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

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

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

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

پاسخ ما:

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

1
2
3
f(Vector3.Distance(transform.position, target.position) < 0.1f){
 
}

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

1
2
3
4
5
6
7
8
9
10
11
12
13

14
15
16
17
18
19
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 باشد، یعنی به مقصد نرسیده است و می‌تواند دوباره حرکت کند! ولی اگر خلاف این شرط باشد، یعنی به مقصد رسیده است!

مطالب مرتبط

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

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