Menu
CoddyTech

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

جزء من قسم الفيزياء وأسلوب اللعب في رحلة Unity على Coddy. الدرس 50 من 71.

الاهتزاز هو سلسلة قصيرة من الإزاحات العشوائية: لبضعة أعشار من الثانية، تستقر الكاميرا في موضع عشوائي قريب من موضع سكونها، ويتغير هذا الموضع في كل إطار، ثم تعود إلى مكانها. يناسب ذلك الروتين المشترك، لأنه يعمل على مدى عدة إطارات وينتهي من تلقاء نفسه. تهتز هذه الكاميرا عندما تسقط صخرة (يستدعي نص برمجي آخر 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

التحدي

متوسط

اجعل الكاميرا التالية تهتز عند الضغط على مفتاح المسافة.

  1. أضف حقلًا Vector3 shake;، وفي LateUpdate() عيّن transform.position = player.position + offset + shake;.
  2. في Shake()، طالما أن elapsed < duration: نفّذ shake = Random.insideUnitSphere * strength;، وأضف Time.deltaTime إلى elapsed، ثم yield return null;.
  3. بعد الحلقة، عيّن shake = Vector3.zero;.

اضغط «العب»، وتحرك واضغط على مفتاح المسافة: ستهتز الرؤية أثناء متابعتها لك. ثم اضغط «تحقق».

جرّب بنفسك

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;
    }
}

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

تدرّب بنفسك: Playground لـ Unity