تأثير الحركة البطيئة في الوحدة

يعد تغيير وتيرة الوقت في Unity أمرًا سهلاً للغاية، كل ما عليك فعله هو تغيير قيمة Time.timeScale.

Time.timeScale هي قيمة في Unity تتحكم في الأحداث المعتمدة على الوقت، مثل وظائف Update، والرسوم المتحركة، والجزيئات، والفيزياء، وما إلى ذلك. عندما يكون مقياس الوقت 1، يمر الوقت بنفس سرعة الوقت الفعلي، مع مرور 0.5 مرة أبطأ مرتين من الوقت الفعلي، ومع 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.

المقالات المقترحة
كيفية استخدام نظام المياه HDRP الجديد في الوحدة
كيفية إعداد جهاز التحكم بعصا التحكم للحركة في الوحدة
مؤشر الهدف في الوحدة
صانع الطقس - رفع بيئات الوحدة إلى آفاق جديدة
كيفية استخدام وحدة تحكم Xbox في الوحدة
البرنامج النصي لإنشاء مفتاح الضوء في الوحدة
Raycast ونص إطلاق النار القائم على المقذوفات من أجل الوحدة