تنفيذ آليات الرماية في Unity

يمكن استخدام آليات الرماية في Unity لإنشاء تجربة لعب ممتعة وجذابة، حيث يمكن للاعبين إطلاق الأسهم من القوس. سيرشدك هذا البرنامج التعليمي خلال تنفيذ آليات الرماية الأساسية، بما في ذلك سحب القوس والتصويب وإطلاق الأسهم.

1. إعداد القوس والسهم

للبدء، سنحتاج إلى إعداد بسيط للقوس والسهم. يمكنك إما إنشاء نموذج خاص بك أو تنزيل الأصول من Unity Asset Store. في هذا البرنامج التعليمي، سنفترض أن لديك نموذجًا ثلاثي الأبعاد للقوس والسهم جاهزًا.

2. إنشاء نص القوس والسهم

سوف نقوم بإنشاء البرنامج النصي BowAndArrow للتعامل مع وظائف الرسم والتصويب وإطلاق القوس.

using UnityEngine;

public class BowAndArrow : MonoBehaviour
{
    public GameObject arrowPrefab; // Reference to the arrow prefab
    public Transform bowString; // Reference to the bowstring for drawing
    public Transform spawnPoint; // Point where the arrow will be spawned
    public float drawSpeed = 2f; // Speed at which the bowstring is drawn
    public float maxDrawDistance = 3f; // Maximum draw distance for the bowstring
    public float arrowForce = 50f; // Force applied to the arrow when shot

    private float drawDistance = 0f; // Current draw distance of the bowstring

    void Update()
    {
        // Draw the bowstring when holding the fire button
        if (Input.GetButton("Fire1"))
        {
            DrawBow();
        }

        // Shoot the arrow when the fire button is released
        if (Input.GetButtonUp("Fire1") && drawDistance > 0f)
        {
            ShootArrow();
        }
    }

    void DrawBow()
    {
        // Increase the draw distance while holding the fire button
        drawDistance = Mathf.Clamp(drawDistance + drawSpeed * Time.deltaTime, 0, maxDrawDistance);
        bowString.localPosition = new Vector3(0, drawDistance, 0);
    }

    void ShootArrow()
    {
        // Instantiate and shoot the arrow
        GameObject arrow = Instantiate(arrowPrefab, spawnPoint.position, spawnPoint.rotation);
        Rigidbody arrowRb = arrow.GetComponent();
        arrowRb.AddForce(spawnPoint.forward * arrowForce * drawDistance, ForceMode.VelocityChange);

        // Reset the bowstring
        drawDistance = 0f;
        bowString.localPosition = Vector3.zero;
    }
}

يتيح هذا البرنامج النصي للاعب سحب وتر القوس من خلال الضغط باستمرار على زر إطلاق النار، وعندما يتم تحرير زر إطلاق النار، يتم إنشاء سهم وإطلاقه بقوة تتناسب مع مدى سحب وتر القوس. يتم إعطاء السهم سرعة في الاتجاه الذي يواجهه القوس.

3. إنشاء السهم الجاهز

الآن، قم بإنشاء نموذج السهم الذي سيتم إنشاؤه عندما يطلق اللاعب النار. يجب أن يحتوي السهم على مكون Rigidbody للحركة القائمة على الفيزياء، وبشكل اختياري، Collider للتفاعل مع الكائنات الأخرى.

  1. قم بإنشاء GameObject جديد في المشهد، ثم أضف نموذجًا ثلاثي الأبعاد للسهم (إما نموذجك الخاص أو أحد الأصول من متجر الأصول Unity).
  2. أضف مكون Rigidbody إلى السهم للحركة المعتمدة على الفيزياء.
  3. أضف مكون Collider (مثل BoxCollider أو CapsuleCollider) للتعامل مع الاصطدام مع الكائنات الأخرى.
  4. اجعل كائن اللعبة هذا نموذجًا جاهزًا عن طريق سحبه إلى نافذة المشروع.

4. تصويب القوس

لتصويب القوس، يمكنك تنفيذ آلية بسيطة باستخدام الماوس أو عصا التحكم اليمنى (لأجهزة التحكم في الألعاب). في هذا المثال، سنسمح للاعب بتدوير القوس للتصويب باستخدام الماوس.

using UnityEngine;

public class BowAiming : MonoBehaviour
{
    public float rotationSpeed = 5f; // Speed at which the bow rotates

