Menu
CoddyTech

زوايا أويلر

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

transform.eulerAngles هو دوران الكائن ممثّلًا بثلاث زوايا بالدرجات حول المحاور x وy وz. تخزّن Unity الدوران على هيئة رباعيّ (الدرس التالي)، وتعيد حساب الزوايا الثلاث في كل مرة تقرؤها، وتكون قيمها دائمًا من 0 إلى 360. أمل الكلّابة إلى ‎-10 درجات حول z ثم اقرأ قيمتها مجددًا:

transform.rotation = Quaternion.Euler(0, 0, -10);
Debug.Log(transform.eulerAngles.z);   // 350

لقد ضبطت القيمة على ‎-10، لكن الشيفرة تقرأ 350، لذا فإن if (transform.eulerAngles.z < -5) لا تكون صحيحة أبدًا. وقد تتغير الأرقام الثلاثة كلها عند قراءة القيم مجددًا: اضبطها على (100, 0, 0) وستقرأ (80, 180, 180)، وهو الاتجاه نفسه مكتوبًا بطريقة أخرى. يسير Quaternion.Euler(x, y, z) في الاتجاه المعاكس ويقبل أي زاوية: ‎-10 و350 و710 تنشئ الدوران نفسه. لذا احتفظ بالزاوية في قيمة float خاصة بك، وغيّرها وحدّد نطاقها هناك، ثم اضبط الدوران كله بناءً عليها. تميل هذه الأرجوحة مع الأسهم وتتوقف عند 20 درجة في كلا الاتجاهين:

public float speed = 40f;
float tilt;

void Update()
{
    tilt += Input.GetAxisRaw("Horizontal") * speed * Time.deltaTime;
    tilt = Mathf.Clamp(tilt, -20f, 20f);
    transform.rotation = Quaternion.Euler(0, 0, tilt);
}

لا تغيّر جزءًا واحدًا من الزوايا التي تقرؤها. لا يترجم transform.eulerAngles.x = 110; (CS1612، كما هو الحال مع position.x)، كما أن نسخ eulerAngles وتغيير x ثم إسناد النسخة مجددًا يبدأ من نسخة Unity للزوايا. بعد ضبطها على (100, 0, 0)، تصبح تلك النسخة (80, 180, 180)؛ أضف 10 إلى x وستحصل على (90, 180, 180)، ما يعيد الكائن إلى 90 بدلًا من مواصلة الدوران إلى 110.

challenge icon

التحدي

متوسط

أصلح حركة مسح الكاميرا: فهي تعود عند 45، ولكن ليس عند -45، لأن eulerAngles.y تقرأ -45 على أنها 315.

  1. أضف حقلًا float angle; واستبدل أول سطرين من Update() بـ angle += direction * speed * Time.deltaTime;.
  2. أبقِ سطري if، ثم اضبط الدوران بالكامل: transform.rotation = Quaternion.Euler(tilt, angle, 0);.

اضغط على «العب»: تمسح الكاميرا من 45 إلى -45 ثم تعود، مع إمالتها إلى الأسفل. ثم اضغط على «تحقق».

جرّب بنفسك

using UnityEngine;

public class Sweep : MonoBehaviour
{
    public float speed = 30f;
    public float limit = 45f;
    public float tilt = 20f;   // درجات إلى الأسفل، حول المحور x
    float direction = 1f;

    void Update()
    {
        transform.Rotate(0, direction * speed * Time.deltaTime, 0, Space.World);
        float angle = transform.eulerAngles.y;
        if (angle > limit) direction = -1f;
        if (angle < -limit) direction = 1f;
    }
}

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

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