CharacterController.Move
חלק מהיחידה בניית משחקים אמיתיים במסלול ה-Unity של Coddy. שיעור 38 מתוך 60.
CharacterController הוא רכיב של Unity לדמות הולכת: קפסולה שזזה רק כשהסקריפט שלך קורא ל־controller.Move(motion). motion הוא המרחק שיש לזוז בו בפריים הזה, ולכן הוא שווה למהירות כפול Time.deltaTime. Move מחליק את הקפסולה לאורך קירות במקום דרכם, עולה במדרונות עד לזווית מגבלת השיפוע (45 degrees) ומטפס על מדפים עד לגובה סף המדרגה שלו (0.3 units). זה לא Rigidbody: אין כוחות, אין כוח כבידה, אין קפיצה, ושום דבר לא דוחף אותו. הוא מגיע בדיוק למקום שאליו Move שולח אותו, וזה מה שפקדי משחק מדויקים צריכים.
הוספת כוח הכבידה היא באחריותך, וכך גם איתור הרצפה. isGrounded הוא true כאשר הקריאה האחרונה ל־Move נגעה במשהו מלמטה, לכן תנועה ללא רכיב כלפי מטה לעולם לא מאתרת את הרצפה. קריאת Move קצרה ממרחק התנועה המזערי של הבקר (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");
}
}
}הקפסולה נשארת במרחק רוחב המעטפת שלה (0.08) מכל מה שהיא נוגעת בו, לכן בקר בגובה 2 יחידות על רצפה בגובה y = 0 נח בגובה y = 1.08, ולא 1. בנוסף, Move מתחיל מהמקום שבו הפיזיקה ראתה לאחרונה את הבקר, ולכן אפשר לבטל בקריאת Move הבאה שינוי של transform.position: כדי לשגר אותו למיקום אחר, יש להגדיר controller.enabled = false, להזיז אותו ואז להפעיל אותו שוב.
אתגר
בינוניהניעו את הסייר בעזרת ה־CharacterController שלו, כדי שהקיר יעצור אותו.
- ב־
Update(), בנו אתVector3 moveמ־Input.GetAxisRaw("Horizontal")בציר x ומ־Input.GetAxisRaw("Vertical")בציר z, כפולspeed. - הגדירו
move.y = -fallSpeed;וקראו ל־controller.Move(move * Time.deltaTime);. - לאחר מכן הגדירו את
rend.material.colorל־Color.greenכאשרcontroller.isGroundedמתקיים, אחרת ל־Color.red.
לחצו על "שחק", לכו אל הקיר וצאו מהקצה השמאלי: הסייר נופל כשהוא אדום ונוחת כשהוא ירוק. לאחר מכן לחצו על "בדיקה".
נסו בעצמכם
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הוספת כוח הכבידה באופן ידניקפיצהדחיפת דבריםתנועה לכיוון המבטסיכום: קפיצה כפולהתרגלו בעצמכם: Unity אונליין