«یا اللهُ یا رَبِّ یا حَیُّ یا قَیّوم یا ذَالجَلالِ وَ الاکرام اَسئَلُکَ بِاسمِکَ اَلعَظیم اَلاَعظَم اَن تَرزُقَنی رِزقاً حَلالاً طَیِّباً بِرَحمَتِکَ الواسِعَه یا اَرحَمَ الرّاحِمِین.»
آموزش تاچ در یونیتی/آموزش کلاس Input و تشخیص لمس یا Touch در unity :: گیم اور _ بازیسازی با unity + مطالب متفرقه

گیم اور _ بازیسازی با unity + مطالب متفرقه

آموزش های علمی با اجازه ی خدا تقدیم به هرکس خدا بخواد

آموزش های علمی با اجازه ی خدا تقدیم به هرکس خدا بخواد

به نام خدا
--
گروه قدیم ما promakers.ir یا پرومیکرز بود که بالای هزار اموزش توش ساخته بودم به اسم sajjad3011 ولی حیف ادمین سایتش عوض کرد
حالا سوالی بود کاری بود این شمارمه

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

---
سوالی بود بذارید
نظر خصوصی نذارید
پاسخش سخته
دوست داشتید شماره بذارید تو واتساپ یا ایتا یا .... گروه بزنیم.
09358077198

بایگانی
پیوندها

برای اینکار از کلاس Input استفاده میشه و تعداد(count) انگشت ها رو هم میشه شمرد.

قبل از هرچیزی باید بررسی کنیم که دستگاه ما آیا از multi touch ساپورت می کنه یا نه :D :


bool supportsMultiTouch = Input.multiTouchEnabled;
print("MultiTouchSupport : " + supportsMultiTouch);
این آموزش فرضش اینه که موبایل لمسی شما از مالتی تاچ حمایت می کنه.

برای گوشی های single-touch کافیه توی هر تایم یک تاچ رو چک کنیم.

مثال زیر همه ی تاچ(لمس) ها و موقعیت اونا رو نمایش تشخیص می ده :
void Update ()

            {

                int nbTouches = Input.touchCount;


                if(nbTouches > 0)

                {

                    print(nbTouches + " touch(es) detected");


                    for (int i = 0; i < nbTouches; i++)

                    {

                        Touch touch = Input.GetTouch(i);


                        print("Touch index " + touch.fingerId + " detected at position " + touch.position);

                    }

                }

        }
 
Input.touchCount نشون می ده چند تاچ در هر فریم قال تشخیص هست. می تونیم تکرار کنیم و از Input.GetTouch برای تشخیص تمام لمس ها استفاده کنیم.

هر ساختار Touch شامل یک fingerId هست که یک نمونه یا موجودیت(instance ) برای آن lifetime(زمان) را شناسایی می کند و این کار را ادامه می دهد تا اینکه تاچ (لمس) stop کند(متوقف شود) با این امکان می توان برای تخیص تاچ های یکسان در فریم های مختلف استفاده کرد.

با استفاده از touch.position می تونیم مختصات ناحیه ی لمس شده روی screen(صفحه) رو تشخیص بدیم.

نکته بسیار مهم : یادتون باشه،مبداء  بردار لمسی در پایین ترین گوشه ی سمت چپ صفحه می باشد.

متد دیگه برای تشخیص تاچ ها ، Input.touches است که یک لیست از ابجکت های لمس شده ی صفحه رو به ما میده.

با اینکه متد اول باید استفاده شود  همانند Input.touches متغیرهای موقت و ممکن است کارایی بازی را کاهش دهند.

داده های ورودی ، دقیقا قبل ار تابع Update()،  در هر فریم  refresh می شوند.

به طوری که در آن شما باید تمام کدهای لازم مدیریت ورودی(input-management logic)را در آن قرار دهید.

انجام این کار اگر در تابع FixedUpdate انجام بشه،جلوی catching (یا خطایابی) داده های ورودی کاربر رو از ما می گیره.زیرا FixedUpdate  اگرچه در گام های مختلف ولی در هر فریم از زمان اجرا نمیشه.

Touch Phases(فاز های لمسی)

در کد زیر با استفاده از خصوصیت phase شروع و پایان و لحظه ی تاچ را تشخیص می دهیم :

