Menu
CoddyTech
flag Ar iconالعربيةdown icon

اهتزاز الكاميرا

جزء من قسم الفيزياء وأسلوب اللعب في رحلة 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، وهي ليست ابنًا لأي شيء. أضف إليها اهتزازًا يعمل أثناء تتبعها:

  • يهز الضغط على Space الكاميرا لمدة duration (0.4) ثانية. في كل إطار من الاهتزاز، تكون الكاميرا في موضع عشوائي جديد يبعد مسافة لا تتجاوز strength (0.3) عن موضع التتبع، مع استمرارها في تتبع اللاعب.
  • عند انتهاء الاهتزاز، تعود تمامًا إلى موضع التتبع.

يبدأ Space بالفعل coroutine Shake(). اضغط Play، وتحرك واضغط Space، ثم اضغط 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اختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس الفيزياء وأسلوب اللعب