Menu
CoddyTech

שכבות ו-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, והקרן תתעלם מכל collider בשכבה שאינה כלולה בקבוצה.

השחקן הזה אמור לקפוץ מהקרקע, לא מראשי האויבים. הרצפות נמצאות בשכבת Ground, והסקריפט מקבל שדה LayerMask, שמוצג ב-Inspector כתפריט שבו מסמנים את Ground:

[SerializeField] private LayerMask groundMask;

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

מסכה שמכילה רק את Ground גם מונעת מהבדיקה למצוא את השחקן. קרן מדלגת על ה-collider שבתוכו היא מתחילה, אבל לא על שאר ה-colliders של השחקן, כמו זה של אובייקט צאצא; ובדיקות החפיפה בשיעור מאוחר יותר כן מוצאות את ה-collider של השחקן עצמו, כך שבדיקה בכפות הרגליים ללא מסכה תמיד הייתה מחזירה שהשחקן על הקרקע. העבר את השחקן ואת ילדיו לשכבת Player, והשאר את Player מחוץ למסכות שבהן הבדיקות שלו משתמשות. בקוד, LayerMask.GetMask("Ground", "Platform") בונה מסכה משמות של שכבות, ו-~ לפני מסכה הופך אותה לכל השכבות שהיא לא כללה.

challenge icon

אתגר

בינוני

הגשש אמור לדווח מה נמצא לפניו, אבל LookAhead() תמיד מחזירה Lantern. הקרן שלה מדלגת על גוף הסייר, שממנו היא מתחילה, ואז פוגעת בפנס שהסייר מחזיק לפניו. הסייר והפנס שלו נמצאים בשכבת Player. תקן את LookAhead() בתוך Spotter:

  • בנה בקוד מסכה של כל השכבות למעט Player, באמצעות LayerMask.GetMask.
  • העבר אותה ל-raycast, תוך שמירה על range שלו, כך שהקרן תעבור דרך הפנס ותדווח על הדבר הראשון שמעבר לו.

לחץ על Play וסובב את הסייר בעזרת החצים: ה-Console מתעד את מה שהוא רואה. לאחר מכן לחץ על 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בחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

כל השיעורים ביחידה פיזיקה ומשחקיות