Menu
CoddyTech

إجراءات الإدخال

جزء من قسم إنشاء ألعاب حقيقية في رحلة Unity على Coddy. الدرس 47 من 60.

إن اختبار المفاتيح واحدًا تلو الآخر يربط النص البرمجي بلوحة المفاتيح. يعبّر الإجراء عن فعل اللاعب بدلًا من ذلك، ويحدّد المشروع المفاتيح والعصي والأزرار التي تفعّله. يأتي مشروع Unity 6 جديد ومعه مجموعة من الإجراءات (الأصل InputSystem_Actions، المضبوط ليكون مجموعة الإجراءات على مستوى المشروع)، وتضم خريطة Player فيه Move (مفاتيح WASD والأسهم والعصا اليسرى لوحدة التحكم)، وLook (الفأرة أو العصا اليمنى)، وAttack (زر الفأرة الأيسر وEnter)، وInteract (E، عند الاستمرار في الضغط عليه)، وCrouch (C)، وJump (Space وزر الجنوب في وحدة التحكم)، وPrevious وNext (1 و2)، وSprint (Left Shift). تكون هذه الإجراءات مفعّلة منذ البداية، ويجلب InputSystem.actions.FindAction("Jump") إجراءً بالاسم. تتحرك رافعة المخلب هذه، التي تُرى من الجانب، على المحورين x وy، وتلتقط الأشياء عند الضغط على Jump:

using UnityEngine;
using UnityEngine.InputSystem;

public class ClawCrane : MonoBehaviour
{
    public float speed = 3f;

    private InputAction moveAction;
    private InputAction jumpAction;

    void Start()
    {
        moveAction = InputSystem.actions.FindAction("Move");
        jumpAction = InputSystem.actions.FindAction("Jump");
    }

    void Update()
    {
        Vector2 input = moveAction.ReadValue<Vector2>();
        transform.position += new Vector3(input.x, input.y, 0f) * speed * Time.deltaTime;

        if (jumpAction.WasPressedThisFrame())
            Debug.Log("Grab!");
    }
}

يُعثر على الإجراءات مرة واحدة في Start، ثم تُحفَظ في حقول InputAction. يعطي Move قيمة Vector2: يمثّل x الاتجاهين اليمين واليسار، ويمثّل y الاتجاهين الأعلى والأسفل على المفاتيح. وتكون القيمة مُطبّعة، لذا فإن الضغط على W وD معًا يعطي (0.71, 0.71) بدلًا من (1, 1). وبما أن المشهد يُرى من الجانب، تستخدم الرافعة y للارتفاع؛ أما اللعبة التي تُرى من الأعلى فتستخدمها للمحور z. تستجيب إجراءات الأزرار كما تستجيب المفاتيح: WasPressedThisFrame() وWasReleasedThisFrame() وIsPressed(). ثمة خطآن يتسببان في استثناء: يؤدي الخطأ الإملائي في الاسم إلى إرجاع FindAction القيمة null (وإلى NullReferenceException عند أول قراءة)، كما يؤدي استدعاء ReadValue<Vector3>() على Move إلى رمي InvalidOperationException فور الضغط على أحد المفاتيح، لأن Move يحمل قيمة Vector2.

challenge icon

التحدي

متوسط

حرّك المسّاح وازرع الأعلام باستخدام إجراءات المشروع.

  1. في Start()، عيّن moveAction وjumpAction وattackAction باستخدام InputSystem.actions.FindAction("Move") و"Jump" و"Attack".
  2. في Update()، حرّك المسّاح باستخدام moveAction.ReadValue<Vector2>() مضروبًا في speed، واجعل مركبة y على محور z.
  3. استدعِ Plant() عند jumpAction.WasPressedThisFrame()، واستدعِ PullUp() عند الضغط على Attack.

اضغط على «العب»، وازرع ثلاثة أعلام، ثم انقر لاقتلاع أحدها. بعد ذلك اضغط على «تحقق».

جرّب بنفسك

using System.Collections.Generic;
using UnityEngine;
using UnityEngine.InputSystem;

public class Surveyor : MonoBehaviour
{
    public float speed = 4f;
    public int flags = 3;
    public GameObject flagPrefab;

    private InputAction moveAction;
    private InputAction jumpAction;
    private InputAction attackAction;
    private List<GameObject> planted = new List<GameObject>();

    void Start()
    {
        // ابحث عن إجراءات Move وJump وAttack
    }

    void Update()
    {
        // تحرّك باستخدام Move، واستدعِ Plant() عند الضغط على Jump، وPullUp() عند الضغط على Attack
    }

    void Plant()
    {
        if (flags == 0) return;
        Vector3 spot = new Vector3(transform.position.x, 0.75f, transform.position.z);
        planted.Add(Instantiate(flagPrefab, spot, Quaternion.identity));
        flags--;
        Debug.Log("Flags left: " + flags);
    }

    void PullUp()
    {
        if (planted.Count == 0) return;
        GameObject last = planted[planted.Count - 1];
        planted.RemoveAt(planted.Count - 1);
        Destroy(last);
        flags++;
        Debug.Log("Flags left: " + flags);
    }
}

جميع دروس إنشاء ألعاب حقيقية

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