    void Update()
    {
        // Rotate the bow based on mouse movement
        float horizontal = Input.GetAxis("Mouse X");
        float vertical = Input.GetAxis("Mouse Y");

        transform.Rotate(Vector3.up * horizontal * rotationSpeed);
        transform.Rotate(Vector3.left * vertical * rotationSpeed);
    }
}

يقوم البرنامج النصي BowAiming بتدوير القوس بناءً على حركات الماوس X وY. وهذا يسمح للاعب بتوجيه القوس في أي اتجاه. يمكنك ضبط rotationSpeed لجعل حركة القوس أكثر أو أقل حساسية لإدخال الماوس.

5. إضافة رحلة السهم والاصطدام

يتم التعامل مع طيران السهم بواسطة مكون Rigidbody، والذي يطبق القوة عند إطلاق السهم. لجعل السهم أكثر واقعية، يمكنك إضافة نص Arrow للكشف عن الاصطدامات وتفعيل الأحداث، مثل إلحاق الضرر بالأعداء أو الالتصاق بالأسطح.

using UnityEngine;

public class Arrow : MonoBehaviour
{
    private void OnCollisionEnter(Collision collision)
    {
        // Check for collision with an enemy or other object
        if (collision.gameObject.CompareTag("Enemy"))
        {
            // Handle damage or effects here
            Debug.Log("Arrow hit the enemy!");
            Destroy(gameObject); // Destroy the arrow on impact
        }
        else
        {
            // Destroy arrow if it hits something else
            Destroy(gameObject, 2f); // Arrow disappears after 2 seconds
        }
    }
}

يكتشف البرنامج النصي Arrow الاصطدامات مع الأشياء الأخرى. إذا أصاب السهم عدوًا، فيمكنك إحداث ضرر أو تأثيرات أخرى. في الوقت الحالي، يقوم ببساطة بتسجيل رسالة وتدمير السهم. يمكنك توسيع هذا البرنامج النصي لإحداث الضرر أو إنشاء تأثيرات خاصة أو جعل السهم يلتصق بالأشياء.

6. تنفيذ واجهة المستخدم لقوة الرسم

لإعطاء اللاعب ملاحظات حول مدى سحب القوس، يمكنك عرض عنصر واجهة مستخدم يوضح قوة السحب الحالية. يمكن أن يمثل شريط التمرير البسيط مسافة سحب وتر القوس.

  1. إنشاء شريط تمرير واجهة المستخدم في المشهد.
  2. قم بربط قيمة شريط التمرير بـ drawDistance في البرنامج النصي BowAndArrow.
using UnityEngine;
using UnityEngine.UI;

public class BowAndArrow : MonoBehaviour
{
    public Slider drawStrengthSlider; // Reference to the UI slider

    void Update()
    {
        if (Input.GetButton("Fire1"))
        {
            DrawBow();
            drawStrengthSlider.value = drawDistance / maxDrawDistance; // Update the slider
        }

        if (Input.GetButtonUp("Fire1") && drawDistance > 0f)
        {
            ShootArrow();
            drawStrengthSlider.value = 0f; // Reset the slider after shooting
        }
    }
}

سيتم عرض مقدار سحب اللاعب للقوس بصريًا عن طريق تحديث قيمة شريط التمرير استنادًا إلى drawDistance.

7. الاختبار والضبط الدقيق

الآن، العب اللعبة واختبر آليات القوس والسهم. تأكد مما يلي:

  • يتم سحب وتر القوس بسلاسة وإعادة ضبطه بعد إطلاق النار.
  • يتحرك السهم في الاتجاه الصحيح ويتفاعل مع الاصطدامات.
  • يعمل نظام التصويب كما هو متوقع ويستجيب.

يمكنك ضبط القيم مثل drawSpeed، وarrowForce، وrotationSpeed لتتناسب مع إحساس اللعب الذي تريده.

خاتمة

لقد قمنا بتنفيذ نظام رماية بسيط ولكنه فعال في Unity، والذي يتميز بالقوس وميكانيكا السهم والتصويب والرماية. كما قمنا بتضمين عنصر واجهة مستخدم لإظهار قوة السحب. يمكن توسيع هذا النظام بميزات إضافية مثل أنواع الأسهم وردود أفعال العدو والمؤثرات الخاصة للحصول على تجربة رماية أكثر تعقيدًا.