لرنینگ تی وی

طعم شیرین یادگیری

Pause Menu در یونیتی


تاریخ انتشار

تعداد نظرات

تعداد بازدید

زمان تقریبی مطالعه
۰۷/مهر/۱۳۹۲
۱۹۶۹ روز پیش
۱۹ دیدگاه ۲۰۳۷ ۱ دقیقه

pause menu in unity3dاللَّهُمَّ عَجِّلْ لِوَلِیِّکَ الْفَرَجَ وَ الْعَافِیَهَ وَ النَّصْروجعَلْنا مِنْ أَنْصَارِهِ وَ أَعْوَانِهِ وَ الْمُسْتَشْهَدِینَ بَیْنَ یَدَیْه

Pause Menu در یونیتی

با عرض سلام خدمت تمامی دوستان

امروز و در این مطلب می خواهیم به شما نحوه ایجاد یک Pause Menu در یونیتی  رو آموزش بدیم.

برای این کار روش های فراوانی شاید به ذهن کاربران خطور کند. ولی من روشی که به ذهن خودم خطور کرده رو براتون بیان می کنم.

ما می خواهیم یک منو ایجاد کنید که با زدن دکمه ی k نمایان شود و با دوباره فشاردادن دکمه ی k این منو ناپدید شود.

برای انجام این کار می توان از کد زیر استفاده نمود.

با اعمال این کد به یک شی در محیط بازی در واقع تونسته اید یک Pause Menu ایجاد کنید.

حالا اگه بخواهید وقتی منو ظاهر شد تمام اشیا بی حرکت باشند (مثل سایر بازی ها) کافیه اون متغیر n که در ابتدا تعریفش کردیم رو پاک کنید و در سایر قسمت ها به جای n==true بنویسیدtime.timeScale==1 و به جای n==false بنویسید time.timeScale==0

و الی آخر…

والسلام

سید

