Unconfigured Ad Widget

تقليص

إعـــــــلان

تقليص
لا يوجد إعلان حتى الآن.

مشكله سكربت في Unity .... لمبرمجين جافا سكربت

تقليص
X
 
  • تصفية - فلترة
  • الوقت
  • عرض
إلغاء تحديد الكل
مشاركات جديدة

  • مشكله سكربت في Unity .... لمبرمجين جافا سكربت

    السلام عليكم ورحمه الله وبركاته

    اولا : صلو على نبينا وحبيبنا محمد صلى الله عليه وسلم


    حبايبي اعضاء المنتدى انا اتعلم على محرك UDK وقررت في نفس الوقت اسوي لعبه على اليونتي واطور مستواي في كلا المحركين

    على العموم واجهتني مشكله ( سكربت ) في لعبتي الي اعمل عليها


    المشكله اني الاعب اذا جا نقطه طلع الوحش ويطلع معا صوت مخيف .... والصوت خلاص يختفي

    لاكن المشكله ان الصوت كل ما الاعب يمر بالنقطه الي يطلع فيها الوحش الصوت يرجع يطلع .... ولاكن الوحش مايطلع

    اريد الصوت معد يتكرر

    هذا السكربت الي كتبته

    function OnTriggerEnter(other: Collider){ if (!audio.isPlaying){ audio.Play();

    Destroy.sound();
    }
    }

    ولاحضو كاتب Destroy.audio يعني مفروض الصوت معد يرجع


    ... هل عندي خطأ في السكربت او ماذا ؟

    اتمنى مساعدتكم الله يجزاكم خير

  • #2
    جرب عمل متغير boolean واعطه قيمة من داخل if.
    لا اعرف ان كان الكود صحيح لاني لا اعرف لغة جافا سكربت
    كود:
     
    function OnTriggerEnter(other: Collider){ if (!audio.isPlaying && audioIsPlayed == false){ 
    audioIsPlayed = true;
    audio.Play();
    Destroy.sound();
    }

    تعليق


    • #3
      اعتقد ان
      Destroy.sound();
      ليست بالطريقة الصحيحة لمسح الاشياء فيجب وضع الشيئ المراد مسحه وسط القوسين
      Destroy(gameobject);

      تعليق


      • #4
        ممكن تربط الصوت مع الوحش مباشرة, وتخلي الصوت يبدأ مباشرة عند الإنشاء (طبعا إنشاء الوحش اللي الصوت مربوط فيه),

        وبالتالي الصوت ما رح يشتغل غير مرة واحدة فقط مع أول نشأة للوحش, ويتوقف عن العمل نهائيا بعدها (إلا إذا أعدت استدعاءه),

        وبس


        تعليق


        • #5
          أساسا انت واضع في الكود ادا ما لم يكن صوت شغال سيشتغل تلقائي وبهدا عندما ينتهي الصوت يشتغل مرة اخرى وهكدا ( (!audio.isPlaying))

          كما انك لم تضع متغير يوضح ان الوحش ضهر ام لا ليتم اشتغال الصوت
          انا لا اعرف البرمجة بجافا لاكن بسي بلاس يجب يكون متل هدا :

          كود:
          function OnTriggerEnter(other: Collider)
          { 
          	if(zombi_visible == true)
          	{
          		if (!audio.isPlaying && audioIsPlayed == false)
          		{ 
          			audioIsPlayed = true;
          			audio.Play();
          			Destroy.sound();
          		}  	
          	}
          
          }

          تعليق


          • #6
            اه لم الحظ انك واضع متغير audioIsPlayed
            حاول تشوف هل هدا المتغير موجود في مكان ما في سكربت يساوي true ام لا لانه ادا كان كدالك فهدا يلغي مهمته في عدم تشغيل صوت مرة اخرى.

            تعليق


            • #7
              كل الحلول ال مكتوبه لم تنفع ...... مدري وش الحل

              تعليق


              • #8
                أخي الكريم مُستحيل ما يمشي الحال,
                هنالك أكثر من طريقة لتنفيذ الذي تريد, سأشرح منها طريقتان متشابهتان,


                قبل ذلك, لاحظ الخياران التاليان ضمن خيارات عنصر الصوت في اليونيتي :
                Play On Awake: بتفعيل هذا الخيار, فإن الصوت هذا سيعمل بمجرد ظهوره (أو ظهور العنصر المُرتبط به) على ساحة اللعب,
                Loop: بتفعيل هذا الخيار, فإن الصوت سيستمر في التكرار, فحين ينتهي, سيعود ويعمل من جديد,


                الآن لنعد إلى سؤالك, سأشرح بحديث عادي, وحوله إلى لغة البرمجة التي تريد :


                الطريقة الأولى :
                -------------------------
                1. إربط الصوت بالوحش (عن طريق سحب الصوت وإفلاته على الوحش أو إضافته بشكل يدوي كعنصر صوتي),
                2. في خصائص العنصر الصوتي الذي أضفته, فعل خيار (Play On Awake), وألغ تفعيل الخيار (Loop),
                3. الآن احفظ الوحش كما هو كـ Prefab, بحيث يكون جاهز لاستدعائه إلى ساحة اللعبة في أي وقت,
                4. أنشئ ملف برمجي جديد باللغة التي تريد,
                5. قم بتعريف متغير جديد من نوع Bool, بأي اسم تريد (FirstPass مثلا), (فائدته هي التأكد إن كان اللاعب قد مرّ من قبل ضمن النقطة المطلوبة أو لا)
                6. حين وصول اللاعب إلى النقطة التي تريدها, قم باختبار المتغير الذي عرفته في النقطة السابقة كالتالي :
                إذا كان يساوي لا: لا تفعل أي شيء,
                إذا كان يساوي نعم: أنشئ الوحش (الصوت سيعمل تلقائيا عند إنشاء الوحش بسبب خيار (Play On Awake)), وقم بتغير المتغير إلى لا,

                الآن عند مرور اللاعب مرة أخرى ضمن هذه النقطة, سيختبر المتغير, فسيجد أنه يساوي (لا), وبالتالي لن يفعل أي شيء,,,




                الطريقة الثانية :
                -------------------------
                كما في الطريقة السابقة,
                اسحب الصوت إلى أي عنصر في اللعبه, وألغ تفعيل الخياران : Play On Awake و Loop
                4. أنشئ ملف برمجي جديد باللغة التي تريد,
                5. عرف العنصر الذي قمت بوضع الصوت عليه,
                5. قم بتعريف متغير جديد من نوع Bool, بأي اسم تريد (FirstPass مثلا), (فائدته هي التأكد إن كان اللاعب قد مرّ من قبل ضمن النقطة المطلوبة أو لا)
                6. حين وصول اللاعب إلى النقطة التي تريدها, قم باختبار المتغير الذي عرفته في النقطة السابقة كالتالي :
                إذا كان يساوي لا: لا تفعل أي شيء,
                إذا كان يساوي نعم: أنشئ الوحش, شغل الصوت المطلوب والموضوع على عنصر اللعبة, وقم بتغير المتغير إلى لا,

                الآن عند مرور اللاعب مرة أخرى ضمن هذه النقطة, سيختبر المتغير, فسيجد أنه يساوي (لا), وبالتالي لن يفعل أي شيء,,,


                تعليق


                • #9
                  ولكي تتمكن من فهم المشكلة السابقة التي واجهتك, سأقوم بشرح الخطأ في السكريت السابق الذي كتبته :

                  الوظيفة (OnTriggerEnter) التي قمت باستخدامها في السكربت الخاص بك لا تُستدعى من قبل محرك اليونيتي وتُنفذ إلا في إطار (Frame) واحد, وهو الإطار الذي يبدأ به اصطدام اللاعب بالعنصر الآخر, (فقط لحظة بدء الاصطدام !!!),,,
                  أما إن كنت تود استخدام وظيفة تُستدعى طالما أن هنالك اصطداما, فكان يجب عليك استخدام الوظيفة (OnTriggerStay),,,
                  وأيضا هنالك الوظيفة (OnTriggerExit), والتي تُستدعى فقط عند آخر إطار من عملية الاصطدام,,,,


                  وبكل الأحوال,
                  في حالتك السابقة, الأفضل لك هو استخدام الوظيفة (Update), لأنها تستمر بالتنفيذ دائما, وبالتالي ستضمن تدمير الصوت والتخلص منه بجميع الأحوال, سواء كان اللاعب مصطدما بالعنصر الآخر أو لا,,

                  كما أن الوظيفة Update أخف في التنفيذ من الوظيفة OnTriggerEnter,


                  وأيضا أنت قمت باستدعاء الأمر الخاص بعملية التدمير بشكل خاطئ,,
                  من الممكن أن تراجع هذه الصفحة :
                  http://docs.unity3d.com/Documentatio...t.Destroy.html


                  وهنالك ملاحظة صغيرة ليست ذات أهمية في سؤالك هنا,
                  أنت قمت بتعريف المتغير Other من نوع Collider بين القوسان الذان بعد اسم الوظيفة, ولم تقم باستخدامهم في أمرك البرمجي, وبالتالي فقد زدت حجم الذاكرة المُستخدمة دون فائدة تُرجى,,,


                  أرجو أن أكون قد وُفقت في الإيضاح


                  تعليق

                  يعمل...
                  X