Menu
CoddyTech
flag Ar iconالعربيةdown icon

مراجعة: التبديل بين أنظمة الإدخال

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

challenge icon

التحدي

متوسط

كُتبت عصا الفقاعات هذه للفئة القديمة Input. تعمل في مشروع مضبوط على Both، لكن إعداد هذا المشروع يشبه إعداد مشروع Unity 6 جديد (Active Input Handling: Input System Package): اضغط Play وستؤدي أول استدعاءة لـ Input إلى طرح InvalidOperationException. انقلها إلى Input System مع الحفاظ على كل ما تفعله:

  • تحرّك الأسهم أو WASD العصا عبر العشب بسرعة speed وحدة في الثانية، من دون أن تصبح أسرع عند الحركة قطريًا.
  • يؤدي الضغط على Jump إلى نفخ فقاعة على ارتفاع 1.5 وحدة فوق العصا. ما دام Jump مضغوطًا، تكبر الفقاعة بمقدار growRate في الثانية، حتى maxSize. عند ترك الزر، يُسجَّل حجمها، مثل Bubble: 0.8.
  • تنفجر كل الفقاعات عند النقر بالزر الأيسر، ويُسجَّل عددها، مثل Popped 3.

استخدم الإجراءين Move وJump الخاصين بالمشروع وMouse.current، ولا تترك أي استدعاء لـ Input. في النص البرمجي. اضغط Play وجرّب، ثم اضغط Check.

جرّب بنفسك

using UnityEngine;

public class Wand : MonoBehaviour
{
    public float speed = 4f;
    public float growRate = 1f;
    public float maxSize = 1.5f;
    public GameObject bubblePrefab;

    private Transform bubble;

    void Update()
    {
        Vector3 move = new Vector3(Input.GetAxisRaw("Horizontal"), 0f, Input.GetAxisRaw("Vertical"));
        transform.position += move.normalized * speed * Time.deltaTime;

        if (Input.GetButtonDown("Jump"))
        {
            bubble = Instantiate(bubblePrefab, transform.position + Vector3.up * 1.5f, Quaternion.identity).transform;
        }
        if (Input.GetButton("Jump") && bubble != null)
        {
            float size = Mathf.Min(bubble.localScale.x + growRate * Time.deltaTime, maxSize);
            bubble.localScale = Vector3.one * size;
        }
        if (Input.GetButtonUp("Jump") && bubble != null)
        {
            Debug.Log("Bubble: " + bubble.localScale.x.ToString("F1"));
            bubble = null;
        }

        if (Input.GetMouseButtonDown(0))
        {
            GameObject[] bubbles = GameObject.FindGameObjectsWithTag("Bubble");
            foreach (GameObject b in bubbles) Destroy(b);
            Debug.Log("Popped " + bubbles.Length);
        }
    }
}

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