كواتيرنيونات
جزء من قسم الفيزياء وأسلوب اللعب في رحلة Unity على Coddy. الدرس 43 من 71.
إن 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; يعيد الكائن إلى وضعه من دون دوران.
التحدي
متوسطاجعل زر المسافة يطلق رشقة من ثلاث رصاصات تدور مع السلاح.
- استبدل سطر
Instantiateبـfor (int i = -1; i <= 1; i++). - داخله، عيّن
Quaternion aim = transform.rotation * Quaternion.Euler(0, i * spread, 0);. - أطلق كل رصاصة على بُعد وحدة واحدة في اتجاهها:
Instantiate(bulletPrefab, transform.position + aim * Vector3.forward, aim);.
اضغط على «العب»، واستدر وأطلق: ستنتشر ثلاث رصاصات، تفصل بينها زاوية 20 درجة. ثم اضغط على «تحقق».
جرّب بنفسك
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);
}
}
}
جميع دروس الفيزياء وأسلوب اللعب
1الجسم الصلب (Rigidbody)
الجاذبية والكتلةالدفع باستخدام AddForceالقفز باستخدام دفعةFixedUpdate للفيزياءالسرعة المتجهةالأجسام الحركيةمراجعة: منصة الإطلاق4الكوروتينات
InvokeInvokeRepeating, CancelInvokeأول Coroutine لكالحلقات داخل الكوروتيناتإيقاف الكوروتيناتمراجعة: العد التنازلي10المشروع: الهروب من الحلبة
الحلبةالصيادونتدرّب بنفسك: Playground لـ Unity