زوايا أويلر
جزء من قسم الفيزياء وأسلوب اللعب في رحلة 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.
التحدي
متوسطأصلح حركة مسح الكاميرا: فهي تعود عند 45، ولكن ليس عند -45، لأن eulerAngles.y تقرأ -45 على أنها 315.
- أضف حقلًا
float angle;واستبدل أول سطرين منUpdate()بـangle += direction * speed * Time.deltaTime;. - أبقِ سطري
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;
}
}
جميع دروس الفيزياء وأسلوب اللعب
1الجسم الصلب (Rigidbody)
الجاذبية والكتلةالدفع باستخدام AddForceالقفز باستخدام دفعةFixedUpdate للفيزياءالسرعة المتجهةالأجسام الحركيةمراجعة: منصة الإطلاق4الكوروتينات
InvokeInvokeRepeating, CancelInvokeأول Coroutine لكالحلقات داخل الكوروتيناتإيقاف الكوروتيناتمراجعة: العد التنازلي10المشروع: الهروب من الحلبة
الحلبةالصيادونتدرّب بنفسك: Playground لـ Unity