שכבות ו-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") בונה מסכה משמות של שכבות, ו-~ לפני מסכה הופך אותה לכל השכבות שהיא לא כללה.
אתגר
בינוניהגשש אמור לדווח מה נמצא לפניו, אבל 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";
}
}
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה פיזיקה ומשחקיות
1גוף קשיח
כוח הכבידה והמסהדחיפה באמצעות AddForceקפיצה באמצעות מתקףFixedUpdate לפיזיקהמהירותגופים קינמטייםחזרה: משטח שיגור2התנגשויות
OnCollisionEnterבמה פגעתי?להישבר בעת פגיעהלעמוד על הקרקעניתור וחיכוךצורות Colliderסיכום: קיר שביר5פרויקט: מרוץ המטבעות
הכדור המתגלגלמטבעות לאיסוף6Raycasts
Physics.RaycastRaycastHitבדיקת קרקע באמצעות קרןשכבות ו-LayerMaskקו ראייהOverlapSphere ו-SphereCastסיכום: חיישן קרן לייזר