זוויות אוילר
חלק מהיחידה פיזיקה ומשחקיות במסלול ה-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.
אתגר
בינוניתקנו את תנועת הסריקה של המצלמה: היא מסתובבת חזרה ב־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גוף קשיח
כוח הכבידה והמסהדחיפה באמצעות AddForceקפיצה באמצעות מתקףFixedUpdate לפיזיקהמהירותגופים קינמטייםחזרה: משטח שיגור2התנגשויות
OnCollisionEnterבמה פגעתי?להישבר בעת פגיעהלעמוד על הקרקעניתור וחיכוךצורות Colliderסיכום: קיר שביר5פרויקט: מרוץ המטבעות
הכדור המתגלגלמטבעות לאיסוףתרגלו בעצמכם: Unity אונליין