רדוף אחרי השחקן
חלק מהיחידה פיזיקה ומשחקיות במסלול ה-Unity של Coddy. שיעור 50 מתוך 63.
אויב שרודף אחרי השחקן זקוק ל־Rigidbody, כך שקירות יעצרו אותו והוא יוכל לדחוף ולהידחף. המרדף עצמו מתבצע באמצעות מהירות המכוונת אל השחקן, ומוגדרת פעם אחת בכל צעד פיזיקה. הזומבי הזה הולך לעבר כל מה שנמצא במשבצת player שלו:
[SerializeField] private Transform player;
[SerializeField] private float speed = 2.5f;
private Rigidbody rb;
void Start()
{
rb = GetComponent<Rigidbody>();
}
void FixedUpdate()
{
Vector3 toPlayer = player.position - rb.position;
toPlayer.y = 0f;
Vector3 dir = toPlayer.normalized;
rb.linearVelocity = new Vector3(dir.x * speed, rb.linearVelocity.y, dir.z * speed);
}player.position - rb.position מצביע מהזומבי אל השחקן. ערך ה־y שלו מוגדר ל־0, כך שהזומבי הולך במישור גם כשהשחקן עומד גבוה או נמוך יותר, ו־normalized נותן לו אורך של 1, כך שהזומבי הולך במהירות speed בין שהשחקן נמצא במרחק של 2 יחידות ובין שהוא נמצא במרחק של 20. המהירות החדשה משמרת את מהירות ה־y הישנה, כך שכוח הכבידה עדיין מושך את הזומבי למטה כשהוא יורד ממדרגה. האפשרות Freeze Rotation מופעלת ב־Rigidbody שלו, כך שהוא לא נוטה כשהוא הולך.
מהירות שאת מגדירה יוצרת הולך שמתחיל ללכת ומסתובב מיד. אפשר לדחוף אויב כבד באמצעות AddForce בתוך אותו FixedUpdate: הוא צובר מהירות, שומר על התנופה שלו וממשיך מעבר לשחקן כשהשחקן זז הצידה. הימנעי מהזזת ה־Transform של רודף: כך הוא עלול להימצא בתוך קיר באותה קלות כמו בכל מקום אחר, ומנוע הפיזיקה יכול רק לדחוף אותו החוצה לאחר מכן.
אתגר
בינוניסלע מתגלגל בעקבות השחקן. כתבו את הסקריפט Boulder עבור הסלע, שהוא כדור עם Rigidbody. ה-Inspector מקצה לו את player (השחקן) ואת force (6). הסקריפט Player מוכן: החצים מזיזים את השחקן.
- בכל צעד פיזיקלי, דחפו את הסלע לעבר השחקן באמצעות
AddForce, בעוצמה שלforceבין שהשחקן קרוב ובין שהוא רחוק. - דחפו לאורך הקרקע בלבד, בלי רכיב למעלה או למטה, גם כשהשחקן עומד על הקצה.
- אל תזיזו את ה-Transform שלו ואל תקפיאו את הסיבוב שלו: החיכוך גורם לו להתגלגל.
לחצו על Play, התרוצצו במעגלים סביב הסלע, ואז לחצו על Check.
נסו בעצמכם
using UnityEngine;
public class Boulder : MonoBehaviour
{
[SerializeField] private Transform player;
[SerializeField] private float force = 6f;
private Rigidbody rb;
void Start()
{
rb = GetComponent<Rigidbody>();
}
void FixedUpdate()
{
// דחוף את הסלע לעבר השחקן לאורך הקרקע
}
}
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה פיזיקה ומשחקיות
1גוף קשיח
כוח הכבידה והמסהדחיפה באמצעות AddForceקפיצה באמצעות מתקףFixedUpdate לפיזיקהמהירותגופים קינמטייםחזרה: משטח שיגור2התנגשויות
OnCollisionEnterבמה פגעתי?להישבר בעת פגיעהלעמוד על הקרקעניתור וחיכוךצורות Colliderסיכום: קיר שביר5פרויקט: מרוץ המטבעות
הכדור המתגלגלמטבעות לאיסוף