Menu
CoddyTech

Vector3 הוא מבנה נתונים

חלק מהיחידה יסודות התכנות ב-Unity במסלול ה-Unity של Coddy. שיעור 22 מתוך 67.

Vector3 הוא struct, סוג של טיפוס שלא נלמד במסלול C#. struct הוא ערך, כמו int: כשמקצים אותו, נוצרת העתקה שלו בשלמותו. אחרי Vector3 b = a; b.x = 9;, הערך של a.x לא משתנה, כי b הוא עותק נפרד. (מחלקה פועלת אחרת: שני משתנים יכולים להפנות לאותו אובייקט משותף.)

transform.position היא מאפיין, וקריאה שלו מחזירה לך עותק של המיקום. לכן transform.position.x = 0; ישנה עותק שנזרק מיד, ו-C# מסרבת לקמפל אותו: error CS1612: Cannot modify the return value of 'Transform.position' because it is not a variable. הפתרון הוא להעתיק את המיקום, לשנות את העותק ולהקצות אותו בחזרה. הרץ הזה חוזר לנתיב האמצעי כשלוחצים על Space:

if (Input.GetKeyDown(KeyCode.Space))
{
    Vector3 p = transform.position;   // העתק
    p.x = 0;                          // שנה את העותק
    transform.position = p;           // הקצה אותו בחזרה
}

אם משמיטים את השורה האחרונה, הקוד מתקמפל, אבל שום דבר לא זז: רק העותק השתנה. transform.localScale ושאר המאפיינים מסוג Vector3 פועלים באותו אופן.

challenge icon

אתגר

קל

המזחלת נופלת במהירות של fall יחידות לשנייה, והחצים מחליקים אותה לאורך ציר x. שתי שורות אמורות להשאיר אותה על הרצפה (y לעולם לא נמוך מ־0.5) ובין הקירות (x מ־-4 עד 4), אבל הסקריפט לא מתקמפל.

לחץ על Play כדי לראות את השגיאות. תקן את שתי השורות על ידי עבודה עם עותק של המיקום, תוך שמירה על מה שהן עושות, ואז לחץ על Check.

נסו בעצמכם

using UnityEngine;

public class Sled : MonoBehaviour
{
    public float speed = 4f;
    public float fall = 3f;

    void Update()
    {
        float h = Input.GetAxisRaw("Horizontal");
        transform.position += new Vector3(h * speed, -fall, 0) * Time.deltaTime;

        // השאר את המזחלת על הרצפה ובין הקירות.
        transform.position.y = Mathf.Max(transform.position.y, 0.5f);
        transform.position.x = Mathf.Clamp(transform.position.x, -4f, 4f);
    }
}
quiz iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

כל השיעורים ביחידה יסודות התכנות ב-Unity