Dans cette partie, nous allons voir comment tirer sur les ennemis dans un FPS. L’essentiel du système de tir a été créé dans la partie 2 du tutoriel Créer un FPS sur Unity. On va créer un script qui nous permettra de gérer les dommages reçus.
Pré-requis
Importer un ennemi gratuit depuis l’asset store: Zombie
Ce zombie est assez bien fait, le seul défaut que l’on pourrait lui trouver, c’est qu’il n’y a pas réellement d’animation lorsqu’il prend des dégâts. Nous allons donc utiliser une animation où il chute au sol. Et lorsqu’il sera vaincu, nous lancerons une animation de chute différente. Pour un asset gratuit, c’est quand même très bien !
Vous devez aussi importer le FPS controller créé dans la partie 1 (mouvements de base),et la partie 2 (système de tir).
Le zombie
Glisser le prefab du zombie sur la scène.
Sélectionnez-le, puis clique droit de la souris > Unpack Prefab.
Cela permettra d’arranger les composants du zombie, sans toucher au prefab d’origine.
- Scale: x,y et z = 2
Ajoutez un RigidBody.
- Is Kinematic doit être coché
Ajouter un Capsule Collider
- Center=1
- Hieght=2
Modifiez le Layer > Interaction. (Créez -le s’il n’existe pas)
Important
Pour que tout fonctionne : dans Player > Main Camera > Gun > ShootAction : Layer, choisissez Interaction.
Recevoir des dommages
Il faut maintenant créer un script qui soit capable de gérer les dommages subis lorsque le joueur tire sur le zombie.
Ajoutez-le script ci-dessous au zombie :
ReceiveDamage.cs
</pre>
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ReceiveDamage : MonoBehaviour
{
//Maximum de points de vie
public int maxHitPoint = 5;
//Points de vie actuels
public int hitPoint = 0;
//Après avoir reçu un dégât :
//La créature est invulnérable quelques instants
public bool isInvulnerable;
//Temps d'invulnérabilité
public float invulnerabiltyTime;
//Temps depuis le dernier dégât
private float timeSinceLastHit = 0.0f;
private void Start()
{
//Au début : Points de vie actuels = Maximum de points de vie
hitPoint = maxHitPoint;
isInvulnerable = false;
}
private void Update()
{
//Si invulnérable
if (isInvulnerable)
{
//Compte le temps depuis le dernier dégât
//timeSinceLastHit = temps depuis le dernier dégât
//Time.deltaTime = temps écoulé depuis la dernière frame
timeSinceLastHit += Time.deltaTime;
if (timeSinceLastHit > invulnerabiltyTime)
{
//Le temps est écoulé, il n'est plus invulnérable
timeSinceLastHit = 0.0f;
isInvulnerable = false;
}
}
}
//Permet de recevoir des dommages
public void GetDamage(int damage)
{
if (isInvulnerable)
return;
isInvulnerable = true;
//Applique les dommages aux points de vies actuels
hitPoint -= damage;
//S'il reste des points de vie
if (hitPoint > 0)
{
//SendMessage appellera toutes les méthodes "TakeDamage" de ce GameObject
//Exemple : "TakeDamage" est dans MonsterController
gameObject.SendMessage("TakeDamage", SendMessageOptions.DontRequireReceiver);
}
//Sinon
else
{
//SendMessage appellera toutes les méthodes "Defeated" de ce GameObject
//Exemple : "Defeated" est dans MonsterController
gameObject.SendMessage("Defeated", SendMessageOptions.DontRequireReceiver);
}
}
}
<pre>
Important : désactivez le composant Animator du Zombie
Mettre à jour Shoot Action
Pour que tout fonctionne bien, le script ShootAction doit être très légèrement modifié. Repérez le bout de code suivant, il se trouve dans Update().
...
SUPPRIMER A PARTIR D'ICI
//S'assure que la cible touchée a un composant ReceiveAction
if (hit.collider.gameObject.GetComponent<ReceiveAction>() != null)
{
//Envoie les dommages à la cible
hit.collider.gameObject.GetComponent<ReceiveAction>().GetDamage(gunDamage);
}
JUSQU'ICI
AJOUTER CECI
//S'assure que la cible touchée a un composant ReceiveDamage
if (hit.collider.gameObject.GetComponent<ReceiveDamage>() != null)
{
//Envoie les dommages à la cible
hit.collider.gameObject.GetComponent<ReceiveDamage>().GetDamage(gunDamage);
}
JUSQU'ICI
...
Quand vous tirez sur l’ennemi, vous verrez que les points de vie diminuent !
Attention les cibles ne fonctionnent plus pour l’instant !


bonjour un message d erreur s affiche lorsque j essaye d installer le zombie
Bonjour
quelle est l’erreur ?
il y en a 3:
[Package Manager Window] Cannot perform upm operation: Unable to perform online search:
Cannot fetch authorization code. User access token is expired or invalid. You may need to sign out and sign in again. [Unknown].
UnityEditor.EditorApplication:Internal_CallUpdateFunctions ()
[Package Manager Window] Error searching for packages.
UnityEditor.EditorApplication:Internal_CallUpdateFunctions ()
[Package Manager Window] Error while getting auth code: System.InvalidOperationException: Failed to call Unity ID to get auth code.
UnityEditor.AsyncHTTPClient:Done (UnityEditor.AsyncHTTPClient/State,int)
Bonjour voici mes erreur pour ma part …
Assets\ShootAction.cs(5,14): error CS0101: The namespace » already contains a definition for ‘ShootAction’
Assets\ShootAction.cs(30,10): error CS0111: Type ‘ShootAction’ already defines a member called ‘Start’ with the same parameter types
Assets\ShootAction.cs(39,10): error CS0111: Type ‘ShootAction’ already defines a member called ‘Update’ with the same parameter types
Bonjour, cela veut sûrement dire qu’il y a des fichiers en double. Ou qu’il y a des fonctions en double dans la classe ShootAction.