Unity - Tanks

Tirer les missiles

L'auteur

Site personnel

Liens sociaux

Viadeo Twitter Facebook Share on Google+   

I. Introduction

Voici le sixième épisode de la formation donnée au cours du Unite 2015 à Boston, qui va vous permettre d'apprendre à faire un jeu dans lequel deux tanks s'affrontent.
Vous pouvez retrouver les autres épisodes de cette série dans le sommaire dédié.

II. Vidéo


Unity - Tanks ! - Tirer les missiles


III. Résumé

Dans cette vidéo, vous allez apprendre à tirer les missiles créés dans l'épisode précédent afin de détruire votre adversaire. Pour donner une indication au joueur sur la trajectoire et la force du missile, un curseur de défilement est utilisé pour afficher une flèche dont la longueur varie suivant le temps d'appui sur la touche de tir.

III-A. Implémenter l'indicateur de tir

Premièrement, sélectionnez le GameObject du tank. Ajoutez-lui un nouveau GameObject vide que vous nommerez « FireTransform ». Donnez-lui les valeurs (0, 1.7, 1.35) pour la position et (350, 0, 0) pour la rotation.

Ensuite, ajoutez un « Slider » dans le canevas existant. Celui-ci se nommera « AimSlider ». Encore une fois, par défaut, le curseur de défilement n'est pas du tout configuré comme nous le souhaitons. Supprimez l'objet enfant « Handle Slide Area » ainsi que le « Background ». Décochez la propriété « Interactable » du curseur de défilement et modifiez la « Transition » afin qu'elle soit à « None ». Finalement, la « Direction » doit être « Bottom To Top ». La valeur minimale est de 15 et la valeur maximale est de 30.

Sélectionnez le curseur de défilement et sa « Fill Area » afin de modifier l'étirement et la position dans le but de l'étirer au maximum et de centrer les éléments. Ensuite, définissez la hauteur à 0.

Dans l'éditeur de sprites il est possible de sélectionner comment l'image de flèche utilisée sera étirée et quelle partie sera fixe. Cela est pré-configuré dans le projet.

Vous n'avez plus qu'à placer l'image comme source du curseur de défilement.

En vous plaçant au-dessus du tank et en choisissant l'outil de travail sur les éléments d'interface utilisateur, vous pouvez redimensionner et placer le curseur de défilement exactement comme il se doit (devant le tank et ne pas être plus large que le tank). Puis, remontez-le grâce à l'outil de déplacement des objets, afin qu'il soit légèrement au-dessus du sol. Pour correspondre exactement au tutoriel, les valeurs sont : 1, -9, -1, 1 et 1 (pour respectivement Left, Top, Pos Z, Right, Bottom).

III-B. Tir

Pour le tir, vous devez rajouter le script « TankShooting » comme enfant du tank.

III-B-1. Script TankShooting

Le but du script est de permettre la mise à jour du curseur de défilement et le tir du missile avec la force et la direction appropriées.

 
Sélectionnez
using UnityEngine;
using UnityEngine.UI;

public class TankShooting : MonoBehaviour
{
    public int m_PlayerNumber = 1;              // Utilisé pour identifier les joueurs.
    public Rigidbody m_Shell;                   // Préfabriqué du missile.
    public Transform m_FireTransform;           // Un enfant du tank  les missiles sont créés.
    public Slider m_AimSlider;                  // Un enfant du tank qui affiche la force du tir.
    public AudioSource m_ShootingAudio;         // Référence vers la source audio jouée lors du tir. Notez que la source audio est différente de celle du mouvement.
    public AudioClip m_ChargingClip;            // Audio joué à chaque chargement du tir.
    public AudioClip m_FireClip;                // Audio joué lorsque le missile est tiré.
    public float m_MinLaunchForce = 15f;        // La force donnée au missile si le bouton n'est pas maintenu.
    public float m_MaxLaunchForce = 30f;        // La force donnée au missile si le bouton est maintenu jusqu'au maximum du temps de charge.
    public float m_MaxChargeTime = 0.75f;       // Combien de temps le missile peut se charger avant d'être à la force maximale.


