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

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

به نام خدا

در بسیاری از مواقع در پروژه های 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 لذت برده باشید.

 

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

 

نکته مهم :

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

 

 

 

 

۱ ۰ ۸ دیدگاه

دیدگاه‌ها (۸)

عالیی . من چهار سال پیش با دیدن بازی اقای فنایی (سازنده بازی 41148) به این حرفه علاقه مند شدم و  اموزش های شما رو تقریبا بیشترش رو دیدم و الان تقریبا یه حرفه ایم و دارم اولین بازیمو میسازم و به نظر من کسایی که میخوان شروع کنن ایتدا با یادگیری برنامه نویسی وقتشون رو هدر ندن من با playmaker و bolt کار میکنم که هم به کار سرعت میده هم باعث میشه ادم به درک بهتری از برنامه نویسی یونیتی برسه یوتویوب پر از اموزش ارزشمنده از اونم استفاده کنین . در ضمن از بازی (66 یاور) انتظار بیشتری داشتم .

پاسخ:

۱۳ ارديبهشت ۹۸، ۱۲:۴۱
سلام حمید عزیز
ضمن تشکر از نظر شما
در خصوص برنامه نویسی نظر شما رو تایید نمی کنم تقریبا در بازار یک بازی موفق مشاهده نمی کنید که از پکیج ها کاملا استفاده کرده باشد، همین بازی 41148 کاملا کدنویسی شده است
اتفاقا من توصیه می کنم عزیزانی که تمایل به ساخت بازی با یونیتی را دارند، وقت خود را با پکیج ها هدر ندهند و شروع به یادگیری این مبحث کنند تا راحت ایده های خود را پیاده نمایند
در خصوص 66یاور بازیسازی در اشل تیمی لزوم تجربه است و در این پروژه تجربه های زیادی داشتیم به امید خدا در پروژه های جاری از تجربیاتمان نهایت استفاده را خواهیم برد
موفق و مستدام باشید

سلام.یک سوال داشتم،برای درست کردن بازی های آنلاین به دستگاه خاصی نیاز هست؟

پاسخ:

۲۳ مرداد ۹۸، ۲۳:۴۳
سلام امیر عزیز
خیر باید به زبان های برنامه نویسی سمت سرور آشنا باشید
البته بحث سرور و سخت افزار مورد نیاز توسط شرکت های ارائه دهنده حل می شود
مهم یادگیری تکنولوژی های مورد نیاز است
موفق باشید

سلام،خیلی ممنون که پاسخ دادید.البته تشکر ویژه ای از آموزشهاتون دارم و خیلی لذت بردم.یک سوال دیگه هم داشتم،میتونید چند منبع که در رابطه با کد نویسی سمت سرور هست بهم معرفی کنید؟

پاسخ:

۲۵ مرداد ۹۸، ۱۱:۰۸
سلام امیر عزیز
خواهش می کنم
به امید خدا به زودی سایت راه اندازی می شود و آموزش ساخت بازی های انلاین قرار می گیرد
موفق باشید

سلام.

من وقتی ک میخام یک عدد تصادفه درست کنم نکست رو با قرمز نشون میده

;()Random rand=new Random

;()int adad=rand.Next


مطالب وبلاگتون جز معدود مطالب فارسی بود که ازشون لذت بردم


سلام .. آموزشاتون عالیه واقعا ممنون :)


 

سلام جناب اقای رجب زاده من در یونیتی با سیشارپ میخواهم سیستمی پیاده کنم که با کلیک چپ موس اگر در باز بود بسته شه و اگر بسته بود باز بشه و همچنین پیادسازی سیتم قفل و کلید رو هم برای درها لازم دارم که کد های این دو عمل رو نوشتم ولی 2 تا مشکل دارم اول اینکه با کلیک چپ برروی در تمامی در ها با هم دیگه باز میشود و باهم بسته میشوند دومین مشکل هم اینه که من کدی برای نابودی گیم ابجکت و ترو شدن مقدار متغیر بولین نوشتم ولی افسوس کار نمیکنه 

کد نوشته شده

using UnityEngine;
using System.Collections;
using UnityEngine.UI;

public class animationdoor : MonoBehaviour {
     

    public RaycastHit hitdoor;
    public float reange;
    public GameObject caracter;
    public bool animdoor;

    public bool[] key = new bool[5];
    public GameObject[] _key = new GameObject[5] ;

    void Awake () {
        
    }
    

    void Update () {
        
        _animatordoor ();
        }
     
    void _animatordoor(){

        if(Input.GetButtonDown("Fire1")){
            if(Physics.Raycast(caracter.transform.position,caracter.transform.forward,out hitdoor,reange)){
                if (hitdoor.collider.gameObject.tag == "door") {

                
                    animdoor = !animdoor;

                    if (animdoor == false) {
                        gameObject.GetComponent<Animator> ().SetBool ("opendoor", true);
                        gameObject.GetComponent<Animator> ().SetBool ("closedoor", false);
                    }
                    if (animdoor == true) {
                        gameObject.GetComponent<Animator> ().SetBool ("closedoor", true);
                        gameObject.GetComponent<Animator> ().SetBool ("opendoor", false);
                    }
                    
                }

                if(hitdoor.collider.gameObject.tag == "key1"){
                    
                    DestroyObject (_key[0]);
                    key[0] = true;
                    Debug.Log (key[0]);

                }
            }
            }


    }
}


سلام وقتتون بخیر 
من تازه برنامه نویسی و بازی سازی با یونیتی رو شروع کردم ولی به یک مشکل در یونیتی بر خوردم، وقتی صفحه رو زوم میکنم تمام ابجکت ها و عکس ها غیب میشن ...چیکار باید بکنم که این اتفاق نیفته؟
ممنون میشم پاسخ بدید


ارسال نظر آزاد است، اما اگر قبلا در بیان ثبت نام کرده اید می توانید ابتدا وارد شوید.
شما میتوانید از این تگهای html استفاده کنید:
<b> یا <strong>، <em> یا <i>، <u>، <strike> یا <s>، <sup>، <sub>، <blockquote>، <code>، <pre>، <hr>، <br>، <p>، <a href="" title="">، <span style="">، <div align="">
تجدید کد امنیتی

GameDeveloper

تمام آموزش های جدید در تلگرام آپلود شده اند https://t.me/GameDevUnity

آخرین مطلب
آخرین نظرات