Menu
CoddyTech

דחיפת דברים

חלק מהיחידה בונים משחקים אמיתיים במסלול ה-Unity של Coddy. שיעור 40 מתוך 56.

‏CharacterController לעולם לא דוחף שום דבר: הולכים איתו לתוך ארגז עם Rigidbody והוא נעצר כאילו נתקל בקיר. במקום זאת, Unity קוראת ל־OnControllerColliderHit(ControllerColliderHit hit) בסקריפטים של הבקר עצמו עבור כל Collider ש־Move נוגע בו, כולל הרצפה, והסקריפט מחליט מה יקרה. hit.collider הוא מה שנגעו בו, hit.moveDirection הוא הכיוון של Move שנגע בו, ו־hit.normal הוא הכיוון שאליו פונה המשטח שלו בנקודת המגע. זהו סקריפט הדחיפה של Unity עצמה:

public float pushPower = 2f;

void OnControllerColliderHit(ControllerColliderHit hit)
{
    Rigidbody body = hit.collider.attachedRigidbody;
    if (body == null || body.isKinematic) return;   // אין מה לדחוף
    if (hit.moveDirection.y < -0.3f) return;        // הוא נמצא מתחת לרגליים שלנו

    Vector3 pushDir = new Vector3(hit.moveDirection.x, 0f, hit.moveDirection.z);
    body.linearVelocity = pushDir * pushPower;
}

לכל return יש סיבה. לרצפה ולקירות אין Rigidbody, לכן body הוא null עבורם, ונוגעים בהם כמעט בכל Move. גוף קינמטי זז רק כשהסקריפט שלו עצמו מזיז אותו, לכן מהירות לא תשפיע עליו. כאשר Move מכוון בתלילות כלפי מטה, הוא נוגע במשהו שמתחת לרגליים, ואין לדחוף את הארגז שהשחקן עומד עליו.

כיוון הדחיפה שומר רק את x ו־z, כך שהארגז מחליק לאורך הקרקע במקום להידחף לתוכה. הגדרת linearVelocity, במקום הוספת כוח, מזיזה ארגז קל וכבד באותו הקצב; body.AddForce(pushDir * pushPower, ForceMode.Impulse) היה דוחף את הארגז הכבד פחות.

challenge icon

אתגר

בינוני

בעט בכדורים מסביב לחצר. השחקן נע באמצעות CharacterController (Walker.cs, מוכן). כתוב את Kicker.cs, גם הוא על השחקן. ה־Inspector קובע את kickPower (6) ואת lift (4).

  • כשהשחקן הולך לתוך גוף שאפשר לדחוף, קבע את linearVelocity שלו לכיוון ההליכה, במישור לאורך הקרקע, כפול kickPower, בתוספת lift ישר למעלה, כך שהכדור יעוף קדימה ולמעלה.
  • לקרקע ולעמוד אין Rigidbody: דלג עליהם בלי שגיאה.
  • כדור שנמצא מתחת לרגלי השחקן לא נבעט.

לחץ על Play ובעט בכדור האדום, ואז לחץ על Check.

נסו בעצמכם

using UnityEngine;

public class Kicker : MonoBehaviour
{
    public float kickPower = 6f;
    public float lift = 4f;

    // בעט בכדורים שהשחקן נתקל בהם
}
quiz iconבחנו את עצמכם

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

כל השיעורים ביחידה בונים משחקים אמיתיים