۱۹ نظر برای "Pause Menu در یونیتی"


  1. نوشته شده توسط  

    ببخشید آقا سید من این کدها رو نوشتم ولی باز هم درست نشد:(
    به جای تمام n ها time.timeScale نوشتم.
    خودتون امتحان کنید

    پاسخ

    پاسخ
    • نوشته شده توسط  

      من امتحان کردم درست بوده
      شما بدون time.timeScale ببین درست هست یا نه؟
      اگه درست بود اساس کار تو دستته دیگه ما بقیش کمی تغییر در کد ها است.
      در ضمن من نگفتم به جای n بزار time.timeScale بلکه گفتم به جای n==false بزار time.timeScale==0
      و الی آخر

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

      پاسخ پاسخ

  2. نوشته شده توسط  

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

    پاسخ

    پاسخ
    • نوشته شده توسط  

      این یه کد ساده برای نمایش یک منو هست برای این که همه چیز ثابت بشوند باید Scaletime رو روی صفر تنظیم کنید.

      با تشکر
      سید

      پاسخ پاسخ

  3. نوشته شده توسط  

    با سلام خدمت آقا سید
    مرسی از آموزشتون بسیار تشکر
    شاید این طریق واسه بعضی از بازیها مناسب باشه اما استفاده از Time.timeScale من که تو بازیم استفاده میکنم مشکلات فراوانی پیش میاد
    مثلا کدهایی که با Transform هستند اصلا Pause نمیشن و مشکل بعدی این که بعد از اینکه Time.timeScale رو از ۰ به ۱ رسوندی تا بازی Play بشه کدهایی که بر اساس نیرو نوشته شدند یکدفعه نیرو بسیار زیادی بهشون وارد میشه و در موارد زیادی از Collider ها رد میشن و محیط بازی پلیر بیرون میره و خلاصه اینکه به خوبی نقش Pause رو بازی نمیکنه و تو هر سایت خارجی و فارسی گشتم همه همین Time.timeScale رو معرفی کرده بودند. آیا شما روش دیگه دارین معرفی کنید؟
    یه روشی که مثل خود Pause ادیتور یونیتی باشه با این تفاوت که اعمال توی تابع OnGUI متوقف نشن تا بشه با منو کار کرد
    تو خود هلپ یونیتی به چنین دستوراتی برخوردم که مشکلش اینه که کل بازی رو Pause میکنه و دیگه هیچ کاری نمیشه کرد و باید از بازی بیرون بیای
    این دستورات
    EditorApplication.isPaused = true ;
    این دستور بالایی کلا بازی رو خیلی طبیعی مثل ادیتور خودش Pause میکنه و مشکلش اینه که دیگه هیچ کاری نمیشه کرد و باید از بازی بیرون بیای
    EditorApplication.isPlaying = false ;
    و این دستور بالایی هم کلا از بازی در میاد
    حالا شما میشه منو راهنمایی کنید باید چیکار کنم چون تو Pause بازی گیر کردم
    بسیار تشکر که این متن منو خوندید و تو راهنمایی و آموزش به هم وطناتون دریغ نمیکنید

    یا مهدی ادرکنی
    (منتظران ظهور)

    پاسخ

    پاسخ
    • نوشته شده توسط  

      سلام خدمت شما
      تا جایی که من می دونم نباید Time.timescale روی Gui تاثیر بزاره …. البته امتحان هم کردم مشکلی از این بابت نبود.
      در مورد این که می گید فیزیک به هم می خوره بهترین جوابی که خودمم فهمیدم اینه که اون اشیایی که فیزیک دارند در قسمت rigidbody گزینه ی Collision Detection شون رو روی Continues Dynamic قرار بدید مشکل حل میشه

      با تشکر
      سید

      پاسخ پاسخ

  4. نوشته شده توسط  

    مرسی از پاسخ سریعتون آقا سد گل، اما مشکل حل نشده
    من به نظرم روش های دیگه ایم باشه یعنی یونیتی به این گستردگی فقط همین روش رو واسه Pause کردن بازی ،که یکی از واجباب بازیه، داره؟ !!!
    هیچ متد چیزی نداره که فراخانی بشه که مثلا همه جایی بازیه استوپ بشه و فقط اون متد کار کنه یه چیز اینجوری این روشی که آموزش دادید بر حسب زمانه و اسکریپت هایی که Transform و Rotation نوشته شده رو اصلا استوپ نمیکنه
    آیا چیزی از این سر در نیاوردید؟
    EditorApplication.isPaused = true ;
    این کد بالا مثل ادیتور بازی عمل میکنه و به جایی که خودت دکمه Pause رو بزنی خودش میزنه
    اگه امکانش هست منو راهنمایی کنید
    با سپاس و درود فراوان

    بر محمد و آل محمد (صلوات)
    (منتظران ظهور)

    پاسخ

    پاسخ
  5. نوشته شده توسط  

    آقا سید بسیار تشکر راهشو پیدا کردم
    ما باید هم از طریق Time.timeScale زمان بازی رو نگه داریم و هم باید به آبجکت هایی که توی صحنه ما هستند و ریجدبادی و نیرو دارن بگیم که تیک isKinematic زده بشه و تیک useGravity هم واسه محکم کاری برداشته بشه و هم باید آبجکت هایی که تو کد Transform در حال تغییر بگیم وایسا یا بهتره بگم که Script هامون رو غیرفعال کنیم، چرا چون که در هنگام Pause کردن بازی وقتی ریجدبادی آبجکت ما از بین بره حتمی تو کد اسکریپتی که به اون آبجکت دادیم rigidbody رو صدا زدیم و اگه اسکریپت هامون رو غیرفعال نکنیم حتمی در هنگام بازی ارور میگیریم.
    خب با یه نگاه ساده میشه گفت که اه ه ه ه این همه کار واسه یه Pause ساده، آقا سید واقعا واسه هر آبجکتی بخوای این کارو بکنی خیلی پیچیده و کثیف میشه تو یکی از آموزش هاتون در مورد مردن کارکتور بود که نگاه کردم چیز خوبی رو که یاد گرفتم این بود که از یک آبجکت که کلی زیر مجموعه داشت و اون آبجکت های زیر مجموعش rigidbody داشتن بخاطر تمیز تر شدن و سریع تر شدن کار شما یه آبجکت از نو Component آرایه ایی تعریف کردین و از طریق متد GetComponentsInChildren تمام ریجدبادی های زیر مجموعه اون آبجکت رو تو متغییر آرایه ایی Component گذاشتین و از اون طریق تیک isKinematic تمام زیر مجموعه رو زدید و برداشتید حالا منم واسه Pause کردن بازی میخوام همین کارو بکنم فقط با این تفاوت که شما گفتید زیر مجموعه آبجکت مورد نظر رو سرچ کن و من میخوام بگم کل آبجکت های داخل Hierarchy یعنی کل آبجکت های توی صحنه رو سرچ کن و هر کدوم که ریجد بادی دارن رو تو لیست آرایه ایی متغیر Component بذاره، یا اینجوری هم میشه گفت که یه آبجکت خالی تو صحنه داشته باشیم که وقتی بازی پلی شد تمام آبجکت های توی صحنه بریزن توی اون آبجکت موردنظر البته به صورت دسنی هم میشه این کارو کرد اما اصلا استاندارد نیست چون آدم در حال ساخت بازی روزی هزارتا آبجکت میسازه و حذف میکنه و کلا راه استانداردی نیست
    ببخشید که سرتون رو در اوردم از دست من کلافه شدید !!!
    حالا شما آقا سید بگید چگونه می توان بجای اینکه از متد GetComponentsInChildren بگیم آبجت های زیر مجموعه این آبجکت رو سرچ کن بگبم که آبجت های توی صحنه رو سرچ کن یا اگه این راه امکان پذیر نیست چگونه می توان بعد از پلی بازی کل آبجکت های توی صحنه رو زیر مجموعه یک آبجت دیگر کرد؟

    بسیار تشکر از پایگاه تخصصیتون
    یا حق
    خجسته باد میلاد با سعادت حضرت حسین بن علی (ع) و امام سجاد ، زین العابدین (ع) و حضرت ابوالفضل العباس (ع)
    و تا ۱۵ شعبان خجسته باد میلاد فرخنده منجی عالم بشریت حضرت مهدی موعود امام زمان (عجل الله تعالی فرجه شریف)
    یا صاحب الزمان
    (منتظران ظهور)

    پاسخ

    پاسخ
    • نوشته شده توسط  

      اون روشی که من گفتم رو استفاده کردید؟؟؟؟

      فکر کنم با استفاده از تگ ها و لایه ها بشه این کار رو کرد ولی مطمئن نیستم امتحان کنید.

      با تشکر
      سید

      پاسخ پاسخ

  6. نوشته شده توسط  

    سلام و صبح بخیر سید جان
    اون روشی که گفته بودید Collision Detection و Continues Dynamic اصلا هیچ تاثیری نداشت فکر نکم اصلا ربطی به این داشته باشه از همون روش هایی که گفتم استفاده کردم الان مشکل رو کاملا حل کردم همین سوال آخریه هم که پرسیدم جوابش رو پیدا کردم
    برای pause کردن باید بجز اینکه Time.timeScale = 0 کنیم باید تمام آبجکت هایی که تو صحنه داریم و ریجدبادی دارن و ریجدبادی اونا نیرو دارن و نیرویی وارد میکنند تیک isKinematic رو بزنیم تا مثل یه جسم ساکن بشه، در کل فقط آبجکت هایی که ریجدبادی دارن و نیرو وارد میکنند با مشکل Pause و Play میشن. حالا اگه تو کد بخوای هزارتا آبجکت بسازی و تیک isKinematic رو فعال یا غیر فعال کنی کار اشتباهی هست پس میای یه متغییر آرایه ایی از کلاس Rigidbody میسازی
    var GroupRigid : Rigidbody[] ;
    و بعد برای اینکه هرچی آبجکت که تو صحنه ریجدبادی دارن بیان به متغییر وصل بشن باید از این متد استفاده کنیم
    GroupRigid = FindObjectsOfType(Rigidbody);
    و بعد تو تابع آپدیت میای یه حلقه تکرار for تعریف میکنی و یه متغییر ریجدبادی توش میسازی و میریزیش توی متغییر ریجید بادی قبلی و بعدشم با دستور خاصی تیک isKinematic میزاری و برمیداری

    for ( var MyRigid : Rigidbody in GroupRigid ){

    if ( Input.GetKeyDown(“e”)){
    Time.timeScale = 0;
    MyRigid.isKinematic = true;
    }
    if ( Input.GetKeyDown(“r”)){
    Time.timeScale = 1 ;
    MyRigid.isKinematic = false;
    }

    }

    حالا وقتی کلید e رو میزنی کل آبجکت های تو صحنه که ریجدبادی دارن تیک isKinematic خورده میشه

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

    (منتظران ظهور)

    پاسخ

    پاسخ
    • نوشته شده توسط  

      من اونو انجام دادم جواب داد ها ….

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

      با تشکر
      سید

      پاسخ پاسخ

  7. نوشته شده توسط  

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

    (منتظران ظهور)

    پاسخ

    پاسخ
    • نوشته شده توسط  

      واقعا ممنون

      با تشکر
      سید

      پاسخ پاسخ

  8. نوشته شده توسط  

    خسته نباشید آقا سید
    به ایمیلتون فرستادمش

    (منتظران ظهور)

    پاسخ

    پاسخ
    • نوشته شده توسط  

      باشه امشب میزارم توی سایت.

      ممنون از شما

      اگه می شد یه توضیح هم در مورد کدهاتون بدید عالی می شد.

      با تشکر
      سید

      پاسخ پاسخ

  9. نوشته شده توسط  

    سلام باشه فردا یه توضیح در مورد کدهاش میدم

    (منتظران ظهور)

    پاسخ

    پاسخ
    • نوشته شده توسط  

      ممنون

      با تشکر
      سید

      پاسخ پاسخ

  10. نوشته شده توسط  

    سلام
    یه توضیح مختصر به ایمیلتون فرستادم

    (منتظران ظهور)

    پاسخ

    پاسخ
  11. نوشته شده توسط  

    میشه لفا اموزش pasue رو با ui بزارید ممنون

    پاسخ

    پاسخ

ارسال دیدگاه

نام (*)
پست الکترونیکی (*)
وبسایت