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

از نقطه p میخایم تیر ها رو که اندازه سرعتشون s هست اما جهتشو نمیدونیم چیز کنیم.
نقطه q هدف هست که داره با سرعت v که اندازه v ثابت هست حرکت میکنه.
نقطه برخورد که نمیدونیم کجاست رو اسمشو میزاریم h.
نقطه h کلید حل مساله هست چون ( البته کلید فاصله ی h تا p هست خود h دسته کلیده)
h = q + vt
ینی به صورت برداری نقطه h میشه مختصات اولیه q + سرعت نقطه q در زمان
اگه طرفدار فیزیک نیستید مث من یا اگه تموجه نشدید مث من اینو بخونید
تو یه بعد اگه مکان اولیه 1 باشه و سرعت هم 1 باشه تو زمان 2 ما کجاییم؟ 3
تو دو بعد اگه مکان اولیه (0,0) باشه و سرعت (1,1) تو زمان 2 کجاییم؟ (2،2)
سه بعدشم یه ویرگول بیشتر داره ( همیشه ساده سازی و مثال بکنید البته این مورد زیادی بدیهی بود)
خب حالا اندازه ی :
p-h
میشه فاصله نقطه p تا h دیگه !
این اندازه یه طور دیگم به دست میاد دقت کنید اندازه نه مختصات:( که ینی چقد از نقطه p دور شدیم)
st
در واقع یه دایره یا کره حول نقطه p در نظر بگیرید پوسته ی اون کره میشه تمام مختصات هایی که فاصلشون تا p میشه st . نقطه مشترک این کره و مسیر q که کره بر حسب t بزرگ میشه ، میشه نقطه h خودمون .این جمله رو نشنیده بگیرید :)
دو معادله یه مجهول:
| p - h | = st
دو طرف به توان دو و اینور اونور و اینا : توان دو بردار میشه همون Dot product (ضرب نقطه ای)
q + vt - p = st ,w = q-p
w + vt = st
(w.w) + (v.v * t^2) + 2t (w.v) = s^2 t^2
معادله درجه 2 که
Ax^2 + Bx + C = 0
A = v.v - s^2 , B = 2w.v , C = w.w ---> x=t
از این رابطه t به دست میاد که ینی میتونیم نقطه h که مجهول بود رو پیدا کنیم یا اگه خاستیم میتونیم
p - h
رو حساب کنیم و normalize یا همون یکه اَش بکنیم و در s ضربـــء اَش ، میشه بردار سرعت تیر
خب طبیعتا دومین چیزی که نیاز داریم یچیه که معادله درجه دو حل کنه

دلتا منفی نمیشه خب جواب همیشه یه t مثبت و حقیقیه برا همین برا راحتی اون که بزرگتره رو برگردوندرندندرم ( بعد یه پست در مورد عدد غیر حقیقی که بنده خدا حقیقیه فقط اسمش گمراه کنندس شاید بزارم )

و میتونیم به سادگی متد LookAt رو برای transform اسلحه یا حالا هرچی صدا بزنیم متد بالا رو بندازیم توش
که target_RB به کامپوننت RiggedBody هدف وصله
و bullet_Speed هم سرعت RiggedBody تیره (اینجاش خیلی جالب نیست که به تیر همچین کامپوننتی بدیم) پس میتونیم سرعتشم با تفاضل مکان فعلی و قبلیش تقسیم بر زمان به دست بیاریم :)
این که چطوری به اون transform ها و rigidbody ها دسترسی پیدا کنیم تو هر جایی فرق میکنه ( همه چیز را public static میکند )
مرسی که تا اینجا خوندید یا تا اینجا اسکرول کردید و فقط همین یه خطو خوندید
thanks to : @mjfalahi
منبع: