تابع MoveTowards در یونیتی
حرکت مستقیم و خودکار از یک نقطه به یک نقطه دیگر
بعضی اوقات شاید بخواهید که یک GameObject از یک نقطه به یک نقطهی دیگری که مشخص کردهایم، به طور مستقیم و خودکار حرکت کند و زمانی که به آن جا رسید از حرکت بایستد! و البته نوشتن کد چنین چیزی ساده است؛ اما یونیتی تابعی را در کلاس های Vector بدین منظور آماده کرده است که میتوانیم از آن استفاده کنیم.
شروع به کار
فرض کنید میخواهیم اسکریپتی نوشته و آن را به یک Cube وصل کنیم. سپس این Cube به محض شروع بازی از نقطهی فعلی خود به سمت یک نقطهی دیگری که مشخص کردهایم حرکت کند؛ و زمانی که به مقصد رسید، یک پیامی را برایمان نمایش دهد.
- یک صحنهی جدید ایجاد کنید.
- یک Cube در صحنه ایجاد کنید.
- یک EmptyGameObject در صحنه ایجاد کنید و آن را در جایی دورتر از Cube قرار دهید. (قرار است کیوب به مختصات این گیمآبجکت حرکت کند)
- یک اسکریپت به اسم 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 نیز بیشتر شود! ولی به هرحال این سادهترین روش برای بررسی این که به مقصد رسیده است یا خیر میباشد.
تمرین
یک اسکریپتی بنویسید که با استفاده از متد 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 باشد، یعنی به مقصد نرسیده است و میتواند دوباره حرکت کند! ولی اگر خلاف این شرط باشد، یعنی به مقصد رسیده است!
سلام
آقا این الان به مقصد رسید خب حالا می میخوایم ایست کنه باید چی کار کنیم؟؟؟
ممنون میشم سریع تر جواب بدید
سلام؛ توی کد مشاهده میکنید که فاصله رو بررسی کردیم و گفتیم که اگه فاصله تا مقصدش کمتر از 0.1f باشه یعنی به مقصد رسیده! قبل از این بررسی کردنم جابهجایی رو انجام دادیم!
و خب حالا واضحه که شما باید این بررسی فاصله رو قبل از جابه جایی انجام بدین تا اگه کمتر بود دیگه جابه جا نشه و درنتیجه آبجکت از حرکت میاسته!
پس یه کد بنویسین و بگین اگه از 0.1f بزرگتر بود، آبجکت رو جابهجا کنه
آبجکت رو جا به جا کنه رو بلدم ولی میخوام آبجکت وقتی به مقصد رسید از حرکت بایسته
خواهشا کمک کنید
ببینید دارم یه بازی تفنگی میسازم میخوام دشمن وقتی فاصلش باهام به 5 رسید ایست کنه و بهم شلیک کنه
الان فقط مشکلم ایست کردنشه
به جای اینکه متنی برامون چاپ بشه میخوام از حرکت بایسته
همین
چند تا روش رو امتحان کردم ولی جواب نداد
خب واضح توضیح دادم ولی نمیدونم چرا متوجه نشدین
جواب شما به انتهای پست اضافه شد
دمتون گرم♥
سلام
ببخشید یه سوال داشتم
میشه به یه آبجکت دو تا انیمیشن داد؟
یا حتی بیشتر؟
اگه میشه خواهشا یه توضیحی بدید
ممنون میشم
مثلا میخوام وقتی کاراکتر راه بره با یه انیمیشنی حرکت کنه و وقتی تیر میخوره یه انیمیشنی اجرا بشه
هر کاری میکنم نمیشه
یا هر دو ادغام میشن یا فقط مجبورم از یه انیمیشن استفاده کنم
با سلام من کدی میخام سرعت دوربین به عنوان مثال از 5 شروع بشه و پس از گذشت 15 ثانیه به سرعت 10 برسه و رو سرعت 10 هم بمونه . سوال بعدی یک شیئ سه بعدی دارم پس برخورد با یک گیم آبجکت سرعت دوربین دوباره از اول شروع بشه از 5 بعد 15 ثانیه به 15 برشه
سلام؛ دو مطلب زیر برای هدف پروژتون کارسازه:
مطلب اول
مطلب دوم
سلام خواسته نباشید میشه جواب تمرین رو هم قرار بدید..ممنون میشم
سلام؛ درخواست شما مورد بررسی قرار میگیره
سلام من این کد رو نوشتم دقیقا عین همین فقط بازیم دوبعدیه اما به محض اینکه کد اجرا میشه اون گیم تمام مختصات مکانش با مختصات مکان شیع اصلی یکی میشه با اینکه سرعتش هم رو 0.1f گزاشتم.
چی کار کنم؟!
سلام
توی یک بازی عین 41148 سکانس تیراندازی زیر زمین، علاوه بر اینکه تیر به سمت موقعیت کلیک شده می رفت، دست هم طوری می چرخید که روبروی اون نقطه قرار بگیره. همچین چیزی رو چطور بسازیم؟
یه سوال دیگه هم داشتم که چطور عین بازی 1:011 متن ها یهویی نیان و با افکت تایپ شدن تک تک حروف بیان؟
چون اینارو هرجوری سرچ کردم پیدا نشد
خواهشا جواب بدید
با تشکر
سلام. سوال اول شما نیاز به بررسی بازی داره.
برای سوال دوم هم میتونید از «این لینک» کمک بگیرید