Menu
CoddyTech
flag Ar iconالعربيةdown icon

الطبقات وLayerMask

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

يوجد كل GameObject على طبقة واحدة، تُحدَّد من قائمة Layer أعلى Inspector. لدى Unity ‏32 طبقة: بعضها مُضمَّن (0 Default و2 Ignore Raycast و4 Water و5 UI)، ويمكنك تسمية طبقاتك في Tags and Layers، بدءًا من User Layer 3. إن LayerMask مجموعة من الطبقات، بت واحد لكل طبقة. مرّر واحدة إلى raycast بعد 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

التحدي

متوسط

ينبغي للكشّاف الإبلاغ عمّا أمامه، لكن LookAhead() تُرجع دائمًا Lantern. يتجاوز شعاعه جسم الكشّاف، الذي يبدأ من داخله، ثم يصطدم بالفانوس الذي يحمله الكشّاف أمامه. الكشّاف وفانوسه موجودان على طبقة Player. أصلح LookAhead() في Spotter:

  • أنشئ قناعًا لكل الطبقات باستثناء Player في الشيفرة، باستخدام LayerMask.GetMask.
  • مرّره إلى اختبار الشعاع، مع الإبقاء على range، لكي يتجاوز الشعاع الفانوس ويُبلغ عن أول شيء بعده.

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

جرّب بنفسك

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";
    }
}
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

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