Menu
CoddyTech

משטח רחב

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

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

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

אתגר

קשה

שדרוג כוח מסוג Wide מרחיב את המחבט למשך 8 שניות.

  1. ב־Paddle, הוסף public float wideFactor = 1.6f; ו־public float wideSeconds = 8f;, ושמור את קנה המידה הרגיל של x ב־Awake.
  2. Widen() עוצר את הקורוטינה שפועלת, אם יש כזאת, ומתחיל קורוטינה: קנה המידה של x הוא wideFactor כפול הערך הרגיל, ממתינים wideSeconds, ואז חוזרים לערך הרגיל.
  3. הקורוטינה זקוקה ל־using System.Collections;.

לחץ על „שחק” ותפוס אחד ירוק: המחבט גדל ואז חוזר לגודלו הרגיל. לאחר מכן לחץ על „בדיקה”.

נסו בעצמכם

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);
    }

    public void Widen()
    {
        Debug.Log("Wide paddle");
    }
}

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

תרגלו בעצמכם: Unity אונליין