Menu
CoddyTech

الطبقات وLayerMask

جزء من قسم الفيزياء وأسلوب اللعب في رحلة Unity على Coddy. الدرس 38 من 71.

يوجد كل GameObject على طبقة واحدة، تُحدَّد من قائمة Layer أعلى Inspector. لدى Unity 32 طبقة: بعضها مدمج (0 Default، و2 Ignore Raycast، و4 Water، و5 UI)، ويمكنك تسمية طبقاتك الخاصة في Tags and Layers، بدءًا من User Layer 3. إن LayerMask مجموعة من الطبقات، بت واحد لكل طبقة. مرّر واحدة إلى اختبار الأشعة بعد maxDistance، وسيتجاهل الشعاع كل مصادم على طبقة خارج المجموعة.

ينبغي لهذا اللاعب أن يقفز من الأرض، لا من فوق رؤوس الأعداء. ضع الأرضيات على طبقة Ground، وأضف إلى السكربت حقلًا من نوع LayerMask، يعرضه Inspector على شكل قائمة يمكنك فيها تحديد Ground:

[SerializeField] private LayerMask groundMask;

bool IsGrounded()
{
    return Physics.Raycast(transform.position, Vector3.down, 1.1f, groundMask);
}

كما تمنع قناع Ground وحدها الاختبار من العثور على اللاعب. يتجاوز الشعاع المصادم الذي يبدأ من داخله، لكنه لا يتجاوز مصادمات اللاعب الأخرى، مثل مصادم أحد العناصر التابعة له، كما أن اختبارات التداخل في درس لاحق ستعثر على مصادم اللاعب نفسه؛ لذلك، فإن إجراء اختبار عند القدمين من دون قناع سيعطي دائمًا نتيجة تفيد بأن اللاعب على الأرض. ضع اللاعب وعناصره التابعة على طبقة Player، وأبقِ Player خارج الأقنعة التي تستخدمها اختباراته. في الشيفرة، تنشئ LayerMask.GetMask("Ground", "Platform") قناعًا من أسماء الطبقات، وتُحوّل ~ الموضوعة قبل القناع القناعَ ليشمل كل طبقة لم تكن ضمنه.

challenge icon

التحدي

متوسط

اجعل شعاع الكشّاف يتجاوز فانوسه.

  1. في LookAhead()، أنشئ int mask = ~LayerMask.GetMask("Player");: كل الطبقات باستثناء Player، حيث يوجد الكشّاف وفانوسه.
  2. مرّر mask إلى اختبار الشعاع، بعد range.

اضغط على «العب» وأدر الكشّاف باستخدام الأسهم: ستعرض وحدة التحكم اسمي الصخرة والشجرة. ثم اضغط على «تحقق».

جرّب بنفسك

using UnityEngine;

public class Spotter : MonoBehaviour
{
    public float range = 10f;
    private string last = "";

    void Update()
    {
        string seen = LookAhead();
        if (seen != last)
        {
            Debug.Log("Ahead: " + seen);
            last = seen;
        }
    }

    // اسم أول شيء أمامك ضمن النطاق، أو "nothing".
    public string LookAhead()
    {
        if (Physics.Raycast(transform.position, transform.forward, out RaycastHit hit, range))
        {
            return hit.collider.name;
        }
        return "nothing";
    }
}

جميع دروس الفيزياء وأسلوب اللعب

تدرّب بنفسك: Playground لـ Unity