تأثير الحركة البطيئة في الوحدة
يعد تغيير وتيرة الوقت في 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.