המסלול
חלק מהיחידה בניית משחקים אמיתיים במסלול ה-Unity של Coddy. שיעור 49 מתוך 60.
בפרק הזה נבנה משחק פלטפורמה בתלת־ממד. רצים וקופצים בין פלטפורמות צפות, רוכבים על פלטפורמה אחת שגולשת, נוגעים בנקודות ביקורת כדי שנפילה לא תחזיר אותנו להתחלה, אוספים אבני חן שמספרן מוצג על המסך, חוצים את קו הסיום אל השלב הבא ומנסים לשבור את שיא הזמן שלנו. המשחק מורכב מחמישה סקריפטים, שכבר נמצאים בפרויקט מההתחלה: Player, MovingPlatform, Checkpoint, Gem ו־FinishLine. ארבעת האחרונים ריקים כרגע, וכל שיעור ימלא אחד מהם. השחקן הוא CharacterController הנשלט באמצעות הפעולות של Input System, והמצלמה היא אובייקט־צאצא שלו, כך שהיא עוקבת אחריו ללא סקריפט.
CharacterController נע בשתי דרכים. Move(motion) מזיז אותו למרחק מסוים ואינו מוסיף דבר, לכן כוח הכבידה, הקפיצות ו־Time.deltaTime הם באחריות הסקריפט, כמו בפרק Character Controller. SimpleMove(speed) מקבל מהירות ביחידות לשנייה, מכפיל אותה בזמן של הפריים בעצמו ומוסיף כוח כבידה; הוא מתעלם מערך ה־y שמועבר אליו, ולכן דמות שנעה באמצעותו נופלת מקצוות, אך לעולם אינה יכולה לקפוץ. לכלב הרועים הזה במשחק רעיית צאן, שנראה מלמעלה, אין צורך לקפוץ, ולכן SimpleMove ופעולת Move הן כל הסקריפט שלו:
using UnityEngine;
using UnityEngine.InputSystem;
public class Sheepdog : MonoBehaviour
{
[SerializeField] private float speed = 6f;
private CharacterController controller;
private InputAction moveAction;
void Start()
{
controller = GetComponent<CharacterController>();
moveAction = InputSystem.actions.FindAction("Move");
}
void Update()
{
Vector2 input = moveAction.ReadValue<Vector2>();
controller.SimpleMove(new Vector3(input.x, 0f, input.y) * speed);
}
}השחקן במשחק הפלטפורמה צריך לקפוץ, ולכן הוא שומר את המהירות האנכית שלו ומתקדם באמצעות Move, תוך קריאת הפעולות Move ו־Jump במקום המחלקה Input. Unity ממליצה לקרוא ל־Move או ל־SimpleMove פעם אחת בכל פריים: ההליכה והנפילה מתבצעות באותה קריאה, ו־isGrounded מתאר אז את התנועה כולה.
אתגר
בינוניגרמו לשחקן ללכת, לקפוץ וליפול.
- ב־
Start(), מצאו אתMoveואתJumpבאמצעותInputSystem.actions.FindAction. - ב־
Update(), לכו במהירותspeed: הזיזו את x של Move לאורך x, ואת ה־y שלו לאורך z. - הוסיפו את
gravity * Time.deltaTimeל־velocity.y, ואת-2fכשהדמות על הקרקע ונופלת. בקפיצה, כשהדמות על הקרקע, הציבו בו אתMathf.Sqrt(jumpHeight * -2f * gravity). - קראו ל־
controller.Move((move + velocity) * Time.deltaTime)פעם אחת.
לחצו על "שחק": קפצו אל הפלטפורמה הראשונה. לאחר מכן לחצו על "בדיקה".
נסו בעצמכם
using UnityEngine;
using UnityEngine.InputSystem;
public class Player : MonoBehaviour
{
[SerializeField] private float speed = 5f;
[SerializeField] private float jumpHeight = 1.5f;
[SerializeField] private float gravity = -9.81f;
private CharacterController controller;
private Vector3 velocity;
void Start()
{
controller = GetComponent<CharacterController>();
}
void Update()
{
// ללכת באמצעות פעולת Move, לקפוץ באמצעות פעולת Jump, וליפול בהשפעת כוח הכבידה
}
}
כל השיעורים ביחידה בניית משחקים אמיתיים
10פרויקט: משחק פלטפורמה תלת־ממדי
המסלולפלטפורמות נעותתרגלו בעצמכם: Unity אונליין