Menu
CoddyTech

משטח רחב

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

תוספת כוח מסוג Wide שנתפסת בעזרת המשטח מרחיבה אותו לכמה שניות. תוספת הכוח מזהה את התפיסה: מתנגש ה־trigger שלה נוגע במתנגש של המשטח, ושני הגופים הם קינמטיים, וזה מספיק עבור OnTriggerEnter. היא גם עוברת דרך הכדור בדרכה למטה, לכן היא בודקת את התג. enum עם הסוגים, שמוגדר לכל prefab ב־Inspector, מבדיל בין תוספת כוח אחת לאחרת.

אפקט מתוזמן הוא coroutine: שינוי, המתנה, שינוי בחזרה. תפיסה שנייה בזמן שהראשונה עדיין פועלת חייבת להתחיל את הזמן מחדש, לכן שומרים את Coroutine ש־StartCoroutine מחזירה ועוצרים אותה לפני שמתחילים חדשה. אחרת הראשונה מסתיימת מוקדם ומבטלת את השנייה. הגברת מהירות:

Coroutine boost;

public void Boost()
{
    if (boost != null) StopCoroutine(boost);
    boost = StartCoroutine(BoostFor(3f));
}

IEnumerator BoostFor(float seconds)
{
    speed = normalSpeed * 2f;
    yield return new WaitForSeconds(seconds);
    speed = normalSpeed;
    boost = null;
}

הגברת המהירות קובעת את המהירות לפי normalSpeed, שנשמר פעם אחת, במקום להכפיל את המהירות הנוכחית ואז לחלק אותה לשניים מאוחר יותר: שתי הגברות ברצף היו הופכות אותה למהירה פי 4. הגבלת המשטח כבר קוראת את הרוחב שלו בכל צעד, לכן גם משטח רחב עדיין נעצר בקירות.

challenge icon

אתגר

קשה
  1. ב־PowerUp, הוסף public enum Kind { Wide, Multiball } ואת public Kind kind (מגדירים את ה־kind של כל prefab). הוסף OnTriggerEnter: כשה־power-up נוגע באובייקט שמתויג Paddle, power-up מסוג Wide קורא ל־Widen() בסקריפט Paddle של אותו אובייקט, ושני הסוגים משמידים את ה־power-up.
  2. ב־Paddle, הוסף public float wideFactor = 1.6f ואת public float wideSeconds = 8f, ושמור את הרוחב הרגיל של ה־paddle, כלומר את קנה המידה שלו בציר x, ב־Awake().
  3. כתוב public void Widen(): היא מפעילה coroutine שמגדירה את קנה המידה של ה־paddle בציר x לפי wideFactor כפול הרוחב הרגיל, ממתינה wideSeconds, ומחזירה את הרוחב הרגיל. תפיסה של power-up נוסף בזמן שה־paddle רחב מפעילה מחדש את הספירה.

תופסים power-up מסוג Multiball, והוא עדיין לא עושה דבר.

לחץ על Play, תפוס power-up ירוק, ואז לחץ על 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()
    {
        float input = 0f;
        if (Keyboard.current.leftArrowKey.isPressed || Keyboard.current.aKey.isPressed) input -= 1f;
        if (Keyboard.current.rightArrowKey.isPressed || Keyboard.current.dKey.isPressed) input += 1f;

        Vector3 target = rb.position + Vector3.right * input * speed * Time.fixedDeltaTime;
        float halfWidth = transform.localScale.x / 2f;
        target.x = Mathf.Clamp(target.x, -wallX + halfWidth, wallX - halfWidth);
        rb.MovePosition(target);
    }
}
quiz iconבחנו את עצמכם

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

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