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