به نام خدا

در بسیاری از مواقع در پروژه های Pc که با یونیتی یا هر انجین دیگری توسعه داده می شوند، نیاز هست با اسکرول موس عمل زوم را انجم دهیم.

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

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

 

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

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

 



using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ZoomScroll : MonoBehaviour
{
    public Camera Cam;
    public float zoomChange;
    public float smoothChange;
    void Start()
    {
        
    }

    
    void Update()
    {
        if(Input.mouseScrollDelta.y > 0)
        {
            Cam.fieldOfView -= zoomChange * Time.deltaTime * smoothChange;
        }

        if(Input.mouseScrollDelta.y < 0)
        {
            Cam.fieldOfView += zoomChange * Time.deltaTime * smoothChange;
        }

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

 

در این کد 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 می توانیم یک مقدار را محدود به یک حداقل(در این جا 10f) و حداکثر(در این جا 80f) کنیم به این شکل که اگر عدد مورد نظر ما(cam.fieldOfView) از حداقل(10) کمتر شد مقدار حداقل در عدد ریخته و به همین شکل اگر از حداکثر(80) بیشتر شد مقدار حداکثر در آن ریخته می شود.

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

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

 

امیدوارم از این اموزش unity لذت برده باشید.

 

همچینین می تواند برای دریافت اموزش های کاربردی در کانال تلگرام عضو شوید برخی از اموزش ها فقط در کانال منتشر می شوند، کلیک کنید.

 

نکته مهم :

اگر آشنایی از یونیتی و سی شارپ دریونیتی ندارید ابتدا باید دوره جامع و رایگان را به اتمام برسانید، کلیک کنید.