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

كواتيرنيونات

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

إن Quaternion هو النوع الذي تستخدمه Unity للدوران: فـ transform.rotation هو أحدها، وكذلك القيمة التي تُعيدها Quaternion.Euler. أرقامه الأربعة x وy وz وw ليست زوايا، ولا تحتاج أبدًا إلى تعيينها بنفسك. ما تفعله بالدورانات هو ضربها. ضرب دوران في متجه يدوّر المتجه:

Vector3 a = Quaternion.Euler(0, 90, 0) * Vector3.forward;       // (1, 0, 0)
Vector3 b = Quaternion.Euler(0, 0, 45) * new Vector3(2, 0, 0);  // (1.41, 1.41, 0)
Vector3 lamp = transform.position + transform.rotation * new Vector3(0, 1, 2);

يوضع الدوران على اليسار: التعبير Vector3.forward * transform.rotation لا يُترجم إلى صيغة قابلة للتنفيذ. السطر الثالث يدوّر إزاحةً وفق دوران الكائن نفسه، لذا فإن lamp هي النقطة الواقعة على ارتفاع وحدة واحدة وأمام الكائن بمقدار وحدتين، وفق اتجاهاته الخاصة، أيًا كان الاتجاه الذي يواجهه.

ضرب دوران في دوران يجمع الدورانين. التعبير transform.rotation * Quaternion.Euler(0, 90, 0) يعني دوران الكائن متبوعًا بربع دورة حول محور y الخاص به؛ وعند عكس الترتيب، تكون ربع الدورة حول محور y العالمي. يعطي كلاهما النتيجة نفسها للكائن المنتصب. أما بالنسبة إلى طائرة مائلة بزاوية 30 درجة، فهما لا يعطيان النتيجة نفسها، لأن محور y الخاص بها يميل معها:

Quaternion banked = Quaternion.Euler(0, 0, 30);
Quaternion own = banked * Quaternion.Euler(0, 90, 0);    // المقدمة (0.87, 0.5, 0): ترتفع أثناء الانعطاف
Quaternion world = Quaternion.Euler(0, 90, 0) * banked;  // المقدمة (1, 0, 0): تبقى على المستوى نفسه

إن Quaternion.identity يعني عدم وجود دوران إطلاقًا، وهو الدوران الذي مرّرته إلى Instantiate. الضرب به لا يغيّر شيئًا، أما transform.rotation = Quaternion.identity; فيعيد الكائن إلى وضعيته من دون دوران.

challenge icon

التحدي

متوسط

يدور السلاح باستخدام السهمين الأيسر والأيمن، ويُطلق مفتاح المسافة رصاصة واحدة إلى الأمام مباشرةً. اجعل مفتاح المسافة يُطلق ثلاث رصاصات متفرقة بدلًا من ذلك: واحدة إلى الأمام مباشرةً، وواحدة بزاوية spread (20) درجة إلى يمين اتجاه السلاح، وواحدة بزاوية 20 درجة إلى اليسار. يجب أن يدور انتشار الطلقات مع السلاح.

  • تتجه كل رصاصة نحو اتجاهها الخاص (نصّ Bullet الجاهز يحرّكها على امتداد اتجاهها الأمامي).
  • تبدأ كل رصاصة على بُعد وحدة واحدة من مركز السلاح، في اتجاهها الخاص.

اضغط على تشغيل، وأدر السلاح وأطلق، ثم اضغط على تحقّق.

جرّب بنفسك

using UnityEngine;

public class Gun : MonoBehaviour
{
    public GameObject bulletPrefab;
    public float turnSpeed = 90f;
    public float spread = 20f;

    void Update()
    {
        if (Input.GetKey(KeyCode.RightArrow)) transform.Rotate(0, turnSpeed * Time.deltaTime, 0);
        if (Input.GetKey(KeyCode.LeftArrow)) transform.Rotate(0, -turnSpeed * Time.deltaTime, 0);

        if (Input.GetKeyDown(KeyCode.Space))
        {
            // رصاصة واحدة إلى الأمام مباشرةً. أطلق ثلاث رصاصات بزوايا: -spread و0 وspread درجة.
            Instantiate(bulletPrefab, transform.position, transform.rotation);
        }
    }
}
quiz iconاختبر نفسك

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

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