Menu
CoddyTech

Vector3 بنية Struct

جزء من قسم أساسيات البرمجة النصية في 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. الحل هو نسخ الموضع، وتغيير النسخة، ثم إسنادها من جديد. يعيد هذا العداء إلى المسار الأوسط عند الضغط على Space:

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

تدرّب بنفسك: Playground لـ Unity