Menu
CoddyTech

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

חלק מהיחידה יסודות הסקריפטים ב-Unity במסלול ה-Unity של Coddy. שיעור 29 מתוך 85.

Vector3 הוא 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. הפתרון הוא להעתיק את המיקום, לשנות את העותק ולהשיב אותו למאפיין. הדמות הזו חוזרת לנתיב האמצעי כשלוחצים על מקש הרווח:

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

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

challenge icon

אתגר

קל

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

  1. החליפו את שתי השורות שמגדירות את transform.position.y ואת .x בעותק: Vector3 p = transform.position;.
  2. הגדירו p.y = Mathf.Max(p.y, 0.5f); וגם p.x = Mathf.Clamp(p.x, -4f, 4f);, ואז transform.position = p;.

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

נסו בעצמכם

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);
    }
}

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

תרגלו בעצמכם: Unity אונליין