Menu
CoddyTech

רעידות מצלמה

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

טלטול הוא רצף קצר של היסטים אקראיים: במשך כמה עשיריות שנייה המצלמה נמצאת בנקודה אקראית ליד מיקום המנוחה שלה, נקודה חדשה בכל פריים, ואז חוזרת. קורוטינה מתאימה לכך, כי היא פועלת לאורך כמה פריימים ומסתיימת מעצמה. המצלמה הזו רועדת כשסלע נוחת (סקריפט אחר קורא ל־BoulderLanded(); הקובץ מתחיל ב־using System.Collections; עבור IEnumerator):

public float strength = 0.2f;
public float duration = 0.4f;
Vector3 rest;

void Start()
{
    rest = transform.localPosition;
}

public void BoulderLanded()
{
    StartCoroutine(Shake());
}

IEnumerator Shake()
{
    float elapsed = 0f;
    while (elapsed < duration)
    {
        transform.localPosition = rest + Random.insideUnitSphere * strength;
        elapsed += Time.deltaTime;
        yield return null;
    }
    transform.localPosition = rest;
}

Random.insideUnitSphere * strength הוא היסט אקראי באורך של עד strength לכל כיוון, ו־yield return null בוחר היסט חדש בפריים הבא. הוספת Time.deltaTime בכל איטרציה סופרת שניות אמיתיות, כך שהטלטול נמשך duration בכל קצב פריימים. השורה האחרונה מחזירה את המצלמה; בלעדיה, המצלמה נשארת במקום שבו השאיר אותה ההיסט האחרון.

בכל פריים, Unity מריצה את כל הפונקציות Update(), אחר כך את הקורוטינות שממתינות ל־yield return null, ואז את כל הפונקציות LateUpdate(). לכן, מצלמת מעקב שמגדירה את המיקום שלה ב־LateUpdate() דורסת את כל מה שהטלטול עשה. טלטול של localPosition מונע זאת כשהמצלמה היא אובייקט־ילד של אובייקט ריק שאחראי למעקב: האובייקט ההורה זז, והמצלמה רועדת סביב מיקומה מתחתיו.

challenge icon

אתגר

בינוני

המצלמה הזו עוקבת אחרי השחקן (החצים מזיזים אותה): ב־LateUpdate() היא נמצאת במיקום של השחקן ועוד offset, והיא אינה צאצא של שום אובייקט. הוסף לה רעידה שפועלת בזמן שהיא עוקבת:

  • מקש הרווח מרעיד אותה במשך duration (0.4) שניות. בכל פריים של הרעידה, המצלמה נמצאת במיקום אקראי חדש, במרחק של עד strength (0.3) ממיקום המעקב שלה, ובו בזמן היא ממשיכה לעקוב אחרי השחקן.
  • כשהרעידה מסתיימת, המצלמה חוזרת בדיוק למיקום המעקב שלה.

מקש הרווח כבר מפעיל את הקורוטינה Shake(). לחץ על Play, רוץ ולחץ על מקש הרווח, ואז לחץ על Check.

נסו בעצמכם

using System.Collections;
using UnityEngine;

public class ShakeFollow : MonoBehaviour
{
    public Transform player;
    public Vector3 offset = new Vector3(0, 4, -8);
    public float strength = 0.3f;
    public float duration = 0.4f;

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            StartCoroutine(Shake());
        }
    }

    void LateUpdate()
    {
        transform.position = player.position + offset;
    }

    IEnumerator Shake()
    {
        // נער את המצלמה למשך duration שניות, עד למרחק strength ממיקום המעקב שלה.
        yield return null;
    }
}
quiz iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

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