Menu
CoddyTech

המשוט

שיעור 1 מתוך 16 בקורס משחק Unity: שובר לבנים של Coddy.

בקורס הזה תבנו את Brick Breaker בתלת־ממד: משטח בתחתית, כדור שקופץ בין הקירות וקיר לבנים שצריך לשבור. בכל שיעור מתווסף מאפיין אחד: הלבנים, חיים, שלבים, מסך סיום משחק והעצמות שמרחיבות את המשטח או מפצלות את הכדור. הסצנה מוכנה: המצלמה מביטה על מגרש המשחקים מלפנים, והכול נע במישור x ו־y ב־z = 0. הסקריפטים Paddle, Ball, Brick, GameManager ו־PowerUp הם לעת עתה שלדים קצרים.

למשטח יש Rigidbody קינמטי, והוא מוזז באמצעות MovePosition בתוך FixedUpdate, כך שמערכת הפיזיקה רואה אותו נע והקפיצות של הכדור יוכלו להשתמש בכך בהמשך. גוף קינמטי לעולם אינו נעצר על ידי קוליידרים שאין להם Rigidbody, ולכן הקירות הצדדיים לא יעצרו אותו: הסקריפט משאיר אותו בתוך הגבולות. אם מגבילים את המרכז בקיר, חצי מהאובייקט יישאר בתוך הקיר, ולכן הגבול הוא הקיר פחות חצי מגודל האובייקט. מעלית זו נעה בפיר שבין y = 0 ל־y = 12, והיא עושה זאת על ציר y:

float halfHeight = transform.localScale.y / 2f;
Vector3 target = rb.position + Vector3.up * input * liftSpeed * Time.fixedDeltaTime;
target.y = Mathf.Clamp(target.y, 0f + halfHeight, 12f - halfHeight);
rb.MovePosition(target);

כאן input הוא 1 לעלייה, ‎-1 לירידה ו־0 אחרת. מעלית בגובה 2 יחידות משאירה את המרכז שלה בין 1 ל־11, כך שקצותיה נעצרים בדיוק ב־0 וב־12. פרימיטיב Cube הוא בגודל יחידה אחת בכל צד, ולכן localScale.y הוא גובה המעלית, וקריאת הערך בכל צעד משאירה את הגבול נכון גם אם הגודל משתנה בזמן שהמשחק פועל.

challenge icon

אתגר

קל

כתבו את תנועת המשטח ב־FixedUpdate() של Paddle:

  1. צרו float input: הערך יהיה ‎-1 כשהחץ שמאלה או A מוחזקים, 1 כשהחץ ימינה או D מוחזקים, ו־0 אחרת.
  2. חשבו את היעד: מיקום ה־Rigidbody בהזזה ימינה באמצעות input * speed * Time.fixedDeltaTime.
  3. הגבילו את x של היעד כך שקצות המשטח יעצרו במשטחים הפנימיים של הקירות, -wallX ו־wallX. רוחב המשטח הוא transform.localScale.x.
  4. הזיזו אותו לשם באמצעות rb.MovePosition.

לחצו על Play, הזיזו את המשטח אל שני הקירות, ואז לחצו על Check.

נסו בעצמכם

using UnityEngine;
using UnityEngine.InputSystem;

public class Paddle : MonoBehaviour
{
    public float speed = 14f;
    public float wallX = 8f;   // הפאות הפנימיות של הקירות הצדדיים נמצאות ב־-wallX וב־wallX

    Rigidbody rb;

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

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

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

כל השיעורים ביחידה משחק Unity: שובר לבנים