موضوع: ربط var بـgameobject

ردود: 5 | زيارات: 2352
  1. #1

    Question ربط var بـgameobject

    السلام عليكم

    لدي مشكلة في هذا الكود وهي أني أريد ربط فار بـ قام أوبجكت
    عن طريق أستخدام تاقس tags
    هذا رابط السيكربت
    http://pastebin.com/BE6GAUiW
    ضد الإنقلاب
    اللهم أحفظ مصر و أهلها


  2. #2
    عضو نشيط
    تاريخ التسجيل
    Jan 2011
    المنطقة
    سوريا
    العمر
    24
    ردود
    561
    صراحة لم افهم تماما ما تريد فشرحك غير واضح ولكن لدي بعض التعليقات والتخمينات.

    كود:
    public e_script[] _enemy;
    -في البداية ارى ان لديك مصفوفة سي شارب Array باسم _enemy لا اعرف ولكن واضح بأنك تريد ان تضع فيها جميع الاعداء او بالاحرى جميع الكائنات GameObject التي تمتلك المكون e_script. (لدي ملاحظات هنا على التسمية، بما انها مصفوفة فالاسم يجب ان يكون جمع يعني enemies، ولم افهم لماذا تضع underscore قبل الاسم فهذه ليست عادة متبعة في تسمية المصفوفات في بيئة السي شارب، اخيرا e_script اسم رديء جدا لسكريبت واختصار لا داعي له ولا داعي لكلمة script كلها فيمكنك ان تسميه EnemyBehaviour مثلا).

    كود:
    var objects = GameObject.FindGameObjectsWithTag("enemy");
    -الان استخدمت الدالة FindGameObjectsWithTag، اخي الكريم هذه الدالة تعيد GameObject[] لذا لا اجد داعي لاستخدام كلمة var كي لا تنسى مع ماذا تتعامل. ومن جديد اسم objects رديء جدا كاسم لمصفوفة وهو لا يحمل اي معنى.

    -بعد الحصول على مصفوفة تحوي جميع الكائنات التي تحمل الوسم enemy، لم افهم ماذا تريد بالتحديد، هل تريد ملء مصوفة _enemy بهذه الكائنات؟ اذا كان كذلك فلماذا قد تكتب هذه الكود:
    كود:
    foreach (var obj in objects) {
                 if(GameObject.FindWithTag("enemy").activeSelf == false)
                    {
                     // ماذا كتب هنا
                    }
             }
    يعني في البداية انت في حلقة تدور على كامل عناصر المصفوفة objects فهذا يعني انك في كل دورة تريد تنفيذ شيء على العنصر، ولكنك تقوم مجددا بالبحث عن كائن يحمل الوسم enemy وتفحص حالته (بمعنى انك لم تستخدم اي من عناصر objects)، وفي حال كان غير مفعل فإنك تريد تنفيذ امر غير معروف، عدا عن ان هدفك غير واضح بتاتا، فإنك ارتكبت خطأ فالدوال FindWithTag وFindGameObjectsWithTag تيعد الكائنات ال active فقط (راجع ال Scripting Reference) بمعنى ان التحقق ان الكائن مفعل او غير مفعل لا معنى له لأن كل الكائنات في المصفوفة مفعلة.

    بدون شك انا لم اساعدك كما ترغب، ولكن اذا وضحت ما تعمل عليه وبنية ال Scene فربما سأتمكن اكثر من فهم هدفك.
    عليك أن تفعل الأشياء التي تعتقد أنه ليس باستطاعتك ان تفعلها

  3. #3
    صراحة لم افهم تماما ما تريد فشرحك غير واضح ولكن لدي بعض التعليقات والتخمينات.
    صح كلامك، لم أقدم الكثير من الشرح ، أسف
    أنا لستُ محترف في السي شارب و وكتابتي للكود كان بقصد فهم غرض معياً وهذا وضعني في أشكال "مع الأسف"
    في البداية ارى ان لديك مصفوفة سي شارب Array باسم _enemy لا اعرف ولكن واضح بأنك تريد ان تضع فيها جميع الاعداء او بالاحرى جميع الكائنات GameObject التي تمتلك المكون e_script
    100% صح

    على العموم أنا أرتكبت خطأ فادح وهو :
    إن السكربت الموجود يعمل أصلاُ من دون مشاكل ، لكن ما أحول القيام به هو أن أستغني عن e_script[] و أستخدام FindGameObjectsWithTag
    هذا النص
    var objects = GameObject.FindGameObjectsWithTag("enemy");
    var objectCount = objects.Length;
    // objects = _enemy; أحاول ربط الأبجكتس بملف
    Debug.Log(objectCount);
    foreach (var obj in objects) {
    if(GameObject.FindWithTag("enemy").activeSelf == false)
    {
    // ماذا كتب هنا
    }
    لو حدفنها ستجد أن السكربت يعمل دون مشاكل. لهذا دعنا ننساء الأجزاء الأخرا ونركز عليه فقط.
    كيف أستيطع أن أخرج بنتيجه كهذه:
    if (e.enemy.activeSelf == false)
    {
    e.delete_enemy();
    Debug.Log("delete");

    }
    ضد الإنقلاب
    اللهم أحفظ مصر و أهلها

  4. #4
    عضو نشيط
    تاريخ التسجيل
    Jan 2011
    المنطقة
    سوريا
    العمر
    24
    ردود
    561
    بما انك تريد ملء المصفوفة بجميع ال GameObject التي عليها المكون e_script فقم بالتالي:
    كود:
    private e_script[] enemies;
    
    private void Start()
    {
       enemies = FindObjectsOfTypes<e_script>();
    }
    ببساطة استخدمنا الدالة FindObjectsOfType وبالنسخة ال Generic وهي تعيد لنا مصفوفة T[] (حيث T في حالتنا هو e_script) ويوجد نسخة لاعادة كائن واحد، وهكذا ستمتلء المصفوفة بجميع ال e_script الموجودة في ال scene الحالية، ويمكنك ببساطة ان تدور على جميع عناصرها باستخدام حلقة foreach، لاحظ ايضا انني وضعت الامر في Start لأن هذه الدالة بطيئة جدا ولا يجب وضعها في Update او اي دالة تتكرر بشكل كبير. اخيرا FindObjectsOfTypes تعيد الكائنات ال active فقط لذا لا فائدة من كود مثل:
    كود:
    if (e.enemy.activeSelf == false)
    طبعا الا في حال كنت تقوم بتعطيل الاعداء بعد القيام بالبحث وليس قبله. اذا كان هنالك اسئلة اخرى او لم افدك بالشكل الصحيح فارجو ان تطرحها وسنحاول حلها معا.
    عليك أن تفعل الأشياء التي تعتقد أنه ليس باستطاعتك ان تفعلها

  5. #5
    شكراً جزيلاً
    كفيت و وفيت

    في آمن الله
    ضد الإنقلاب
    اللهم أحفظ مصر و أهلها

Bookmarks

قوانين الموضوعات

  • لا يمكنك اضافة موضوع جديد
  • لا يمكنك اضافة ردود
  • لا يمكنك اضافة مرفقات
  • لا يمكنك تعديل مشاركاتك
  •  
  • كود BB مفعّل
  • رموز الحالة مفعّل
  • كود [IMG] مفعّل
  • [VIDEO] code is مفعّل
  • كود HTML معطل