כוונו בעזרת המשטח
שיעור 4 מתוך 19 בקורס Unity: משחק שובר לבנים של Coddy.
בהקפצה מושלמת השחקן לא יכול לכוון. במשחקי שבירת לבנים המשטח קובע: פגיעה קרוב לקצה השמאלי שולחת את הכדור למעלה ולשמאלה, ופגיעה באמצע שולחת אותו ישר למעלה.
הפכו את הפגיעה למספר שבין -1 בקצה השמאלי ל־1 בקצה הימני: ההיסט של הכדור בציר x ממרכז המשטח, חלקי חצי מרוחב המשטח. משטח ברוחב 4 שמרכזו ב־x 2, שנפגע ב־x 3: ההיסט הוא 1, חצי הרוחב הוא 2, ולכן המספר הוא 0.5 והכדור יוצא לאורך (0.5, 1, 0), לאחר נרמול. הגבילו את הערך, כי הכדור יכול לגעת בפינה מעט מעבר לקצה.
OnCollisionEnter פועלת לאחר שהפיזיקה חישבה את ההקפצה, לכן מהירות שמוגדרת שם מחליפה אותה. גם קירות שולחים את הכדור ושומרים על ההקפצה הרגילה שלהם, לכן בדקו קודם את התג. collision.collider.bounds.size.x הוא רוחב המשטח בעולם.
אתגר
קלכוונו את הכדור באמצעות המשטח: המקום שבו הוא נוחת קובע את הזווית.
- ב־
Ball, הוסיפוOnCollisionEnter(Collision collision); בצעו חזרה אם האובייקט שבו פגע הכדור אינו מתויג בתורPaddle. - חשבו את
float x: ערך ה־x של הכדור פחות ערך ה־x של המשטח, חלקי מחצית מ־collision.collider.bounds.size.x, מוגבל בין -1 ל־1. - הגדירו
rb.linearVelocity = new Vector3(x, 1f, 0f).normalized * speed;
לחצו על "שחק" ותפסו את הכדור בקצה השמאלי של המשטח: הוא יעוף שמאלה. לאחר מכן לחצו על "בדיקה".
נסו בעצמכם
using UnityEngine;
using UnityEngine.InputSystem;
public class Ball : MonoBehaviour
{
public Transform paddle;
public float speed = 9f;
Rigidbody rb;
bool launched;
void Awake()
{
rb = GetComponent<Rigidbody>();
PhysicsMaterial bouncy = new PhysicsMaterial("Bouncy");
bouncy.bounciness = 1f;
bouncy.dynamicFriction = 0f;
bouncy.staticFriction = 0f;
bouncy.bounceCombine = PhysicsMaterialCombine.Maximum;
bouncy.frictionCombine = PhysicsMaterialCombine.Minimum;
GetComponent<Collider>().material = bouncy;
}
void Update()
{
if (launched) return;
transform.position = paddle.position + Vector3.up * 0.5f;
if (Keyboard.current.spaceKey.wasPressedThisFrame) Launch(new Vector3(0.3f, 1f, 0f));
}
public void Launch(Vector3 direction)
{
launched = true;
rb.linearVelocity = direction.normalized * speed;
}
void FixedUpdate()
{
if (!launched) return;
rb.linearVelocity = rb.linearVelocity.normalized * speed;
}
}
כל השיעורים ביחידה Unity: משחק שובר לבנים
תרגלו בעצמכם: Unity אונליין