CharacterController.Move
חלק מהיחידה בונים משחקים אמיתיים במסלול ה-Unity של Coddy. שיעור 37 מתוך 56.
CharacterController הוא הרכיב של Unity לדמות הולכת: כמוסה שזזה רק כשהסקריפט שלך קורא ל־controller.Move(motion). motion הוא המרחק שיש לנוע בפריים הזה, ולכן הוא מהירות כפול Time.deltaTime. Move מחליק את הקפסולה לאורך קירות במקום דרכם, עולה במדרונות עד לגבול השיפוע שלה (45 מעלות) ועולה על מדפים עד להיסט הצעד שלה (0.3 יחידות). זה לא Rigidbody: אין כוחות, אין כוח כבידה, אין קפיצה לאחור, ושום דבר לא דוחף אותו. הוא מגיע בדיוק למקום שאליו Move שולח אותו, וזה מה שפקדי משחק מדויקים צריכים.
עליך להוסיף את כוח הכבידה בעצמך, וגם למצוא את הרצפה. isGrounded הוא true כאשר הקריאה האחרונה ל־Move נגעה במשהו מתחת, ולכן תנועה שאין בה רכיב כלפי מטה לעולם לא תמצא את הרצפה. קריאה ל־Move עם מרחק קטן מ־Min Move Distance של הבקר (0.001) לא עושה דבר, ולכן בקר שנע רק הצדה מדווח שהוא לא מקורקע ברגע שהוא נעצר. השליח הזה הולך באמצעות החצים ולוחץ מעט כלפי מטה בכל תנועה:
public class Courier : MonoBehaviour
{
public float speed = 6f;
CharacterController controller;
void Start()
{
controller = GetComponent<CharacterController>();
}
void Update()
{
Vector3 move = new Vector3(Input.GetAxisRaw("Horizontal"), 0f, Input.GetAxisRaw("Vertical")) * speed;
move.y = -2f; // תמיד מפעילים לחץ כלפי מטה, כדי לזהות את הרצפה
controller.Move(move * Time.deltaTime);
if (!controller.isGrounded)
{
Debug.Log("Off the ground");
}
}
}הקפסולה שומרת על מרחק של Skin Width (0.08) מהמשטחים שבהם היא נוגעת, ולכן בקר שגובהו 2 יחידות על רצפה בגובה y = 0 נח בגובה y = 1.08, ולא 1. בנוסף, Move מתחיל מהמקום שבו הפיזיקה ראתה לאחרונה את הבקר, ולכן הגדרה של transform.position עליו עלולה להתבטל בקריאה הבאה ל־Move: כדי לשגר אותו למיקום אחר, יש להגדיר controller.enabled = false, להזיז אותו ואז להפעיל אותו שוב.
אתגר
בינוניהחוקר עומד על משטח אבן, כשמאחוריו קיר ומשמאלו תהום. כתבו את Explorer.cs על ה-Player, שיש לו CharacterController. ב-Inspector מוגדרים speed (4) ו-fallSpeed (3), ו-Start() כבר מאתרת את הבקר ואת ה-Renderer של החוקר.
- החצים (או WASD), שנקראים באמצעות הצירים הגולמיים, מזיזים אותו באמצעות
controller.Moveבמהירות שלspeedיחידות בשנייה: שמאלה וימינה לאורך ציר x, למעלה ולמטה לאורך ציר z. הקיר חייב לעצור אותו. - כל תנועה כוללת גם תנועה כלפי מטה במהירות של
fallSpeedיחידות בשנייה, כך שהחוקר נשאר על המשטח ונופל מעבר לקצה שלו. - כשהבקר נמצא על הקרקע, צבע החוקר הוא
Color.green; וכשהוא לא, צבעו הואColor.red.
לחצו על Play, לכו אל הקיר והמשיכו מעבר לקצה, ואז לחצו על Check.
נסו בעצמכם
using UnityEngine;
public class Explorer : MonoBehaviour
{
public float speed = 4f;
public float fallSpeed = 3f;
CharacterController controller;
Renderer rend;
void Start()
{
controller = GetComponent<CharacterController>();
rend = GetComponent<Renderer>();
}
void Update()
{
// הזז את החוקר באמצעות controller.Move, ואז צבע אותו לפי isGrounded
}
}
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה בונים משחקים אמיתיים
10פרויקט: משחק פלטפורמה תלת־ממדי
המסלולפלטפורמות נעות2כפתורים ומסכים
כפתורים ו-onClickביטויי למבדהחיבור ב-Inspectorהפעלה וכיבוי של פאנליםפסי בריאותסיכום: חנות שדרוגים8בקרת דמות
CharacterController.Moveהוספת כוח הכבידה באופן ידניקפיצהדחיפת דבריםתנועה לכיוון המבטסיכום: קפיצה כפולה