לעמוד על הקרקע
חלק מהיחידה פיזיקה ומשחקיות במסלול ה-Unity של Coddy. שיעור 11 מתוך 63.
לכל מגע יש נורמל: כיוון באורך 1, מאונך למשטח שנגעת בו, ומצביע ממנו והלאה לעבר האובייקט שלך. collision.GetContact(0) היא נקודת המגע הראשונה, וה-normal שלה אומר לך באיזה צד נגעת. בעמידה על קרקע שטוחה הוא (0, 1, 0); מול קיר מימינך הוא (-1, 0, 0); וכשאתה נחבט בתקרה עם הראש הוא (0, -1, 0).
הארגז הזה מבחין בין נחיתות לחבטות מהצד:
void OnCollisionEnter(Collision collision)
{
Vector3 normal = collision.GetContact(0).normal;
if (normal.y > 0.5f)
{
Debug.Log("Landed on " + collision.gameObject.name);
}
else
{
Debug.Log("Bumped the side of " + collision.gameObject.name);
}
}הבדיקה היא normal.y > 0.5f ולא בדיוק 1, כדי שגם מדרונות ייחשבו לקרקע: y הוא 0.5 במדרון של 60 מעלות, תלול יותר מכל מדרון שאפשר לעלות עליו בהליכה. שתי הודעות נוספות עוזרות בכל דבר שנמשך: OnCollisionStay מופעל בכל צעד פיזיקה כל עוד המגע נמשך, ו-OnCollisionExit מופעל פעם אחת כשהוא מסתיים. ליציאה אין נקודות מגע, כי שום דבר כבר לא נוגע, לכן אל תקרא ל-GetContact שם.
אתגר
קלהשחקן יכול ללכת ולקפוץ, אבל מקש הרווח פועל גם באוויר, כך שהוא יכול לטפס לשמיים בקפיצה אחת בכל פעם ולקפוץ מהצד של הקיר. (לקוליידר שלו יש חומר נטול חיכוך, ולכן הוא מחליק במורד הקירות במקום להיצמד אליהם.) יש לגרום לו לקפוץ רק כשהוא עומד על משהו.
- יש לשמור משתנה
bool grounded: הערך שלו true כשהשחקן נוגע במשהו שנורמל המגע שלו פונה כלפי מעלה (y מעל 0.5), ו-false ברגע שהוא מפסיק לגעת בו. - יש לקפוץ רק כאשר מקש הרווח נלחץ והערך של
groundedהוא true. לחיצה באוויר מתעלמים ממנה ולא שומרים אותה עד הנחיתה.
לחצו על Play, נסו לקפוץ פעמיים ולטפס על הקיר, ואז לחצו על Check.
נסו בעצמכם
using UnityEngine;
public class Hopper : MonoBehaviour
{
public float speed = 4f;
public float jump = 6f;
private Rigidbody rb;
private bool jumpPressed;
void Start()
{
rb = GetComponent<Rigidbody>();
}
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
jumpPressed = true;
}
}
void FixedUpdate()
{
float h = Input.GetAxisRaw("Horizontal");
rb.linearVelocity = new Vector3(h * speed, rb.linearVelocity.y, 0);
if (jumpPressed)
{
rb.AddForce(Vector3.up * jump, ForceMode.Impulse);
jumpPressed = false;
}
}
}
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה פיזיקה ומשחקיות
1גוף קשיח
כוח הכבידה והמסהדחיפה באמצעות AddForceקפיצה באמצעות מתקףFixedUpdate לפיזיקהמהירותגופים קינמטייםחזרה: משטח שיגור2התנגשויות
OnCollisionEnterבמה פגעתי?להישבר בעת פגיעהלעמוד על הקרקעניתור וחיכוךצורות Colliderסיכום: קיר שביר5פרויקט: מרוץ המטבעות
הכדור המתגלגלמטבעות לאיסוף