Si le player entre dans son champ de détection l'ennemi se met a le poursuivre, si le player sort du champs de détection assez longtemps l'ennemi s'arrête de le poursuivre.
Utilisation : Les scripts sont a mettre sur l'ennemi et celui-ci doit posséder un "NavMeshAgent"
Auteur/s : Rei_K
PS : Merci Cayou66 pour ton aide.
Autre : A vous de les modifier selon votre besoin
Les scripts :
script de détection
Code : Tout sélectionner
using UnityEngine;
using System.Collections;
public class script1 : MonoBehaviour {
private Transform laCible;
/***Variable Detection***/
public float distanceDetect = 4.0F;
public bool detecter;
//Une fois sorti de la zone de detection l'ennemi arrête de poursuivre le joueur apres le temps donné par cette variable "decroche"
public float decroche = 3;
private script2 sComportement;
// Use this for initialization
void Start()
{
sComportement = GetComponent<script2>();
laCible = sComportement.cible;
}
// Update is called once per frame
void Update()
{
CalculDist();
}
//Verifie la position du joueur
private void CalculDist()
{
//Le joueur est a ditance
if (laCible)
{
float sqrLen = (laCible.position - transform.position).sqrMagnitude;
if (sqrLen < distanceDetect * distanceDetect)
{
detecter = true;
ConditionComportement();//Appel de methode
if (IsInvoking("Timer"))//Annule l'invocation au cas d'une invocation déjà effectué
{
CancelInvoke("Timer");
}
}
//Le joueur n'est plus a distance
if (sqrLen > distanceDetect && detecter)
{
detecter = false;
PlusAdistance();
}
}
}
private void ConditionComportement()
{
if (detecter)
{
//BonneDist();
sComportement.pause = false;
sComportement.poursuite = true;
}
}
//Active la poursuite dans le script "comportement"
private void BonneDist()
{
sComportement.poursuite = true;
}
//Appel la methode coroutine "Timer"
private void PlusAdistance()
{
Invoke("finPoursuite", decroche);//Permet d'utilisé un temps donné avant d'arreter la poursuite et appel la méthode "finPoursuite"
}
//Met fin a la poursuite du joueur
private void finPoursuite()
{
sComportement.pause = true;
sComportement.poursuite = false;
print("DESACTIVE LA POURSUITE !!");
}
}
Code : Tout sélectionner
using UnityEngine;
using System.Collections;
public class script2 : MonoBehaviour {
public Transform cible;//glisser l'objet player
private Transform maTransform;
private NavMeshAgent agent;
public bool poursuite;
public float pdv = 10f;
public bool pause;
void Awake()
{
maTransform = transform;
}
// Use this for initialization
void Start()
{
//Initialisation du script NavMeshAgen qui se trouve sur le même objet que ce script
agent = GetComponent<NavMeshAgent>();
pause = false;
}
// Update is called once per frame
void Update()
{
if (poursuite)
{
mouvement();
}
if (poursuite == false && pause == true)
{
miseEnAttente();
}
}
private void mouvement()
{
//Si la variable "vieActuelle" est supérieur a 0
if (pdv > 0)
{
Debug.DrawLine(cible.transform.position, maTransform.position, Color.blue);
agent.destination = cible.position;//le squelette se dirige vers le joueur
}
}
//L'ennemi reste a sa position actuelle
private void miseEnAttente()
{
print("NE BOUGE PLUS !!");
agent.destination = transform.position;
}
}