    private string m_FireButton;                // Le bouton utilisé pour tirer les missiles.
    private float m_CurrentLaunchForce;         // La force qui sera donnée lorsque le bouton sera relâché.
    private float m_ChargeSpeed;                // La vitesse du tir augmente suivant la valeur maximale du temps de chargement.
    private bool m_Fired;                       // Indicateur si le missile a été tiré ou non.


    private void OnEnable()
    {
        // Lorsque le tank est activé, réinitialise la force de lancement et l'interface utilisateur.
        m_CurrentLaunchForce = m_MinLaunchForce;
        m_AimSlider.value = m_MinLaunchForce;
    }


    private void Start ()
    {
        // Le bouton de tir dépend du nombre de joueurs.
        m_FireButton = "Fire" + m_PlayerNumber;

        // La vitesse de chargement de la force du tir est ratio du champ de force par rapport au temps de charge.
        m_ChargeSpeed = (m_MaxLaunchForce - m_MinLaunchForce) / m_MaxChargeTime;
    }


    private void Update ()
    {
        // Le curseur de défilement devrait avoir une valeur par défaut équivalente à la force minimale.
        m_AimSlider.value = m_MinLaunchForce;

        // Si la force maximale a été dépassée et que le missile n'a pas encore été tiré...
        if (m_CurrentLaunchForce >= m_MaxLaunchForce && !m_Fired)
        {
            // ... utilise la force maximale et tire le missile.
            m_CurrentLaunchForce = m_MaxLaunchForce;
            Fire ();
        }
        // Sinon, si le bouton de feu vient juste d'être appuyé...
        else if (Input.GetButtonDown (m_FireButton))
        {
            // ... réinitialise l'indicateur de tir et réinitialise la force du tir.
            m_Fired = false;
            m_CurrentLaunchForce = m_MinLaunchForce;

            // Change le son pour utiliser le son de chargement.
            m_ShootingAudio.clip = m_ChargingClip;
            m_ShootingAudio.Play ();
        }
        // Sinon, si le bouton de feu est maintenu et que le missile n'est pas encore tiré...
        else if (Input.GetButton (m_FireButton) && !m_Fired)
        {
            // Incrémente la force de lancement et met à jour le curseur de défilement.
            m_CurrentLaunchForce += m_ChargeSpeed * Time.deltaTime;

            m_AimSlider.value = m_CurrentLaunchForce;
        }
        // Sinon, si le bouton de feu est relâché et que le missile n'a pas encore été tiré...
        else if (Input.GetButtonUp (m_FireButton) && !m_Fired)
        {
            // ... tire le missile.
            Fire ();
        }
    }


    private void Fire ()
    {
        // Défini l'indicateur de tir afin de n'appeler la fonction qu'une seule fois.
        m_Fired = true;

        // Crée une instance du missile et stocke la référence dans son rigidbody.
        Rigidbody shellInstance =
            Instantiate (m_Shell, m_FireTransform.position, m_FireTransform.rotation) as Rigidbody;

        // Défini la vélocité du missile à la force de tir dans la direction du tir.
        shellInstance.velocity = m_CurrentLaunchForce * m_FireTransform.forward; ;

        // Change le son pour utiliser le son du tir.
        m_ShootingAudio.clip = m_FireClip;
        m_ShootingAudio.Play ();

        // Réinitialise la force de lancement. Ce n'est qu'une précaution.
        m_CurrentLaunchForce = m_MinLaunchForce;
    }
}

III-B-2. Finalisation

Pour finir, définissez les variables exposées dans l'inspecteur. Mettez à jour le préfabriqué du tank et testez !

IV. Ressources

Vous pouvez télécharger le diaporama de la présentation.

Vous pouvez télécharger les ressources pour ce projet sur l'Asset Store de Unity.

V. Commenter

Vous pouvez commenter et donner vos avis dans la discussion associée sur le forum.

Vous avez aimé ce tutoriel ? Alors partagez-le en cliquant sur les boutons suivants : Viadeo Twitter Facebook Share on Google+   

  

Copyright © 2016 Unity Technologies. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.