Menu
CoddyTech

مكوّنات صغيرة

جزء من قسم هندسة الألعاب في Unity في رحلة Unity على Coddy. الدرس 1 من 64.

إن كائن اللعبة عبارة عن قائمة من المكوّنات، وكل نص برمجي تكتبه هو مكوّن إضافي. تُبنى ألعاب Unity بإسناد مهمة واحدة لكل نص برمجي، ثم وضع عدة نصوص برمجية على كائن. يمكن أن تكون حركة اللاعب وإطلاقه النار ونقاط صحته كلها ضمن PlayerController واحد، لكن إذا كانت موزعة على ثلاثة مكوّنات، Mover وShooter وHealth، فيمكن وضع كل مكوّن منها على كائنات أخرى أيضًا:

public class Health : MonoBehaviour
{
    public int hp = 3;

    public void TakeDamage(int amount)
    {
        hp -= amount;
        if (hp <= 0)
        {
            Destroy(gameObject);
        }
    }
}
  • اللاعب: Mover, Shooter, Health
  • البرج: Shooter, Health
  • الصندوق: Health

باستخدام فئات C# عادية، قد تنشئ بدلًا من ذلك شجرة: Character، ثم ShootingCharacter : Character، ثم Player : ShootingCharacter. يطلق البرج النار لكنه لا يمشي أبدًا، ولا يفعل الصندوق سوى التحطم، لذا فإن كل نوع جديد من الكائنات يعني إعادة تشكيل الشجرة. أما باستخدام المكوّنات، فالنوع الجديد من الكائنات هو مزيج جديد من النصوص البرمجية الموجودة بالفعل، تُجمع معًا في نافذة Inspector، ويمكن أن تكون لكل نص برمجي قيمه الخاصة هناك: مكوّن Mover بطيء على كائن، وآخر سريع على كائن مختلف.

تشترك المكوّنات الموجودة على كائن واحد في Transform الخاص به، لذا ينبغي لكل مكوّن أن يغيّر الجزء الذي يملكه فقط. إن مكوّن Mover الذي يضيف إلى x وz باستخدام transform.position += يترك y كما هو، لذا يظل بإمكان مكوّن Jumper على الكائن نفسه تغيير الارتفاع. أما مكوّن Mover الذي يعيّن الموضع كله إلى new Vector3(x, 0.5f, z) فسيعيد y إلى قيمته في كل إطار، ويلغي القفزة.

challenge icon

التحدي

سهل

قسّم Boat.cs بحيث تؤدي كل سكربت وظيفة واحدة.

  1. انقل حركة التمايل إلى Bobber: اضبط startY في Start()، ونفّذ حركة التمايل في Update()، باستخدام height وspeed الخاصين بها.
  2. انقل الوميض إلى Blinker، مع مؤقّت خاص بها.
  3. احذف الوظيفتين وحقولهما من Boat، بحيث لا يتولى سوى توجيه القارب.

اضغط على «العب»: تتمايل البطة، ويومض العوام، ويوجّه القارب. ثم اضغط على «تحقق».

جرّب بنفسك

using UnityEngine;
using UnityEngine.InputSystem;

// برنامج نصي واحد، ثلاث مهام: التوجيه والتمايل والوميض.
public class Boat : MonoBehaviour
{
    public float speed = 3f;
    public float bobHeight = 0.1f;
    public float bobSpeed = 2f;
    public Renderer lamp;
    public float blinkInterval = 0.5f;

    private InputAction moveAction;
    private float startY;
    private float blinkTimer;

    void Start()
    {
        moveAction = InputSystem.actions.FindAction("Move");
        startY = transform.position.y;
    }

    void Update()
    {
        // التوجيه
        Vector2 input = moveAction.ReadValue<Vector2>();
        transform.position += new Vector3(input.x, 0f, input.y) * speed * Time.deltaTime;

        // التمايل
        Vector3 p = transform.position;
        p.y = startY + Mathf.Sin(Time.time * bobSpeed) * bobHeight;
        transform.position = p;

        // الوميض
        blinkTimer += Time.deltaTime;
        if (blinkTimer >= blinkInterval)
        {
            blinkTimer -= blinkInterval;
            lamp.enabled = !lamp.enabled;
        }
    }
}

جميع دروس هندسة الألعاب في Unity

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