Menu
CoddyTech

Vector3 Bir Struct'tır

Coddy'nin Unity Journey'sinin Unity'de Script Yazmanın Temelleri bölümünün bir parçası. Ders 29 / 85.

Vector3, henüz karşılaşmadığın bir tür olan bir struct'tır. Struct, int gibi bir değerdir: atadığında tamamı kopyalanır. Vector3 b = a; b.x = 9; işleminden sonra b ayrı bir kopya olduğu için a.x değişmeden kalır. (Sınıf ise tam ters şekilde çalışır: iki değişken aynı paylaşılan nesneye başvurabilir.)

transform.position bir özelliktir ve okuduğunda konumun bir kopyasını verir. Bu nedenle transform.position.x = 0; hemen atılacak bir kopyayı değiştirirdi ve C# kodun derlenmesini reddeder: error CS1612: Cannot modify the return value of 'Transform.position' because it is not a variable. Çözüm, konumu kopyalamak, kopyayı değiştirmek ve tekrar atamaktır. Bu çalıştırıcı, Space tuşuna basıldığında orta şeride döner:

if (Input.GetKeyDown(KeyCode.Space))
{
    Vector3 p = transform.position;   // kopyala
    p.x = 0;                          // kopyayı değiştir
    transform.position = p;           // değiştirilen kopyayı geri ata
}

Son satırı çıkarırsan kod derlenir, ancak hiçbir şey hareket etmez: yalnızca kopya değişmiştir. transform.localScale ve diğer Vector3 özellikleri de aynı şekilde çalışır.

challenge icon

Görev

Kolay

Kızak betiğinin derlenmesini sağlayarak yerde ve duvarların arasında kalmasını sağla.

  1. transform.position.y ve .x değerlerini ayarlayan iki satırı şu kopyalamayla değiştir: Vector3 p = transform.position;.
  2. p.y = Mathf.Max(p.y, 0.5f); ve p.x = Mathf.Clamp(p.x, -4f, 4f); ayarla, ardından transform.position = p; yaz.

“Oyna” düğmesine bas: kızak yere iner ve duvarlar onu durdurur. Ardından “Kontrol et” düğmesine bas.

Kendin dene

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;

        // Kızağı zeminde ve duvarların arasında tut.
        transform.position.y = Mathf.Max(transform.position.y, 0.5f);
        transform.position.x = Mathf.Clamp(transform.position.x, -4f, 4f);
    }
}

Unity'de Script Yazmanın Temelleri bölümündeki tüm dersler

Kendi başına pratik yap: Unity playground