הוספת כוח הכבידה באופן ידני
חלק מהיחידה בונים משחקים אמיתיים במסלול ה-Unity של Coddy. שיעור 38 מתוך 56.
CharacterController נופל רק אם הסקריפט שלך גורם לו ליפול, ונפילה אמיתית מואצת: כוח הכבידה מוסיף בערך 9.81 יחידות לשנייה למהירות הנפילה בכל שנייה. לכן הסקריפט שומר את המהירות האנכית בשדה, מוסיף לה gravity * Time.deltaTime בכל פריים, ומזיז לפיה באותה קריאה של Move שבה מתבצעת ההליכה:
public float gravity = -9.81f;
float verticalSpeed;
void Update()
{
if (controller.isGrounded && verticalSpeed < 0f)
{
verticalSpeed = -2f; // על הקרקע: עצור את הנפילה, שמור על דחיפה קלה כלפי מטה
}
verticalSpeed += gravity * Time.deltaTime;
Vector3 move = new Vector3(Input.GetAxisRaw("Horizontal"), 0f, Input.GetAxisRaw("Vertical")) * speed;
move.y = verticalSpeed;
controller.Move(move * Time.deltaTime);
}Time.deltaTime מופיע פעמיים, לשתי מטרות: gravity * Time.deltaTime היא המהירות שנוספה בפריים הזה, והמכפלה של המהירות ב-Time.deltaTime היא המרחק שעוברים בפריים הזה. המהירות נשמרת בשדה כי היא צריכה להישמר מפריים לפריים; משתנה מקומי היה מתחיל שוב מ-0 בכל פריים. בנפילה ממנוחה, המהירות של הבקר היא -4.9 יחידות לשנייה אחרי חצי שנייה, ו--9.81 אחרי שנייה.
האיפוס חשוב לא פחות מהנפילה. על הרצפה, Move עוצר את הבקר, אבל שום דבר לא עוצר את השדה: בלי האיפוס, הערך שלו ממשיך לגדול כשהשחקן עומד, והצעד הבא מעבר לקצה מפיל אותו במהירות מלאה. מאפסים אותו למספר שלילי קטן ולא ל-0 כדי שכל קריאה של Move עדיין תלחץ לכיוון הרצפה: בקצב פריימים גבוה, הדחיפה של כוח הכבידה בפריים יחיד עשויה להיות קצרה מ-Min Move Distance, ואז Move לא עושה דבר ו-isGrounded הופך ל-false. קוראים את isGrounded לפני Move, ולכן הוא מתאר את פעולת Move של הפריים הקודם.
אתגר
בינוניהצוללן עומד על מגדל גבוה, והחצים מזיזים אותו בהליכה (כבר כתוב). הוסף לו כוח כבידה בקובץ Diver.cs. בחלון Inspector מוגדרים הערכים gravity (-12) ו-maxFall (10), ובסקריפט יש את השדה verticalSpeed.
- בכל פריים,
verticalSpeedגדל בקצב שלgravityלשנייה, והצוללן נע כלפי מטה בהתאם באותה קריאה ל-Move שבה מתבצעת ההליכה. - האוויר מאט נפילה ממושכת: הצוללן לעולם לא נופל מהר יותר מ-
maxFallיחידות לשנייה. - כשהבקר מקורקע ו-
verticalSpeedקטן מ-0, הגדר אתverticalSpeedלערך -1.
לחץ על Play, לך אל מחוץ למגדל ואז לחץ על Check.
נסו בעצמכם
using UnityEngine;
public class Diver : MonoBehaviour
{
public float speed = 4f;
public float gravity = -12f;
public float maxFall = 10f;
CharacterController controller;
float verticalSpeed;
void Start()
{
controller = GetComponent<CharacterController>();
}
void Update()
{
// כוח הכבידה: אפס את verticalSpeed כשהדמות על הקרקע, הוסף את כוח הכבידה, הגבל את מהירות הנפילה והצב את הערך ב־move.y
Vector3 move = new Vector3(Input.GetAxisRaw("Horizontal"), 0f, Input.GetAxisRaw("Vertical")) * speed;
controller.Move(move * Time.deltaTime);
}
}
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה בונים משחקים אמיתיים
10פרויקט: משחק פלטפורמה תלת־ממדי
המסלולפלטפורמות נעות2כפתורים ומסכים
כפתורים ו-onClickביטויי למבדהחיבור ב-Inspectorהפעלה וכיבוי של פאנליםפסי בריאותסיכום: חנות שדרוגים8בקרת דמות
CharacterController.Moveהוספת כוח הכבידה באופן ידניקפיצהדחיפת דבריםתנועה לכיוון המבטסיכום: קפיצה כפולה