Впровадження механіки стрільби з лука в Unity

Механіку стрільби з лука в Unity можна використовувати, щоб створити веселий і захоплюючий ігровий процес, де гравці можуть стріляти стрілами з лука. Цей підручник допоможе вам застосувати основні механізми стрільби з лука, включаючи натягування лука, прицілювання та стрільбу зі стріл.

1. Налаштування лука та стріл

Для початку нам знадобиться проста установка лука та стріл. Ви можете створити власну модель або завантажити ресурси з Unity Asset Store. Для цього уроку ми припустимо, що у вас є готова 3D-модель лука та стріл.

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. Створіть новий ігровий об’єкт на сцені, а потім додайте 3D-модель стріли (вашу власну модель або ресурс із магазину ресурсів Unity).
  2. Додайте компонент Rigidbody до стрілки для руху на основі фізики.
  3. Додайте компонент Collider (наприклад, BoxCollider або CapsuleCollider), щоб впоратися зі зіткненнями з іншими об’єктами.
  4. Зробіть цей GameObject префабом, перетягнувши його у вікно проекту.

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. Впровадження інтерфейсу користувача для Draw Strength

Щоб дати гравцеві відгук про те, наскільки натягнутий лук, ви можете відобразити елемент інтерфейсу користувача, що показує поточну силу натягування. Простий повзунок може представляти відстань натягування тятиви.

  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, яка включає в себе лук, механіку стріл, прицілювання та стрільбу. Ми також включили елемент інтерфейсу користувача, щоб показати силу малювання. Цю систему можна розширити додатковими функціями, наприклад типами стріл, реакцією ворогів і спецефектами для більш складного досвіду стрільби з лука.