דחיפת דברים
חלק מהיחידה בניית משחקים אמיתיים במסלול ה-Unity של Coddy. שיעור 41 מתוך 60.
רכיב CharacterController לעולם אינו דוחף דבר: הולכים איתו לתוך ארגז עם Rigidbody, והוא נעצר כאילו נתקל בקיר. במקום זאת, Unity קוראת ל־OnControllerColliderHit(ControllerColliderHit hit) בסקריפטים של הבקר עצמו עבור כל מתנגש ש־Move נוגע בו, כולל הרצפה, והסקריפט מחליט מה קורה. hit.collider הוא הדבר שבו נגעו, hit.moveDirection הוא הכיוון של Move שנגע בו, ו־hit.normal הוא הכיוון שאליו פונה המשטח בנקודת המגע. זהו סקריפט הדחיפה של Unity:
public float pushPower = 2f;
void OnControllerColliderHit(ControllerColliderHit hit)
{
Rigidbody body = hit.collider.attachedRigidbody;
if (body == null || body.isKinematic) return; // אין מה לדחוף
if (hit.moveDirection.y < -0.3f) return; // הוא מתחת לרגליים שלנו
Vector3 pushDir = new Vector3(hit.moveDirection.x, 0f, hit.moveDirection.z);
body.linearVelocity = pushDir * pushPower;
}לכל return יש סיבה. לרצפה ולקירות אין Rigidbody, ולכן body הוא null עבורם, ונוגעים בהם כמעט בכל Move. גוף קינמטי זז רק כשהסקריפט שלו מזיז אותו, ולכן מהירות לא תשפיע עליו. Move שמצביע בתלילות כלפי מטה נגע במשהו שמתחת לרגליים, ואין לדחוף את הארגז שהשחקן עומד עליו.
כיוון הדחיפה שומר רק את x ואת z, כך שהארגז מחליק על הקרקע במקום להידחף לתוכה. הגדרת linearVelocity, במקום הוספת כוח, מזיזה ארגז קל וארגז כבד באותו הקצב; body.AddForce(pushDir * pushPower, ForceMode.Impulse) היה דוחף את הארגז הכבד פחות.
אתגר
בינוניתן לשחקן לבעוט בכדורים שהוא נתקל בהם.
- בקובץ
Kicker.cs, כתובvoid OnControllerColliderHit(ControllerColliderHit hit)וקבל אתRigidbody body = hit.collider.attachedRigidbody;. - השתמש ב-
returnכאשרbodyהוא null או קינמטי, או כאשרhit.moveDirection.y < -0.3f(כדור שנמצא מתחת לרגליים). - הגדר את
body.linearVelocityלכיוון ההליכה עם y בערך 0, כפולkickPower, בתוספתVector3.up * lift.
לחץ על "שחק" והתקדם אל הכדור האדום: הוא עף קדימה ולמעלה. לאחר מכן לחץ על "בדיקה".
נסו בעצמכם
using UnityEngine;
public class Kicker : MonoBehaviour
{
public float kickPower = 6f;
public float lift = 4f;
// בעט בכדורים שהשחקן נתקל בהם
}
כל השיעורים ביחידה בניית משחקים אמיתיים
10פרויקט: משחק פלטפורמה תלת־ממדי
המסלולפלטפורמות נעותתרגלו בעצמכם: Unity אונליין