منحنی(Curve) همه چی تمام در یونیتی _CinemachinePath

بسم الله الرحمن الرحیم

بنظر من داخل بازی یک منحی خوب از نون شب واجب تره.از حرکت دوربین گرفتن تا انیمیشن ابجکت ها ,مسیر یابی و ... شما به منحی ها نیاز پیدا می کنید.

منحنی bezier curve

برای ساخت منحنی (Curve) مفهومی به اسم bezier curve وجود دارد که یک فرمول ریاضی است که خط صاف شما را به یک منحنی تبدیل می کند .

در کل دو نوع bezier curve داریم نوع اول quadratic bezier نام دارد که در واقع یک منحنی با یک کنترلر است و نوع دوم که خیلی هم رایج تر است cubic bezier نام دارد که از دو کنترلر برای ساخت منحنی استفاده می کند .

در تصویر زیر یکcubic bezier به همراه فرمول آن را مشاهده می کنید . در تصویر p0 نقطه شروع خط است و p3 نقطه پایان خط .

اما برای ساخت یک cubic bezier شما نیاز دارید که دو نقطه ی دیگر هم اضافه کنید که نقطه p1 و p2 هستند.

قدم بعدی گرفتن lerp بین نقطه هاست که در فرومولی که سمت چپ تصویر نشان داده شد ترتیب آن مشخص است. (lerp چیست ؟)

در اخر هم نقطه ایی که به دست می اورید نقطه p است که یکی از نقاط منحنی شما است

cubic bezier
cubic bezier

در نهایت برای بدست اوردن جهت و سرعت منحنی در نقطه خاص باید متشق فرمول بالا را بگیرید .

اما CinemachinePath چیست ؟

_CinemachinePath
_CinemachinePath


اما بجای اینهمه ریاضی و عدد و رقم میتوانید خیلی راحت از کمپوننت CinemachinePath استفاده کنید.

این کمپوننت برای هدایت دوربین طراحی شده ولی تقریبا هر کاری بخواهید میتوانید بهاش انجام بدید و از همه مهم تر اینه که یک ادیتور خیلی خوب داره که این امکان رو میده از طریق سین ویو (scene view) منحنی رو دستکاری و طراحی کنید.نکته مثبت اینه که کد هاش کاملا اوپن سورس و قابل دستکاری هست.ودر انتها یک سری از قابلیت های این طلای ناب رو اینجا براتون مینویسم.

  • تمام موارد زیر از طریق کد قابل تنظیم هستند.فقط کافی است یک رفرنس به کمپوننت cinemachine path ایجاد کنید.

ء m_Resolution که از طریق اینسپکتور هم قابل تنظیم است مشخص می کند که بین هر خط چند نقطه بساز و هر چه بیشتر باشید منحنی شما دقیق تر است .

ءEvaluatePosition(Evaluate) این فانکشن به شما مختصات نقطه مورد نظر در منحی را می دهد مثلا فرض کنید که یک منحنی دارید که از سه نقطه تشکیل شده است. اگر بخواهید مختصات نقطه اول را بگیرید کافی است عدد یک را به این فانکشن بفرسید و برای نقطه دوم و سوم به همین ترتیب.

اما اگر بخواهید چیزی بین نقطه ها را بگیرید مثلا مختصات بین نقطه 1 و نقطه 2 باید عدد 1.5 را به این فانکشن ارسال کنید .برای مثال من با همین فانکشن ماشینی که در گیف زیر می بینید را به حرکت در اوردم.

برای روتیشن ماشین در نقطه های مختلف هم از فانکشن EvaluateOrientation(Evaluate) استفاده کردم که جهت چرخ در نقطه را بر میگرداند. برای فهم بهتر به نمونه کد دقت کنید.

[SerializeField] GameObject Car; // رفرنس به ابجکت ماشین 
[SerializeField] CinemachinePath cinemachinePath; // رفرنس به کمپوننت 
[SerializeField] float Evaluate;  // عددی که مشخص می کند چه نقطه ایی از خط را برگرداند
private void Update(){
Evaluate= (Evaluate+ Time.deltaTime);  هر فریم  یک نقطه جلو تر می رود 
// پوزیشن ماشین  را ست می کند
Car.transform.position = cinemachinePath.EvaluatePosition(Evaluate); 
// روتیشن ماشین را ست می کند
Car.transform.rotation = cinemachinePath.EvaluateOrientation(Evaluate);
}

کمپوننتcinemachinePath قابلیت های زیادی دارد که هدف در اینجا فقط معرفی این ابزار بود برای مطالعه بیشتر به این صفحه مراجعه کنید.