به نام خدا
در بسیاری از مواقع در پروژه های 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 لذت برده باشید.
نکته مهم :
اگر آشنایی از یونیتی و سی شارپ دریونیتی ندارید ابتدا باید دوره جامع و رایگان را به اتمام برسانید، کلیک کنید.
دیدگاهها (۸)
hamid
۱۳ ارديبهشت ۹۸ ، ۱۱:۳۸
پاسخ:
۱۳ ارديبهشت ۹۸، ۱۲:۴۱
امیر
۲۳ مرداد ۹۸ ، ۲۰:۵۹
سلام.یک سوال داشتم،برای درست کردن بازی های آنلاین به دستگاه خاصی نیاز هست؟
پاسخ:
۲۳ مرداد ۹۸، ۲۳:۴۳
امیر
۲۵ مرداد ۹۸ ، ۰۱:۵۴
سلام،خیلی ممنون که پاسخ دادید.البته تشکر ویژه ای از آموزشهاتون دارم و خیلی لذت بردم.یک سوال دیگه هم داشتم،میتونید چند منبع که در رابطه با کد نویسی سمت سرور هست بهم معرفی کنید؟
پاسخ:
۲۵ مرداد ۹۸، ۱۱:۰۸
مهدی
۲۱ دی ۹۸ ، ۱۴:۴۵
سلام.
من وقتی ک میخام یک عدد تصادفه درست کنم نکست رو با قرمز نشون میده
;()Random rand=new Random
;()int adad=rand.Next
مصطفی
۲۹ دی ۹۸ ، ۱۹:۱۲
مطالب وبلاگتون جز معدود مطالب فارسی بود که ازشون لذت بردم
Mahdi
۰۹ فروردين ۹۹ ، ۱۵:۳۸
سلام .. آموزشاتون عالیه واقعا ممنون :)
رضا
۲۲ ارديبهشت ۹۹ ، ۱۹:۱۷
سلام جناب اقای رجب زاده من در یونیتی با سیشارپ میخواهم سیستمی پیاده کنم که با کلیک چپ موس اگر در باز بود بسته شه و اگر بسته بود باز بشه و همچنین پیادسازی سیتم قفل و کلید رو هم برای درها لازم دارم که کد های این دو عمل رو نوشتم ولی 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]);
}
}
}
}
}
نوید عباسی
۲۶ فروردين ۰۰ ، ۰۳:۲۴
سلام وقتتون بخیر
من تازه برنامه نویسی و بازی سازی با یونیتی رو شروع کردم ولی به یک مشکل در یونیتی بر خوردم، وقتی صفحه رو زوم میکنم تمام ابجکت ها و عکس ها غیب میشن ...چیکار باید بکنم که این اتفاق نیفته؟
ممنون میشم پاسخ بدید