نمایش نتایج: از 1 به 3 از 3

موضوع: مشکل ساخت آبجکت در صورت نبود حرکت روی آبجکن دیگر

  1. Top | #1

    عنوان کاربر
    تاریخ عضویت
    Jul 2012
    شماره عضویت
    1286
    نوشته ها
    17
    تشکر
    33
    تشکر شده 8 بار در 5 ارسال

    Soal مشکل ساخت آبجکت در صورت نبود حرکت روی آبجکن دیگر

    سلام و خسته نباشید به دوستان

    مشکلی داشتم با عملکرد یه سری کد
    عمل می کنه منتها بعضی مواقع درست عمل نمیکنه
    تصور کنید وقتی یه آبجکتی رو شلیک میکنید یه آبجکتی destroy میشه و بعد از این که آبجکت ایستاد دوباره اون آبجکتی که Destroy شده بود رو دوباره بسازه
    درست عمل می کنه تا جایی که بعضی مواقع بعد از این که آبجکت رو destroy کرد پشت سرش دوباره می سازتش و صبر نمی کنه آیتم بایسته
    این کد روی آبجکتی که پاک میشه هست



    void FireTheShoot()
    {
    GetDirection = transform.position - MainBall.transform.position;

    Rigidbody RBMainBall = MainBall.GetComponent<Rigidbody>();

    GameObject.Find("Base Control").GetComponent<StartSetting>().SaveDirection = GetDirection;
    RBMainBall.AddForce(transform.forward*SpeedTackle);

    MainBall.GetComponent<MainBall>().TackleShoot = true;
    Destroy(gameObject);

    }


    این کد روی آبجکتی که حرکت می کنه هست




    if (RBSelf.velocity == Vector3.zero
    && RBSelf.angularVelocity == Vector3.zero
    && GameObject.Find("Stick(Clone)") == null )
    {
    Instantiate(Stick);
    }



    مشکل دیگه ای هم هست که GetDirection باید فاصله بین دو آبجکت رو ذخیره کنه که وقتی آیتم دوباره ساخته شد اون رو اجرا کنه که مکان مورد نظر بره که در کدام طرف آبجکت باشه اما بعضی مواقع مخصوصا محور X رو 0 تحویل می گیره بعضی مواقع همه رو 0 می گیره یا بعضی مواقع اشتباه میشه.



    ممنون
    ویرایش توسط darkjoker : 11-16-2019 در ساعت 12:12 AM

  2. Top | #2

    عنوان کاربر
    تاریخ عضویت
    Feb 2017
    شماره عضویت
    8076
    نوشته ها
    129
    تشکر
    3
    تشکر شده 79 بار در 63 ارسال
    اینترنت قطعه، منم حوصلم سر رفته
    در مورد سوال اول،

    توضیح کامل:

    توی Unity به دلیل اینکه از هر Object دو تا ساخته میشه، یکی توی لایه C# و دیگری توی لایه C++ و وقتی بازی رو اجرا می کنید به صورت Runtime یونیتی به وسیله Mono کد های C# رو به C++ تبدیل می کنه، خیلی از دستورات اونجوری که فکر می کنید در لحظه اتفاق نمی افته. یکی از اون دستورات Destroy هست. Object همون لحظه که Destroy صدا زده میشه پاک نمیشه! ممکنه چند فریم طول بکشه. بنابراین ممکنه GameObject.Find مقدار اون Object رو Null برگردونه چون ممکنه اسمش عوض شده باشه و دیگه Stick(Clone) نباشه، ولی هنوز Object از لایه C# پاک نشده چون منتظر Garbage Collector هست. به خاطر همین کد شما ممکنه حتی روی Device های مختلف جواب های مختلف داشته باشه. این توضیح رو دادم که اگر مشتاق بودی بدونی چرا دقیقا کد کار نمی کنه.

    توضیح مختصر :
    اگر از Destroy استفاده می کنی دیگه چک کردن اینکه آیا اون Object پاک شده یا نه رو با GameObject.Find انجام نده، چون جواب درستی بهت نمیده (به دلایل داخلی انجین یونیتی)

    نکته دیگه هم اینه که GameObject.Find هم خیلی متد سنگینیه. اون هم ممکنه توی همون فریم که آبجکت رو پاک کردی بهت جواب نده بنابراین ترتیب کد هات بهم میخوره. سعی کن اصلا Find استفاده نکنی یا فقط توی Awake یا Start یک بار استفاده کنی. همیشه Reference بگیر و ذخیره کن.
    چند تا راه حل به ذهنم میرسه. بهترینش که استفاده از Callback هست اگر با Action یا Event کار کردی. اگر نه میتونی همین کد رو به جای Destroy کردن خاموشش کنی.


    void FireTheShoot()
    {
    GetDirection = transform.position - MainBall.transform.position;

    Rigidbody RBMainBall = MainBall.GetComponent<Rigidbody>();

    GameObject.Find("Base Control").GetComponent<StartSetting>().SaveDirection = GetDirection;
    RBMainBall.AddForce(transform.forward*SpeedTackle);

    MainBall.GetComponent<MainBall>().TackleShoot = true;
    gameObject.SetActive(false);

    }


    بعد توی Script دیگه به جای null بودن میای Active بودنشو چک می کنی. نمیدونم کدت چجوریه آیا میتونی به آبجکت دسترسی داشته باشی که GameObject.Find رو حذف کنی یا نه. اگر میتونی حتما Find رو حذف کن Reference ذخیره کن.


    if (RBSelf.velocity == Vector3.zero
    && RBSelf.angularVelocity == Vector3.zero
    && GameObject.Find("Stick(Clone)").active == false )
    {
    Instantiate(Stick);
    }


    در مورد سوال دومت نمی تونم چیز دقیقی بگم چون تنها خط کدی که دادی درسته. دو تا Vector رو از هم کم کردی باید بردار جهت رو بهت بده. یا Breakpoint بذار اگر بلدی یا اگر Breakpoint کار نکردی هر جا که میتونی Debug.Log قرار بده ببین کجا مقادیرت اشتباه میشه.

  3. کاربر زیر به خاطر ارسال مفید Jinjer از ایشان تشکر کرده است:

    darkjoker (11-26-2019)

  4. Top | #3

    عنوان کاربر
    تاریخ عضویت
    Jul 2012
    شماره عضویت
    1286
    نوشته ها
    17
    تشکر
    33
    تشکر شده 8 بار در 5 ارسال
    سلام و خسته نباشید

    وقتی اینترنت قطع بود برای من این سایتم بالا نمیومد

    دستتون درد نکنه توضیحتون بسیار کامل و دقیق بود.
    مشکل رو با اضافه کردن delay حل کرده بودم و دلیل مشکل رو نمی دونستم اما اصلا راه حل مناسبی نیست و مثلا من می خواستم کار تمیز تر در بیاد با پاک کردن آبجکت بدتر داشتم سنگین تر میکردمش می تونم اصلا آبجکت ها رو پاک نکنم و فقط unactive کنم
    پس تا می تونم همه GameObject.Find ها رو حذف می کنم و نهایتا داخل awake میزارم
    تبدیلش کردم به set active اما باز مشکل داشت . کد get و set برای GetDirection رو به fixedupdate بردم که همیشه محاسبه بشه به جای این که یک بار محاسبه کنه. اینطوری درست شد
    ویرایش توسط darkjoker : 12-02-2019 در ساعت 07:43 PM

اطلاعات موضوع

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

در حال حاضر 1 کاربر در حال مشاهده این موضوع است. (0 کاربران و 1 مهمان ها)

بازدید کنندگانی که با جست و جو این صفحه را مشاهده کرده اند:

Nobody landed on this page from a search engine, yet!

کلمات کلیدی این موضوع

مجوز های ارسال و ویرایش

  • شما نمیتوانید موضوع جدیدی ارسال کنید
  • شما امکان ارسال پاسخ را ندارید
  • شما نمیتوانید فایل پیوست کنید.
  • شما نمیتوانید پست های خود را ویرایش کنید
  •