אפקט הילוך איטי באחדות

שינוי קצב הזמן ב-Unity הוא די קל, כל מה שאתה צריך לעשות הוא לשנות את הערך של Time.timeScale.

Time.timeScale הוא ערך ב-Unity השולט באירועים תלויי זמן, כגון Update פונקציות, אנימציות, חלקיקים, פיזיקה וכו'. כאשר סולם הזמן הוא 1, הזמן חולף מהר כמו זמן אמת, עם 0.5 זמן עובר פי 2 יותר לאט מזמן אמת, ועם 2.0 הזמן עובר פי שניים מהר. Time.timeScale עם הערך של 0 משהה כל חישובים תלויי קצב, מתעלמים מערכים שליליים.

עם זאת, רק הגדרת הערך של timeScale אינה מספיקה כדי ליצור אפקט הילוך איטי אמין.

חלק מהרכיבים כגון AudioSource אינם מושפעים מהזמן, אך למרבה המזל, שינוי הגובה שלהם מספיק כדי להוסיף אפקט של הילוך איטי לאודיו.

הילוך איטי במשחקים מתייחס לאפקט חזותי ולעיתים פונקציונלי שבו המשחק, הגרפיקה והאנימציות מואטות כדי ליצור חוויה דרמטית ומסוגננת. הוא משמש כדי להדגיש רגעי מפתח, לשפר את השליטה בשחקנים או להוסיף כישרון קולנועי לרצפי משחק.

כאשר המשחק נמצא בהילוך איטי, נראה שהכל זז במהירות מופחתת בהשוואה למשחק רגיל. זה יכול לכלול תנועות אופי, אינטראקציות סביבתיות, ואפילו השפעות טיל או חלקיקים. האפקט מושג לעתים קרובות על ידי התאמת קצב הפריימים של המשחק או על ידי מניפולציה של משתנים הקשורים לזמן בקוד המשחק.

כדי ליצור אפקט של הילוך איטי במשחק Unity, נצטרך לכתוב סקריפט שישנה את הערך של Time.timeScale וישנה את הגובה של כל מקורות האודיו הפעילים.

הילוך איטי הוא ההפך מתנועה מהירה והוא תהליך האטת מהירות המשחק.

  • צור סקריפט חדש, קרא לו 'SC_SlowMotionEffect', הסר ממנו הכל ואז הדבק בתוכו את הקוד למטה:

SC_SlowMotionEffect.cs

using UnityEngine;

public class SC_SlowMotionEffect : MonoBehaviour
{
    public float slowMotionTimeScale = 0.5f;
    public bool slowMotionEnabled = false;

    [System.Serializable]
    public class AudioSourceData
    {
        public AudioSource audioSource;
        public float defaultPitch;
    }

    AudioSourceData[] audioSources;

    // Start is called before the first frame update
    void Start()
    {
        //Find all AudioSources in the Scene and save their default pitch values
        AudioSource[] audios = FindObjectsOfType<AudioSource>();
        audioSources = new AudioSourceData[audios.Length];

        for (int i = 0; i < audios.Length; i++)
        {
            AudioSourceData tmpData = new AudioSourceData();
            tmpData.audioSource = audios[i];
            tmpData.defaultPitch = audios[i].pitch;
            audioSources[i] = tmpData;
        }

        SlowMotionEffect(slowMotionEnabled);
    }

    // Update is called once per frame
    void Update()
    {
        //Activate/Deactivate slow motion on key press
        if (Input.GetKeyDown(KeyCode.Q))
        {
            slowMotionEnabled = !slowMotionEnabled;
            SlowMotionEffect(slowMotionEnabled);
        }
    }

    void SlowMotionEffect(bool enabled)
    {
        Time.timeScale = enabled ? slowMotionTimeScale : 1;
        for (int i = 0; i < audioSources.Length; i++)
        {
            if (audioSources[i].audioSource)
            {
                audioSources[i].audioSource.pitch = audioSources[i].defaultPitch * Time.timeScale;
            }
        }
    }
}

  • צרף את הסקריפט למעלה לכל GameObject ואז הקש על 'Q' במשחק כדי להפעיל/לבטל את אפקט ההילוך האיטי.

כדי לוודא ש-Rigidbodies מדומים בצורה חלקה במהלך אפקט ההילוך האיטי, הגדר את ערך ה-Interpolate שלהם ל-Interpolate או Extrapolate.