זוויות אוילר
חלק מהיחידה פיזיקה ומשחקיות במסלול ה-Unity של Coddy. שיעור 40 מתוך 63.
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.
אתגר
בינונימצלמת האבטחה שעל העמוד אמורה לנוע מצד לצד באופן רציף: כשהיא פונה קדימה (0 מעלות סביב y), היא פונה ימינה, ערך y גדל, במהירות speed (30) מעלות לשנייה, מסתובבת בחזרה ב-limit (45), נעה לרוחב עד -limit (-45), מסתובבת בחזרה שוב, וכך הלאה. כל הזמן היא שומרת על ההטיה כלפי מטה של tilt (20) מעלות סביב x.
לחצו על Play: קוד ההתחלה מסתובב בחזרה ב-45, אבל ב--45 הוא ממשיך להסתובב. בררו למה ותקנו את הסקריפט, ואז לחצו על Check.
נסו בעצמכם
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פרויקט: מרוץ המטבעות
הכדור המתגלגלמטבעות לאיסוף