touch in unity | کار با تاچ در یونیتی (آپدیت شد !)
یونیتی برای خروجی پلتفورم های زیادی رو ساپورت میکنه که رابط کاربری برخی از انها به صورت لمسی می باشد , از این رو تسلط داشتن به پیاده سازی انواع تاچ از جمله تاچ زون ها و جوی استیک ها و دکمه ها و … بسیار حائز اهمیت است. در این اموزش بهترین و بهینه ترین روش برای پیاده سازی تاچ رو به شما عزیزان معرفی خواهم کرد پس تا اخر این مقاله با ما باشید.
انواع روش های پیاده سازی تاچ
- کدهای input
- touch سیستم یونیتی
- معرفی پکیج های تاچ
- معرفی پکیج virtual joystick
کدهای input
منظور از این قسمت کدهای مربوط به mouse میباشد , شاید کمی عجیب به نظر بیاید ولی در اکثر پلتفورم ها ( معمولا همه ) یکبار تاچ صفحه به معنی کلیک چپ یا mouse(0) است و دوبل تاچ یا دوبل تب به معنی mouse(1) می باشد . حال از اونجایی که با توجه به نوع بازار کار و شرایط ایران , فعلا بیشترین تمرکز بر روی ساخت بازی های اندرویدی یا ios است و تاجایی که بنده اطلاع دارم این فرایند تا حدودی برای اندروید قابل اجرا بوده و پشتیبانی میشود , در مورد ios هیچ اطلاعی ندارم اما معمولا سیستمی مشابه اندروید دارند و یکسانند.
کد نمونه برای کلیک ساده :
using UnityEngine; public class touch : MonoBehaviour { void Update() { if (Input.GetMouseButtonDown(0)) { Debug.Log("btn pressed !"); } } }
در صورتی که کد بالا را اجرا کنیم با کلیک کردن روی صفحه متن دیباگ برای ما چاپ میشود. از این نوع کد میتوانیم برای مواقعی که نیاز به پیاده سازی تاچ پیچیده ای نداریم استفاده کنیم.
البته خالی از لطف نیست که به سیستم Button یونیتی هم اشاره ای کنیم که بسیار سبک بوده و برای بازی های موبایل گزینه مناسبی است .
touch سیستم یونیتی
سیستم touch یونیتی که برای پیاده سازی تاچ بر روی پلتفورم های اندروید و ios در نظر گرفته شده از نظر راحتی استفاده بسیار خوب عمل کرده و برای تشخیص همزمان چند تاچ مناسب است , اما از جمله معایبی که این سیستم دارد این است که کد نوشته شده فقط و فقط بر روی پلتفورم اندروید و ios اجرا میشود یعنی کلیک موس رو به عنوان تاچ شماره 0 نمیشناسه که همین باعث منسوخ شدن ان توسط برنامه نویسان یونیتی شده است.
یک نمونه کد برای تاچ :
using UnityEngine; public class touch : MonoBehaviour { void Update() { if (Input.touchCount > 0) { Touch touch = Input.GetTouch(0); // get first touch since touch count is greater than zero if (touch.phase == TouchPhase.Stationary || touch.phase == TouchPhase.Moved) { Debug.Log("YES"); } } } }
در کد بالا ابتدا چک میکنیم اگر تعداد ناچ ها در صفحه بیشتر از 0 بود کد تاچ اجرا بشه و چون ما فعلا میخواهیم فقط یک انگشت رو چک کنیم touch رو برابر تاچ0 قرار میدیم و در داخل شرط مینویسیم که اگر انگشت کاربر روی صفحه قرار گرفت و یا روی صفحه حرکت کرد برای ما پیام Yes رو به صورت دیباگ نمایش بده.
طبق کد بالا برای شناسایی فقط یک تاچ ساده نزدیک به 10 سطر کد زدیم که همین هم دارای خطا بوده و اگر انگشت کاربر موقع تاچ از یک سمت صفحه خارج بشه سیستم تاچ نمیتونه تشخیص بده که دیگه تاچ انجام نمیشه و معمولا خطا میده . برای همین استفاده از این روش به هیچ وجه اصلا توصیه نمیشه.
معرفی پکیج های تاچ
معروف ترین پکیج تاچ که در اموزش های فارسی زبان هم خیلی از اون استفاده میشه پکیج Control Freak 2 می باشد که به هیچ عنوان استفاده از اون رو توصیه نمیکنم به علت تغییر دادن اسکریپت ها به صورت خودکار که بعد از نصب و پیکربندی عملا فرایند برگشت رو غیرممکن میکنه و پروژه ارور های بسیار زیادی رو متحمل میشه , همچنین از نظر پردازش و استفاده از منابع هم زیاد جالب نیست , بع از این پکیج پکیج های زیادی دیده ام که اصلا مناسب نیستند و حجم بسیار بالایی دارند مخصوصا نسبت به کاری که انجام میدهند .
معرفی پکیج virtual joystick
در میان انبوع پکیج های رنگارنگ که دارای متدهای عجیب و غریب هستند و بیشتر انها جنبه تبلیغاتی دارند , تنها یک پکیج مورد تایید من هست و اون هم همینه.
از ویژگی های این پکیج که اونو به یک پکیج نمونه و قابل اتکا تبدیل میکنه میشه به موارد زیر اشاره کرد
- استفاده مستقیم از event system یونیتی ( که باعث افزایش سرعت کارایی میشه )
- کدهای اوپن سورس و بسیار خلاصه و در صورت میاز قابل اصلاح
- در این پکیج هیچ متد تبلیغی و یا ایکن های اضافی و namespace های الکی استفاده نشده
- رایگان بوده
- قابلیت پیاده سازی انواع جوی استیک رو داره ( داینامیک یا استاتیک )
- بسیار بسیار قابل شخصی سازی هست که برای جذابیت بازی خیلی مهمه
- حجم بسیار پایین در حد چند کیلوبایت !
- touch zone : با این قابلیت میتونید یک قسمت از صفحه رو به صورت منطقه قابل تاچ در نظر پگیرید
- پشتیبانی کامل از عمق و مراحل اجرای ui که باعث میشه راحت بشه چندین touch zone رو باهم اجرا کرد
- تاچ های اجرا شده با این پکیج روی موبایل و کامپیوتر کاملا پشتیبانی میشن و میتونید راحت تست کنید
- باگ خروج انگشت از صفحه موقع تاچ کردن در این پکیج وجود نداره و کملا حل شده است.
- و …
آموزش استفاده از پکیج virtual joystick
ابتدا پکیج را ایمپورت میکنیم و برای استفاده از تاچ یک canvas ایجاد میکنیم

حالا برای اضافه کردن جوی استیک از پوشه prefab دلخواه را به صفحه و در زیرمجموعه canvas اضافه میکنیم

برای دست یابی به مقادیر x , y فقط کافیست که مقدار inputVector رو بدست بیاوریم به تصویر زیر دقت کنید

برای تشخیص محل تاچ از روش زیر استفاده میکنیم کار با FixedTouchField.cs

مطابق تصویر بالا ابتدا یک image به ui اضافه میکنیم و سپس به ان FixedTouchField رو ادد میکنیم و برای اینکه تاچ فیلد ما توی بازی معلوم نباشه الفای اون رو 0 میکنیم حالا تاچ فیلد ما اماده است و میشه ازش استفاده کرد نگاهی به اسکریپ تاچ میکنیم
using UnityEngine; using UnityEngine.EventSystems; public class FixedTouchField : MonoBehaviour, IPointerDownHandler, IPointerUpHandler { [HideInInspector] public Vector2 TouchDist; [HideInInspector] public Vector2 PointerOld; [HideInInspector] protected int PointerId; [HideInInspector] public bool Pressed; void Update() { if (Pressed) { if (PointerId >= 0 && PointerId < Input.touches.Length) { TouchDist = Input.touches[PointerId].position - PointerOld; PointerOld = Input.touches[PointerId].position; } else { TouchDist = new Vector2(Input.mousePosition.x, Input.mousePosition.y) - PointerOld; PointerOld = Input.mousePosition; } } else { TouchDist = new Vector2(); } } public void OnPointerDown(PointerEventData eventData) { Pressed = true; PointerId = eventData.pointerId; PointerOld = eventData.position; } public void OnPointerUp(PointerEventData eventData) { Pressed = false; } }
چند متغییری که در بالا تعریف شدن همه دارای متد HideInInspector هستند ما اون رو پاک میکنیم تا بتونیم تغییرات رو در اینسپکتور مشاهده کنیم
using UnityEngine; using UnityEngine.EventSystems; public class FixedTouchField : MonoBehaviour, IPointerDownHandler, IPointerUpHandler { public Vector2 TouchDist; public Vector2 PointerOld; protected int PointerId; public bool Pressed; void Update() { if (Pressed) { if (PointerId >= 0 && PointerId < Input.touches.Length) { TouchDist = Input.touches[PointerId].position - PointerOld; PointerOld = Input.touches[PointerId].position; } else { TouchDist = new Vector2(Input.mousePosition.x, Input.mousePosition.y) - PointerOld; PointerOld = Input.mousePosition; } } else { TouchDist = new Vector2(); } } public void OnPointerDown(PointerEventData eventData) { Pressed = true; PointerId = eventData.pointerId; PointerOld = eventData.position; } public void OnPointerUp(PointerEventData eventData) { Pressed = false; } }
شکل نهایی کدها و تست گرفتن از اون در داخل بازی

برای دکمه ها هم پیشنهاد میشه از دکمه های پیشفرض خود یونیتی استفاده کنید
در صورتی که مفاهیم بالا رو درک نکردید حتما پیشنهاد میشه در دوره کامل و رایگان این پکیج شرکت کنید
شرکت در دوره رایگان ساخت تاچ و جوی استیک برای موبایل + کد پروژه کامل
در صورتی که استفاده از این پکیج براتون مشکل بود و یا اگر سوالی داشتید بپرسید و در حد توان راهنماییتون خواهم کرد , ممنون و متشکر
سلام , ممنون بابت توضیحات کاملتون .
لطفا اموزش های پروژه محور بزارین 🙏
سلام
ممنون , حتما در روزهای اینده یک پروژه رو انتخاب میکنیم و از 0 تا 100 اونو شروع خواهیم کرد
عالی فقط میشه بگین چطوری جوی استیک حرکت داده شد یک شئ حرکت کنه و انیمیشن اجرا بشه
سلام – ببینید دوست عزیز در جوی استیک ما یه وکتور 2 داریم ( یعنی x,y ) حالا هر کدوم از اینها رو باید به جای اینپاد سیستم یونیتی معرفی کنید به کد ساده زیر توجه کنید
var move = Vector3(Input.GetAxis(“Horizontal”), Input.GetAxis(“Vertical”), 0);
transform.position += move * speed * Time.deltaTime;
کد بالا برای حرکت ابجکت با اینپادهای پیشفرض یونیتی هست حالا شما باید x و y رو بجای vertical و horizontal بنویسی
برای اشنایی با انیمیشن ها هم حتما توصیه میکنم تو دوره رایگان انیمیشن شرکت کنی
ببخشید من مبتدی هستم اگر میشه لطفا یک دوره یا همینجا موفصل توضید بدید
سلام – حتما یک دوره رایگان برای نحوه پیاده سازی تاچ از 0 تا 100 ایجاد خواهیم کرد , با توجه به سرعت کم هاست سایت دارم سایت رو انتقال میدم به یه هاست بهتر , شاید سایت دچار قطعی هم بشه , البته این قطعی موقتی خواهد بود و طی 24 ساعت دوباره سایت انلاین میشه , برای اطلاع از اخرین مطالب سایت و همچنین در کانال تلگرام سایت عضو شوید و هرگونه سوالی هم داشتید میتوانید در این بخش بپرسید حتما جواب میدم ^_^
سلام – مشکل هاست سایت حل شد – همچنین یک دوره کامل برای اموزش نحوه استفاده از پکیج در سایت قرار گرفت که از قسمت دوره ها قابل انتخاب بوده و یا اینجا کلیک کنید تا به صفحه دوره هدایت شوید.
با تشکر