آموزش زوم با اسکرول ماوس

در این آموزش یونیتی به شرح این موضوع می پردازیم که چطور در یونیتی zoom in و zoom out را با Middle Mouse انجام دهیم.

اسکریپت زیر را مشاهده می کنید، در این اسکریپت یونیتی، مهم ترین ویژگی که برای عمل زوم با موس وسط در یونیتی استفاده شده است گزینه  Input.mouseScrollDelta می باشد.

مقدار input.mouseScrollDelta در یک Vector2.y ذخیره می شود(مقدار Vector2.x آن نادیده گرفته می شود)، مقدار Input.mouseScrollDelta می تواند مثبت (به سمت بالا) یا منفی (به سمت پائین) باشد. وقتی که اسکرول موس( موس وسط) هیچ چرخشی نداشته باشد این مقدار صفر می باشد.

آموزش زوم با اسکرول ماوس در یونیتی

در این کد unity تصمیم داریم با استفاده از ویژگی Field Of View دوربین و تغییر مقدار آن، زوم را در این پروژه یونیتی مدیریت کنیم.

وقتی دوربین را در پنجره هایرارکی انتخاب کنید، کامپوننت Camera را مشاهده می نمائید. این کامپوننت ویژگی‌ای بنام Field Of View دارد که در این اسکیپت از آن بهره می‌بریم.

البته در این حالت از قسمت Projection باید گزینه Perspective انتخاب باشد که دید دارای عمق یا سه بعدی به ما می دهد.

در ابتدای اسکریپت سه متغیر تعریف کردیم که از نام آن ها تقریبا عملکردشان مشخص است، Camera برای نسبت دادن دوربین از طریق اینسپکتور با سطح دسترسی عمومی تعریف شده است، به این دسترسی نیاز داریم زیرا باید به ویژگی Field Of View دوربین دسترسی دهیم.

متغیر zoomChange و smoothChange به ترتیب سرعت حرکت دوربین و میزان نرمی حرکت را مشخص می کنند، هر دو با سطح دسترسی عمومی تعریف شدند تا از طریق اینسپکتور میزان آن ها قابل تغییر باشد.

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

در شرط اول مشاهده می کنید : 

  if(Input.mouseScrollDelta.y > 0)

مطابق توصیحات mouseScrollDelta.y که در ابتدای آموزش اشاره شد، اگر موس وسط را به سمت مقابل بچرخانید یا حرکت دهید در واقع مقدار آن بزرگتر از صفر می شود و در حالت زوم، دوربین ما باید زوم آن زیاد تر و محدوده دید آن کم تر شود. به عبارتی باید مقدار Field of View کم تر شود. لذا از کد زیر استفاده می نمائیم : 

;Cam.fieldOfView -= zoomChange * Time.deltaTime * smoothChange

در کد بالا مقدار fieldOfView را از مقدار مجموع ضرب zoomChange و smoothChange کم می کنیم که عدد fieldOfView به نرمی کسر شود و حالت zoomIn برای ما اجرا شود، ضرب در Time.deltaTime برای این است که در تمام سیستم ها این عمل با سرعت یکسان انجام شود این ویژگی فریم بین فراخوانی تابع های اپدیت را به ما می دهد و معمولا برای همین موضوع استفاده می شود.

برای شرط دوم تمام توضیحات دو اسکریپت بالا صدق می کند با این تفاوت که در شرط دوم اگر موس وسط را به سمت خود یا مخاطب چرخیده یا حرکت داده شود مقدار mouseScrollDelta.y کوچکتر از صفر می شود و باید به مقدار field Of View اضافه کنیم تا محدوده دید دوربین وسیع تر  و زوم کم تر شود.

تا این جا همه چیز به درستی عمل می کند اما ما هیچ کنترلی بر مقدار zoomIn و zoomOut نداریم و تا حداقل و حداکثر پارامتر fieldOfView  این زوم ها ادامه دارد، پس تکه کد زیر به کار ما می آید : 

;Cam.fieldOfView = Mathf.Clamp(Cam.fieldOfView, 10f, 80f)

با استفاده از تابع Clamp می توانیم یک مقدار را محدود به یک حداقل(در این جا ۱۰f) و حداکثر(در این جا ۸۰f) کنیم به این شکل که اگر عدد مورد نظر ما(cam.fieldOfView) از حداقل(۱۰) کمتر شد مقدار حداقل در عدد ریخته و به همین شکل اگر از حداکثر(۸۰) بیشتر شد مقدار حداکثر در آن ریخته می شود.

به این شکل دوربینی در unity داریم که در بازه های ۱۰ و ۸۰ عمل زوم را با اسکرول موس توسط مخاطب انجام می دهد. مسلما شما می توانید این اعداد را به دلخواه خود تغییر دهید.

برای حالت دو بعدی می توانید از قسمت Projection گزیه Orthographic را انتخاب و از مقدار size دوربین استفاده نمائید

منبع: http://gamedeveloper.blog.ir