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.
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 où 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.