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) לעולם אינו true. הערכים שמתקבלים בקריאה בחזרה יכולים לשנות את כל שלושת המספרים: הגדר (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;
    }
}

כל השיעורים ביחידה פיזיקה ומשחקיות

תרגלו בעצמכם: Unity אונליין