קווטרניונים
חלק מהיחידה פיזיקה ומשחקיות במסלול ה-Unity של Coddy. שיעור 41 מתוך 63.
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; מחזיר אובייקט לתנוחה ללא סיבוב.
אתגר
בינוניהאקדח מסתובב באמצעות החצים שמאלה וימינה, ומקש הרווח יורה קליע אחד ישר קדימה. שנה את הירי במקש הרווח כך שיירו שלושה קליעים בפריסה: אחד ישר קדימה, אחד מסובב ב־spread (20) מעלות ימינה לכיוון שאליו פונה האקדח, ואחד 20 מעלות שמאלה. הפריסה חייבת להסתובב יחד עם האקדח.
- כל קליע פונה לכיוון משלו (הסקריפט המוכן Bullet מטיס אותו לאורך הכיוון הקדמי שלו).
- כל קליע מתחיל במרחק של יחידה אחת ממרכז האקדח, לאורך הכיוון שלו.
לחץ על Play, הסתובב וירה, ואז לחץ על Check.
נסו בעצמכם
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פרויקט: מרוץ המטבעות
הכדור המתגלגלמטבעות לאיסוף