void Update ()
        {
           int nbTouches = Input.touchCount;

           if(nbTouches > 0)
           {
              for (int i = 0; i < nbTouches; i++)
              {
                 Touch touch = Input.GetTouch(i);

                 TouchPhase phase = touch.phase;

                 switch(phase)
                 {
                    case TouchPhase.Began:
                       print("New touch detected at position " + touch.position + " , index " + touch.fingerId);
                       break;
                    case TouchPhase.Moved:
                       print("Touch index " + touch.fingerId + " has moved by " + touch.deltaPosition);
                       break;
                    case TouchPhase.Stationary:
                       print("Touch index " + touch.fingerId + " is stationary at position " + touch.position);
                       break;
                    case TouchPhase.Ended:
                       print("Touch index " + touch.fingerId + " ended at position " + touch.position);
                       break;
                    case TouchPhase.Canceled:
                       print("Touch index " + touch.fingerId + " cancelled");
                        break;
                    }
                }
           }
        }


زمانی که کاربر در کشیدن انگشت خود(swipping) بر روی صفحه نمایش است،ما به جای موقعیت واقعی،تغییرات دلتای موقعیت(position) را دنبال می کنیم.این برای زمانی مفید است که عمل درگ(Drag=کشیدن و انداختن چیزی با ماوس یا لمس)را انجام می دهیم.


سپس با استفاده از deltaTime سرعت حرکت touch input رو محاسبه می کنیم :


float touchSpeed = touch.deltaPosition.magnitude / touch.deltaTime;

اگه اشتباهی رخ بده تاچ کنسل(cancel) می شه.به عنوان مثال هنگامی که یک منطقه بزرگ در برابر صفحه نمایش فشرده یا تاچ های بیش از آنچه دستگاه ساپورت می کنه انجام بشه.

برای تشخیص موقعیت شروع لمس صفحه توسط کاربر از "Began" استفاده می کنیم.سپس می تونیم یک ray(اشعه) رو از موقعیت ورودی با اتفاده از دوربین،cast(پرتاب) و با استفاده از Raycast collision اشیایی رو که در امتداد اشعه هستند چک کنیم.
void Update ()
            {
                int nbTouches = Input.touchCount;

                if(nbTouches > 0)
                {
                    for (int i = 0; i < nbTouches; i++)
                    {
                        Touch touch = Input.GetTouch(i);

                        if(touch.phase == TouchPhase.Began)
                        {
                            Ray screenRay = Camera.main.ScreenPointToRay(touch.position);

                            RaycastHit hit;
                            if (Physics.Raycast(screenRay, out hit))
                            {
                    print("User tapped on game object " + hit.collider.gameObject.name);
                                handleTap(hit.collider.gameObject);
                            }
                        }

                    }
                }
        }

در بعضی مواقع می خوایم دوبار لمس سریع کاربر رو بررسی کنیم.برای مثال یه وقتی می خوایم وقتی کاربر با انگشت به صفحه ضربه(tap) زد Player راه بره و اگه دوبار سریع ضربه زد(double tap) کاراکتر Player با سرعت راه بره.
void Update ()
            {
                int nbTouches = Input.touchCount;

                if(nbTouches > 0)
                {
                    for (int i = 0; i < nbTouches; i++)
                    {
                        Touch touch = Input.GetTouch(i);

                        if(touch.phase == TouchPhase.Began)
                        {
                            if(touch.tapCount >= 2)
                            {
                                Run();
                            }
                            else
                            {
                                Walk();
                            }
                        }

                    }
                }
                else
                {
                    StopMoving();
                }
        }

وقتی touch ما Begin می کنه(وقتی لمس آغاز میشه)، player با تک ضرب انگشت حرکت و با چند ضرب شروع به دویدن می کنه.
اگه هم هیچ تاچ یا لمسی صورت نگیره game character متوقف می شه.
زمانیکه متدهای مختلف مثل Walk را اجرا می کنیم شما همچنین بررسی می کنید کاربر در حال حاضر در حال راه رفتن است یا خیر.

نکته: بعضی اوقات unity نمی تونه لمس های سریع رو درست تشخیص بده.(سعی کنید یادتون باشه)

موافقین ۰ مخالفین ۰ ۹۴/۰۳/۳۰
مدیرکل

نظرات (۱۶)

ممنون از توضیحاتتون از صد تا ویدئو در این مورد رساتر و واضح تر بود بود
پاسخ:
سپاس.خیر پیش عزیزم.
خیلی کامل بود . برای ما که طول می کشه فیلم دانلود شه عالی بود. از صد تا ویدئو در این مورد رساتر و واضح تر بود

