Menu
CoddyTech

كاميرا مدارية

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

للدوران حول نقطة، احتفظ بزاوية، ودوّر إزاحة ثابتة بها، ثم أضف الناتج إلى النقطة. يؤدي ضرب متجه في دوران إلى تدويره: ‏Quaternion.Euler(0, angle, 0) * offset يدير الإزاحة حول المحور y، ويبقى طولها وارتفاعها كما هما. تدور هذه الكاميرا حول تمثال بمعدل 20 درجة في الثانية، وتظل دائمًا على ارتفاع 3 وحدات وبُعد 6 وحدات عنه:

public Transform statue;
public float speed = 20f;
float angle;

void LateUpdate()
{
    angle += speed * Time.deltaTime;
    Vector3 offset = new Vector3(0, 3, -6);
    transform.position = statue.position + Quaternion.Euler(0, angle, 0) * offset;
    transform.LookAt(statue);
}

عندما تكون الزاوية 0، تكون الإزاحة (0, 3, -6)، لذا تكون الكاميرا خلف التمثال. وعندما تكون 90، تصبح (-6, 3, 0)، عند جانب التمثال في اتجاه -x، وعندما تكون 180، تصبح (0, 3, 6)، أمامه. تحريك الكاميرا لا يوجّهها، لذا يوجّهها LookAt مجددًا نحو التمثال من كل موضع جديد.

ترفع زاوية ثانية الكاميرا: يدير Quaternion.Euler(pitch, yaw, 0) * new Vector3(0, 0, -distance) اتجاه الخلف إلى الأعلى بمقدار pitch (فالدوران الموجب حول x يميل (0, 0, -1) إلى الأعلى)، ثم يديره حول المحور بمقدار yaw، لذا تبقى الكاميرا على بُعد distance من الهدف عند أي زاوية.

تُخزَّن الزاوية في حقل خاص بك، كما في زوايا أويلر: يمكنها تجاوز 360 أو الانخفاض عن 0 من دون قفزة، ويمكنك تقييدها أو تغييرها من لوحة المفاتيح. يؤدي تنفيذ ذلك في LateUpdate() إلى وضع الكاميرا بعد تحريك التمثال أو اللاعب خلال الإطار.

challenge icon

التحدي

متوسط

اجعل اللاعب يحرّك الكاميرا حول البرج.

  1. في Update()، يغيّر السهمان الأيمن والأيسر yaw بمقدار turnSpeed، ويغيّر السهمان العلوي والسفلي pitch بمقدار tiltSpeed، مضروبًا في Time.deltaTime.
  2. ثم أبقِ pitch = Mathf.Clamp(pitch, 10f, 60f);.
  3. في LateUpdate()، اضبط transform.position = target.position + Quaternion.Euler(pitch, yaw, 0) * new Vector3(0, 0, -distance);، ثم transform.LookAt(target);.

اضغط على «العب» وحلّق حول البرج. ثم اضغط على «تحقق».

جرّب بنفسك

using UnityEngine;

public class OrbitCamera : MonoBehaviour
{
    public Transform target;
    public float distance = 8f;
    public float turnSpeed = 90f;
    public float tiltSpeed = 45f;
    public float yaw = 0f;
    public float pitch = 30f;

    void Update()
    {
        // تغيّر مفاتيح الأسهم قيمتي yaw وpitch.
    }

    void LateUpdate()
    {
        // ضع الكاميرا حول target ووجّهها نحوه.
    }
}

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

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