کانال بازی سازی تلگرام
آموزش تاچ در یونیتی/آموزش کلاس Input و تشخیص لمس یا Touch در unity :: آموزش ساخت بازی اندروید+پکیج های تخصصی

آموزش ساخت بازی اندروید+پکیج های تخصصی

در گیم اور، همیشه حق با مشتری است و در صورت نارضایی با هم به توافق می رسیم.
--
تمام اعمالی که انجام می دهیم، حتی اگر ذره ای و مثقالی باشد، به خودمان باز می گردد و بازتابش آنها را در زندگی خواهیم دید. زلزال ۷
او کسی است که (روح) شما را در شب (به هنگام خواب) میگیرد; و از آنچه در روز کرده ‏اید، با خبر است; سپس در روز شما را (از خواب) برمیانگیزد; و (این وضع همچنان ادامه مییابد) تا سرآمد معینی فرا رسد; سپس بازگشت شما به سوی اوست; و سپس شما را از آنچه عمل میکردید، با خبر میسازد. انعام ۶۰
دلها به یاد خدا آرام میگیرد. رعد آیه ۲۷
بدانید زندگی دنیا تنها بازی و سرگرمی، و تجمل پرستی و تفاخر در میان شما و افزون طلبی در اموال و فرزندان است . حدید آیه ۲۰
آن خدایی که آدمی را از خون بسته (که تحول نطفه است) بیافرید.
بخوان و (بدان که) پروردگار تو کریم‌ترین کریمان عالم است.
آن خدایی که بشر را علم نوشتن به قلم آموخت.
به آدمی آنچه را که نمی‌دانست تعلیم داد.
راستی که انسان سرکش و مغرور می‌شود.
چون که خود را در غنا و دارایی ببیند. علق ۲- ۷
این زندگانی چند روزه دنیا افسوس و بازیچه‌ای بیش نیست، عنکبوت ۶۴
در روی زمین به تکبر راه مرو که نمی توانی زمین را بشکافی و هرگز قامتت به بلندای کوهها نمی رسد. اسراء ۳۷
در آنچه خداوند بر تو بخشیده است، سرای آخرت را بجوی و سهم خود را از دنیا فراموش مکن و همانگونه که خدا به تو نیکی کرده است نیکی کن و هرگز فساد در زمین منما که خدا مفسدان را دوست ندارد. قصص ۷۷
و هرگاه نعمت و رحمتی به انسان بچشانیم و سپس آن را از او برگیریم او مأیوس و نومید میشود و به کفران و ناسپاسی بر میخیزد. هود ۹
بندگان مرا آگاه ساز که من بسیار آمرزنده و مهربانم. حجر ۴۹
از رحمت خدا نا امید مباشید که جز کافر هیچ کس از رحمت خدا نا امید نیست. یوسف ۸۷
پس به یاد من باشید تا به یاد شما باشم. بقره ۱۵۲
زندگانی دنیا چیزی جز متاع فریبنده نیست . آل عمران ۱۸۵
از آنچه به شما روزی داده ایم پیش از آنکه روزی فرا رسد که نه معامله ای وجود دارد و نه دوستی و شفاعت ، انفاق کنید. بقره ٢۴۵
بسا چیزی را ناخوش داشته باشید که آن به سود شماست و بسا چیزی را دوست داشته باشید که به زیان شماست، و خدا میداند و شما نمیدانید. بقره ۲۱۶
ما آیات (خود) را برای شما بیان کردیم شاید اندیشه کنید...حدید ۱۷

پیوندهای روزانه
پیوندها

برای اینکار از کلاس 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
سلام وقتتون بخیر ببخشید زبان این اسکریپت ها سی شارپ هست  یا نه 
پاسخ:
سلام بلی

ارسال نظر

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