קווטרניונים
חלק מהיחידה פיזיקה ומשחקיות במסלול ה-Unity של Coddy. שיעור 43 מתוך 71.
Quaternion הוא הטיפוס של Unity עבור סיבוב: transform.rotation הוא אחד כזה, וכך גם הערך שמחזירה Quaternion.Euler. ארבעת המספרים שלו, x, y, z ו-w, אינם זוויות, ואין צורך לקבוע אותם בעצמך. כשעובדים עם סיבובים, כופלים. סיבוב כפול וקטור מסובב את הווקטור:
Vector3 a = Quaternion.Euler(0, 90, 0) * Vector3.forward; // (1, 0, 0)
Vector3 b = Quaternion.Euler(0, 0, 45) * new Vector3(2, 0, 0); // (1.41, 1.41, 0)
Vector3 lamp = transform.position + transform.rotation * new Vector3(0, 1, 2);הסיבוב מופיע משמאל: הביטוי Vector3.forward * transform.rotation לא מתקמפל. בשורה השלישית, היסט מסובב בהתאם לסיבוב של האובייקט עצמו, ולכן lamp היא הנקודה שנמצאת יחידה אחת מעל ו-2 יחידות לפני האובייקט בכיוונים שלו עצמו, בלי קשר לכיוון שאליו הוא פונה.
סיבוב כפול סיבוב משלב בין שני הסיבובים. הביטוי transform.rotation * Quaternion.Euler(0, 90, 0) מחיל על סיבוב האובייקט רבע סיבוב סביב ציר ה-y שלו עצמו; אם מחליפים את הסדר, רבע הסיבוב הוא סביב ציר ה-y של העולם. עבור אובייקט זקוף, שתי האפשרויות נותנות אותה תוצאה. עבור מטוס שמוטה ב-30 מעלות הן אינן נותנות אותה תוצאה, מכיוון שציר ה-y שלו נוטה יחד איתו:
Quaternion banked = Quaternion.Euler(0, 0, 30);
Quaternion own = banked * Quaternion.Euler(0, 90, 0); // החרטום (0.87, 0.5, 0): עולה תוך כדי פנייה
Quaternion world = Quaternion.Euler(0, 90, 0) * banked; // החרטום (1, 0, 0): נשאר בגובה קבועQuaternion.identity הוא היעדר מוחלט של סיבוב, וזהו הערך שהעברת אל Instantiate. כפל בו לא משנה דבר, והפקודה transform.rotation = Quaternion.identity; מחזירה את האובייקט למצבו ללא סיבוב.
אתגר
בינוניגרום למקש הרווח לירות מטח של שלושה כדורים שמסתובבים עם האקדח.
- החלף את שורת
Instantiateב-for (int i = -1; i <= 1; i++). - בתוכה, הגדר
Quaternion aim = transform.rotation * Quaternion.Euler(0, i * spread, 0);. - צור כל כדור במרחק של יחידה אחת בכיוון שלו:
Instantiate(bulletPrefab, transform.position + aim * Vector3.forward, aim);.
לחץ על "שחק", הסתובב וירה: שלושה כדורים מתפזרים, במרווחים של 20 מעלות. לאחר מכן לחץ על "בדיקה".
נסו בעצמכם
using UnityEngine;
public class Gun : MonoBehaviour
{
public GameObject bulletPrefab;
public float turnSpeed = 90f;
public float spread = 20f;
void Update()
{
if (Input.GetKey(KeyCode.RightArrow)) transform.Rotate(0, turnSpeed * Time.deltaTime, 0);
if (Input.GetKey(KeyCode.LeftArrow)) transform.Rotate(0, -turnSpeed * Time.deltaTime, 0);
if (Input.GetKeyDown(KeyCode.Space))
{
// קליע אחד, ישר קדימה. יש לירות שלושה קליעים בזוויות של -spread, 0 ו-spread מעלות.
Instantiate(bulletPrefab, transform.position, transform.rotation);
}
}
}
כל השיעורים ביחידה פיזיקה ומשחקיות
1גוף קשיח
כוח הכבידה והמסהדחיפה באמצעות AddForceקפיצה באמצעות מתקףFixedUpdate לפיזיקהמהירותגופים קינמטייםחזרה: משטח שיגור2התנגשויות
OnCollisionEnterבמה פגעתי?להישבר בעת פגיעהלעמוד על הקרקעניתור וחיכוךצורות Colliderסיכום: קיר שביר5פרויקט: מרוץ המטבעות
הכדור המתגלגלמטבעות לאיסוףתרגלו בעצמכם: Unity אונליין