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 הוא אוסף של שכבות, ביט אחד לכל שכבה. מעבירים אותו ל-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 שבתוכו היא מתחילה, אבל לא על ה-collider-ים האחרים של השחקן, למשל של ילד שלו, ובדיקות החפיפה בשיעור מאוחר יותר אכן מזהות את ה-collider של השחקן עצמו, כך שבדיקה ליד הרגליים ללא מסכה תמיד תחזיר שהשחקן על הקרקע. שים את השחקן ואת ילדיו בשכבת Player, והקפד ש-Player לא ייכלל במסכות שבהן משתמשות הבדיקות. בקוד, LayerMask.GetMask("Ground", "Platform") יוצר מסכה משמות של שכבות, ו-~ לפני מסכה הופך אותה למסכה של כל השכבות שלא נכללו בה.

challenge icon

אתגר

בינוני

גרמו לקרן של הסייר לראות מעבר לפנס שלו.

  1. ב־LookAhead(), צרו int mask = ~LayerMask.GetMask("Player");: כל שכבה מלבד Player, שבה נמצאים הסייר והפנס שלו.
  2. העבירו את mask לפונקציית הקרן, אחרי range.

לחצו על "שחק" וסובבו את הסייר באמצעות החצים: ה־Console מציג את השמות Rock ו־Tree. ואז לחצו על "בדיקה".

נסו בעצמכם

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";
    }
}

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

תרגלו בעצמכם: Unity אונליין