Menu
CoddyTech

מעקב חלק

חלק מהיחידה פיזיקה ומשחקיות במסלול ה-Unity של Coddy. שיעור 47 מתוך 71.

מצלמה שמעתיקה את המיקום של השחקן בתוספת היסט בתוך LateUpdate() הופכת כל טלטלה של השחקן לטלטלה של התצוגה. Vector3.SmoothDamp(current, target, ref velocity, smoothTime) מחזירה מיקום שנע לעבר target כמו קפיץ מרוסן: היא מאיצה, מאטה כשהיא מתקרבת ליעד ומגיעה אליו בלי לעבור אותו. המצלמה הזו עוקבת אחרי השחקן מגובה של 3 יחידות וממרחק של 6 מאחוריו, באיחור קל:

public Transform player;
public Vector3 offset = new Vector3(0, 3, -6);
public float smoothTime = 0.3f;
Vector3 velocity;

void LateUpdate()
{
    Vector3 target = player.position + offset;
    transform.position = Vector3.SmoothDamp(transform.position, target, ref velocity, smoothTime);
}

ref מעביר ל-SmoothDamp את המשתנה עצמו במקום עותק שלו, כך שהמתודה יכולה לשנות אותו. SmoothDamp שומרת את המהירות הנוכחית של המצלמה בכל שלושת הצירים בתוך velocity, וזקוקה לה שוב בפריים הבא, ולכן זהו שדה. אילו הוצהר בתוך LateUpdate(), הוא היה מתחיל מאפס בכל פריים והמצלמה הייתה זוחלת, ומתקדמת בערך חצי אחוז מהדרך בכל פריים. עבור מספר יחיד, כמו הזום של מצלמה, Mathf.SmoothDamp פועלת באותה דרך עם מהירות מסוג float.

smoothTime קובע עד כמה המצלמה משתרכת מאחור: בערך 0.3, היא מכסה כ-60% מקפיצה פתאומית בתוך 0.3 שניות וכמעט מגיעה אחרי שנייה אחת. ערך קטן יותר גורם לה לעקוב באופן הדוק יותר. SmoothDamp קוראת בעצמה את Time.deltaTime, ולכן אין להכפיל בו שום דבר בקריאה.

challenge icon

אתגר

בינוני

גרום למצלמה לעקוב אחרי השחקן בצורה חלקה מגובה קבוע.

  1. הוסף שדה Vector3 velocity;.
  2. ב־LateUpdate(), צור Vector3 target = new Vector3(player.position.x, height, player.position.z - back);, כדי שקפיצה לא תזיז את התצוגה.
  3. הגדר transform.position = Vector3.SmoothDamp(transform.position, target, ref velocity, smoothTime);.

לחץ על „שחק”, רוץ וקפוץ: המצלמה משתרכת מעט מאחור, ולעולם אינה מתנדנדת. לאחר מכן לחץ על „בדיקה”.

נסו בעצמכם

using UnityEngine;

public class TopDownCamera : MonoBehaviour
{
    public Transform player;
    public float height = 12f;
    public float back = 5f;
    public float smoothTime = 0.25f;

    void LateUpdate()
    {
        // התקרב בהדרגה לנקודה שמעל השחקן (x), במרחק back יחידות מאחוריו (z), בגובה קבוע.
    }
}

כל השיעורים ביחידה פיזיקה ומשחקיות

תרגלו בעצמכם: Unity אונליין