Implémentation de la mécanique du tir à l'arc dans Unity

Les mécanismes de tir à l'arc dans Unity peuvent être utilisés pour créer une expérience de jeu amusante et engageante, où les joueurs peuvent tirer des flèches à l'arc. Ce didacticiel vous guidera dans la mise en œuvre des mécanismes de base du tir à l'arc, notamment la mise en tension de l'arc, la visée et le tir de flèches.

1. Installation de l'arc et des flèches

Pour commencer, nous aurons besoin d'une configuration simple d'arc et de flèches. Vous pouvez soit modéliser le vôtre, soit télécharger des ressources à partir du Unity Asset Store. Pour ce tutoriel, nous supposerons que vous disposez d'un modèle 3D pour l'arc et la flèche.

2. Créer le script de l'arc et des flèches

Nous allons créer un script BowAndArrow pour gérer les fonctionnalités de dessin, de visée et de tir de l'arc.

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;
    }
}

Ce script permet au joueur de tendre la corde de l'arc en maintenant le bouton de tir enfoncé. Lorsque le bouton de tir est relâché, une flèche est créée et tirée avec une force proportionnelle à la distance à laquelle la corde de l'arc a été tirée. La flèche reçoit une vitesse dans la direction vers laquelle l'arc est orienté.

3. Créer le préfabriqué Arrow

Créez maintenant le préfabriqué de flèche qui sera instancié lorsque le joueur tirera. La flèche doit avoir un composant Rigidbody pour le mouvement basé sur la physique, et éventuellement un Collider pour interagir avec d'autres objets.

  1. Créez un nouveau GameObject dans la scène, puis ajoutez un modèle 3D de la flèche (soit votre propre modèle, soit un élément de l'Asset Store Unity).
  2. Ajoutez un composant Rigidbody à la flèche pour un mouvement basé sur la physique.
  3. Ajoutez un composant Collider (comme un BoxCollider ou un CapsuleCollider) pour gérer les collisions avec d'autres objets.
  4. Faites de ce GameObject un préfabriqué en le faisant glisser dans la fenêtre Projet.

4. Viser l'arc

Pour viser l'arc, vous pouvez implémenter une mécanique simple en utilisant la souris ou le joystick droit (pour les manettes de jeu). Dans cet exemple, nous allons permettre au joueur de faire tourner l'arc pour viser à l'aide de la souris.

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);
    }
}

Le script BowAiming fait tourner l'arc en fonction des mouvements X et Y de la souris. Cela permet au joueur de viser l'arc dans n'importe quelle direction. Vous pouvez ajuster rotationSpeed pour rendre le mouvement de l'arc plus ou moins sensible à la saisie de la souris.

5. Ajout de la fonction de vol et de collision de la flèche

Le vol de la flèche est géré par le composant Rigidbody, qui applique la force lorsque la flèche est tirée. Pour rendre la flèche plus réaliste, vous pouvez ajouter un script Arrow pour détecter les collisions et déclencher des événements, comme endommager les ennemis ou coller aux surfaces.

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
        }
    }
}

Le script Arrow détecte les collisions avec d'autres objets. Si la flèche touche un ennemi, vous pouvez déclencher des dégâts ou d'autres effets. Pour l'instant, il enregistre simplement un message et détruit la flèche. Vous pouvez étendre ce script pour infliger des dégâts, créer des effets spéciaux ou faire en sorte que la flèche colle aux objets.

6. Mise en œuvre de l'interface utilisateur pour la force de tirage

Pour donner au joueur un retour sur la force de traction de l'arc, vous pouvez afficher un élément d'interface utilisateur indiquant la force de traction actuelle. Un simple curseur peut représenter la distance de traction de la corde de l'arc.

  1. Créez un curseur d’interface utilisateur dans la scène.
  2. Liez la valeur du curseur à drawDistance dans le script 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
        }
    }
}

Cela affichera visuellement à quel point le joueur a tiré l'arc en mettant à jour la valeur du curseur en fonction de drawDistance.

7. Tests et réglages

Jouez maintenant au jeu et testez la mécanique de l'arc et des flèches. Assurez-vous des points suivants:

  • La corde de l'arc se tend en douceur et se réinitialise après le tir.
  • La flèche se déplace dans la bonne direction et réagit aux collisions.
  • Le système de visée fonctionne comme prévu et est réactif.

Vous pouvez affiner des valeurs telles que drawSpeed, arrowForce et rotationSpeed pour correspondre à la sensation de jeu souhaitée.

Conclusion

Nous avons implémenté un système de tir à l'arc simple mais efficace dans Unity, comprenant un arc, des mécanismes de flèches, la visée et le tir. Nous avons également inclus un élément d'interface utilisateur pour afficher la force de tirage. Ce système peut être étendu avec des fonctionnalités supplémentaires comme les types de flèches, les réactions des ennemis et les effets spéciaux pour une expérience de tir à l'arc plus complexe.