پاسخ:
ممنون. اگه میشه دوستان بگید چه استفاده ای از آموزش ها کردین و چه چیزهایی ساختید.
خیلی عالی بود... دمت گرم
پاسخ:
ممنون.
۱۷ دی ۹۴ ، ۰۳:۵۹ محمد مهدی
سلام. بد نبود ولی باید کاملتر توضیح میدادین. قبل از آموزش شما چن تا نمونه کد از خود راهنمایی یونیتی دیده بودم. آموزش شما در حد همون بود و به مباحث حرفه ای ترش نپرداخته بودین. اما خیلی عالیه که این آموزش رو گذاشتین. واقعا خیلیا نیاز دارند. امیدوارم آموزش های خوبتون رو ادامه بدین!
الآن من خودم چند روزه درگیر یه پروژه جدیدم(پیشرفته ترین کد یونیتی که تا حالا زدم) و هنوز تو یونیتی حرفه ای نشدم. هدفم شبیه سازی فیزیک انگری بردز بود(دو بعدی). اتفاقا امروز نسخه اندروید تونستم در بیارم. خیلی سادست: یه جسم پرتاب شونده رو میگیری، میکشی عقب، رها میکنی و بعد، جسم، در جهت مخالف، سرعت میگیره(در ایکس و ایگرگ).
راستی در قطعه کد سومی که نوشتین فکر نکنم نیاز به سوئیچ باشه. در خود راهنمای آفلاین یونیتی همین کد سوئیچ رو نوشته بود که حلقه هم نداشت. من خودم تستش هم کردم و مشکلی نداشت. متغیرشم این میشه:
Touch touch = Input.GetTouch(0)
نوع متغیر هم میتونه var باشه به جای Touch
بهرحال موفق باشین!
پاسخ:
ممنون.خودم این آموزش رو قبول ندارم. چون در یونیتی 5 به بعد روش های بهتر جایگزین شده. در صورت امکان سعی کنید مطالب به روز رو مطالعه بفرمایید.موفق باشید و ممنون.
۲۸ اسفند ۹۴ ، ۲۲:۲۹ امیر عسکری
سلام
تشکر بابت این وبلاگ خوبتون
خیلی بهم داره کمک میکنه و راهنماییم میکنه. 
چون هیچی از بازی سازی سر در نمیآوردم.
تشکر واقعا

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

پاسخ:
سلام برای زوم باید یک متغیر از نوع GameObject تعریف کنید که public باشه مثال :

 public GameObject mainCam;

بعدش دوربین رو بکشید روش رها کنید.

بعد از طریق کد متغیر z از پوزیشن دوربین رو تغییر بدید چون z مربوط به جلو و عقب هست اگه z رو زیاد کنید زوم میشه و اگه کم کنید دور میشه دوربین.

مثال. کد زوم کردن دوربین با فشردن کلید A و S:


void Update(){
        if (Input.GetKey (KeyCode.A)) {
            mainCam.transform.position+=new Vector3(1,0,0);
        }
        if (Input.GetKey (KeyCode.S)) {
            mainCam.transform.position-=new Vector3(1,0,0);
        }
    }


ممنون از جوابت :)
اگه برای تاچ بگم بتونه زوم کنه چیکار کنم ممنون میشم جواب بدید😘
خیلی ممنون از راهنمایت

پاسخ:
سپاس
سلام ببخشید من چند وقته دارم دنبال پکیج chararcter system میکردم اما هیچ جا پیدا نکردم اگه میشه لینک دانلود رو بهم بدی ممنون میشم خیلی لنگم:(
سلام.ممنون میشم بیشتر در مورد   ray ,raycasthit وشرطif (Physics.Raycast(screenRay, out hit)
صحبت کنید....
پاسخ:
سلام
در مورد raycast اینو ببینید:
http://gameover.blog.ir/1394/08/18/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-raycast-%D8%AF%D8%B1-%DB%8C%D9%88%D9%86%DB%8C%D8%AA%DB%8C

بقیه هم تو help یونیتی برید زیر منوی scripting reference
سلام وقتتون بخیر ببخشید زبان این اسکریپت ها سی شارپ هست  یا نه 
پاسخ:
سلام بلی
سلام
من خیلی تازه کارم 
به همین دلیل میخوام بپرسم که 
کد تاچ رو کجا وارد کنم
اگه میشه برام ایمیل کنید
پاسخ:
بیا تو گروه یونیتی تلگرام ما. وقت نیست ج بدم اینجا.
سلام من دنبال اموزش تاچ دو بعدی هستم میخام یه بازی بسازم مثل angry birds
ممنون میشم راهنمایی بفرمایید
سلام من میخوام یه دکمه رو با درگ جابجا کنم باید محتصاتشو چطور عوض کنم که با تاچ حرکت کنه؟
پاسخ:
سلام
از اینجا ایده درگ دکمه یا همون یو آی رو بگیر :

https://goo.gl/6Ayvky
من میخوام یک دکمه توی صفحه ایجاد کنم که نقش دکمه w کیبورد رو داشته باشه
باید چه کدی بدم؟
پاسخ:
بیا گروه تلگرام
توی @gameoverblog می گیم
اومدم کانال چیزی نبود.
پاسخ:
بیا گروه

ارسال نظر

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