Menu
CoddyTech

הזירה

חלק מהיחידה פיזיקה ומשחקיות במסלול ה-Unity של Coddy. שיעור 56 מתוך 63.

בפרק הזה נבנה את Arena Escape. מתחמקים מציידים בזירה מוקפת חומות, בזמן שגלים של ציידים שוטפים פנימה; שלוש פגיעות מסיימות את הריצה, ולאחר שהגל האחרון יוצא, נפתח מעבר יציאה. המשחק מורכב מחמישה סקריפטים, שכבר נמצאים בפרויקט מההתחלה: Player, Hunter, Spawner, Health ו-Exit. ארבעת האחרונים ריקים כרגע, ובכל שיעור ממלאים אחד מהם.

השחקן נע באמצעות כוחות במקום לקבוע מהירות, כך שההדיפה של צייד מתווספת לתנועה שלו במקום להתאפס. דחיפה לבדה הייתה מאיצה אותו לנצח, ולכן linearDamping מפחית חלק ממהירותו בכל צעד: דחיפה קבועה מתייצבת במהירות מרבית שקרובה לתאוצה חלקי הבלימה. רחפת המזחלת הזאת דוחפת קדימה כל עוד מקש הרווח לחוץ:

[SerializeField] private float accel = 12f;
private Rigidbody rb;

void Start()
{
    rb = GetComponent<Rigidbody>();
    rb.linearDamping = 2f;
}

void FixedUpdate()
{
    if (Input.GetKey(KeyCode.Space))
    {
        rb.AddForce(transform.forward * accel, ForceMode.Acceleration);
    }
}

עם תאוצה של 12 ובלימה של 2, המהירות המרבית של המזחלת מתייצבת בסביבות 6 יחידות לשנייה, וכשמרפים ממקש הרווח, הבלימה עוצרת אותה במקום לתת לה להמשיך לגלוש לנצח. ForceMode.Acceleration מתעלם מהמסה, כך שמזחלת כבדה מאיצה בדיוק כמו מזחלת קלה. לקוליידר של המזחלת יש PhysicsMaterial נטול חיכוך: אילו היה נוסף חיכוך מהרצפה על גבי הבלימה, המהירות המרבית שלה הייתה נמוכה יותר.

challenge icon

אתגר

בינוני

התחילו את Arena Escape עם השחקן. ה-Inspector נותן לסקריפט Player את accel (18) ואת topSpeed (6). המסה של השחקן היא 2, ויש לו חומר ללא חיכוך. ארבעת הסקריפטים האחרים יישארו ריקים בינתיים.

  • ב-Start, הגדירו את linearDamping של ה-Rigidbody לערך accel / topSpeed, כך שהמהירות של השחקן תתייצב בערך על topSpeed.
  • בכל צעד פיזיקה, דחפו את השחקן באמצעות מקשי החצים, שמאלה וימינה לאורך ציר x ולמעלה ולמטה לאורך ציר z, באמצעות ForceMode.Acceleration ותאוצה של accel.
  • נרמלו את כיוון מקשי החצים, כך שתנועה באלכסון לא תהיה מהירה יותר מתנועה בקו ישר.

לחצו על Play והחליקו ברחבי הזירה, ואז לחצו על Check.

נסו בעצמכם

using UnityEngine;

public class Player : MonoBehaviour
{
    [SerializeField] private float accel = 18f;
    [SerializeField] private float topSpeed = 6f;
    private Rigidbody rb;

    void Start()
    {
        rb = GetComponent<Rigidbody>();
    }

    void FixedUpdate()
    {
        // קבע את השיכוך, ואז הזז את השחקן באמצעות מקשי החצים
    }
}
quiz iconבחנו את עצמכם

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

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