המסלול
חלק מהיחידה בונים משחקים אמיתיים במסלול ה-Unity של Coddy. שיעור 48 מתוך 56.
בפרק הזה נבנה משחק פלטפורמה בתלת־ממד. רצים וקופצים בין פלטפורמות מרחפות, רוכבים על אחת שגולשת, נוגעים בנקודות ביקורת כדי שנפילה לא תחזיר אתכם להתחלה, אוספים אבני חן שמספרן מוצג על המסך, חוצים את קו הסיום אל השלב הבא ומנסים לשבור את שיא הזמן שלכם. המשחק מורכב מחמישה סקריפטים שנמצאים בפרויקט כבר מההתחלה: Player, MovingPlatform, Checkpoint, Gem ו־FinishLine. ארבעת האחרונים ריקים כרגע, וכל שיעור ממלא אחד מהם. השחקן הוא CharacterController המנווט באמצעות פעולות של מערכת הקלט, והמצלמה היא ילד שלו, כך שהיא עוקבת אחריו ללא סקריפט.
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 מתאר את כל התנועה הזאת.
אתגר
בינוניהתחל את משחק הפלטפורמות עם השחקן. לסקריפט Player יש speed (5), jumpHeight (1.5) ו-gravity (-9.81), את controller ו-velocity לנפילה. מצא את פעולות Move ו-Jump פעם אחת, בתוך Start, ובתוך Update:
- Move מזיז את השחקן בהליכה במהירות של
speedיחידות לשנייה: ימינה ושמאלה לאורך x, קדימה ואחורה לאורך z. - כוח הכבידה מוסיף
gravity * Time.deltaTimeל-velocity.yבכל פריים. כשהבקר מקורקע ו-velocity.yקטן מ-0, הגדר תחילה אתvelocity.yל--2, כך שהוא יישאר צמוד לקרקע. - כל לחיצה על Jump, כשהשחקן מקורקע, מגדירה את
velocity.yל-Mathf.Sqrt(jumpHeight * -2f * gravity): קפיצה לגובה שלjumpHeightיחידות. החזקת Jump גורמת לקפיצה אחת, ואי אפשר לקפוץ באוויר. - קרא ל-
controller.Moveפעם אחת, עם ההליכה ו-velocityיחד, כפולTime.deltaTime.
לחץ על Play וקפוץ אל הפלטפורמות הראשונות, ואז לחץ על Check.
נסו בעצמכם
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פרויקט: משחק פלטפורמה תלת־ממדי
המסלולפלטפורמות נעות