Menu
CoddyTech

متابعة سلسة

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

الكاميرا التي تنسخ موضع اللاعب مع إضافة إزاحة في LateUpdate() تجعل كل اهتزاز للاعب اهتزازًا في المشهد. تُرجع Vector3.SmoothDamp(current, target, ref velocity, smoothTime) موضعًا يتحرك باتجاه target كما يتحرك نابض مخمّد: تتسارع، ثم تتباطأ كلما اقتربت من الهدف، وتصل إليه من دون تجاوزه. تتبع هذه الكاميرا اللاعب من ارتفاع 3 وحدات ومن مسافة 6 وحدات خلفه، مع تأخير بسيط:

public Transform player;
public Vector3 offset = new Vector3(0, 3, -6);
public float smoothTime = 0.3f;
Vector3 velocity;

void LateUpdate()
{
    Vector3 target = player.position + offset;
    transform.position = Vector3.SmoothDamp(transform.position, target, ref velocity, smoothTime);
}

يمرر ref إلى SmoothDamp المتغير نفسه بدلًا من نسخة منه، ليتمكن الأسلوب من تغييره. تحتفظ SmoothDamp بالسرعة الحالية للكاميرا على المحاور الثلاثة كلها في velocity، وتحتاج إلى استعادتها في الإطار التالي، ولهذا السبب فهي حقل. لو أُعلن عنها داخل LateUpdate()، لبدأت من الصفر في كل إطار، ولتحركت الكاميرا ببطء شديد، قاطعةً نحو نصف بالمئة من المسافة في كل إطار. وبالنسبة إلى قيمة واحدة، مثل تقريب الكاميرا، تعمل Mathf.SmoothDamp بالطريقة نفسها باستخدام سرعة من النوع float.

تحدد smoothTime مقدار تأخر الكاميرا: فعند ضبطها على 0.3، تقطع نحو 60% من قفزة مفاجئة خلال 0.3 ثانية، وتكاد تصل إلى الهدف بعد ثانية واحدة. تؤدي القيمة الأصغر إلى تتبع أكثر إحكامًا. تقرأ SmoothDamp قيمة Time.deltaTime بنفسها، لذلك لا يُضرب أي شيء في الاستدعاء بها.

challenge icon

التحدي

متوسط

اجعل الكاميرا تتبع اللاعب بسلاسة من ارتفاع ثابت.

  1. أضف الحقل Vector3 velocity;.
  2. في LateUpdate()، أنشئ Vector3 target = new Vector3(player.position.x, height, player.position.z - back);، حتى لا تغيّر القفزة موضع العرض.
  3. عيّن transform.position = Vector3.SmoothDamp(transform.position, target, ref velocity, smoothTime);.

اضغط «العب»، وتحرك واقفز: ستتأخر الكاميرا قليلًا، ولن تتمايل أبدًا. ثم اضغط «تحقق».

جرّب بنفسك

using UnityEngine;

public class TopDownCamera : MonoBehaviour
{
    public Transform player;
    public float height = 12f;
    public float back = 5f;
    public float smoothTime = 0.25f;

    void LateUpdate()
    {
        // تحرّك بسلاسة نحو الموضع فوق player على المحور (x)، وعلى بُعد back وحدة خلفه على المحور (z)، مع الحفاظ على ارتفاع ثابت.
    }
}

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

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