[C#] IA ennemi basique

Cette section est destinée aux scripts partagés par la communauté. Chaque post est destiné à un script. Suivez bien les recommandations.
Avatar de l’utilisateur
Rei_k
Messages : 96
Inscription : 17 Sep 2010 18:32

[C#] IA ennemi basique

Message par Rei_k » 13 Oct 2012 15:32

Description : Cette mini-IA basique permet de donner une distance de détection a l'ennemi.
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 !!");
        
    }

}

script de mouvement

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


}


Avatar de l’utilisateur
giyomuSan
Messages : 1799
Inscription : 09 Déc 2009 14:52
Localisation : Japon

Re: [C#] IA ennemi basique

Message par giyomuSan » 14 Oct 2012 03:15

merci pour la communautee,

juste en note mais c'est vraiment histoire de preference, tu gagnerais en opti d 'utiliser un simple sphere trigger + rigidbody kinematic pour la detection de zone ( OnEnter, OnExit ) , plutot que de calculer la distance a chaque frame et eventuellement calculer le proche distance de la par exemple..ca va quand t as pas bcp d AI , mais si tu doit gerer 20 ou bcp plus Ai visible dans la scene, ca risque de commencer a pomper..le sqrMagnitude aide un peu dans ce cas.

Avatar de l’utilisateur
Rei_k
Messages : 96
Inscription : 17 Sep 2010 18:32

Re: [C#] IA ennemi basique

Message par Rei_k » 14 Oct 2012 05:40

Merci pour l'info GiyomuSan :)

Je vais faire avec ça pour le moment et essayer de terminer le projet en cours avec ce bout de script :lol:
N'ayant plus de cheveux, je n'ai pas envie de cramer le peu de cervelle qui me reste, j'ai déjà passé une semaine a cause d'une connerie complètement idiote sur celui-la :oops:

Je garde sous le coude ta suggestion pertinente ;)

Skizzy
Messages : 16
Inscription : 03 Oct 2014 20:56

Re: [C#] IA ennemi basique

Message par Skizzy » 26 Oct 2014 17:44

Bonjour,
merci des scripts mais j'ai une erreur: Failed to create agent because there is no valid NavMesh
Et quand je fait play il ne bouge pas même si je suis a coté. J'ai appliquer les scripts sur mon ennemi.
J'ai oublier de configurer quelque chose?
Merci d'avance
Skizzy

Avatar de l’utilisateur
Rei_k
Messages : 96
Inscription : 17 Sep 2010 18:32

Re: [C#] IA ennemi basique

Message par Rei_k » 26 Oct 2014 17:52

Bonjour,
A tu préparer ta scène et généré ton Navmesh ?
Le message d'erreur que tu nous donne précise qu'il ni a pas de Navmesh sur ta scène.
Voici comment faire : clique ici

Skizzy
Messages : 16
Inscription : 03 Oct 2014 20:56

Re: [C#] IA ennemi basique

Message par Skizzy » 26 Oct 2014 19:30

Préparé pas scène? Ben j'ai appliquer les script et appliquer le NavMeshAgent sur l'ennemi sans rien modifier

Avatar de l’utilisateur
Rei_k
Messages : 96
Inscription : 17 Sep 2010 18:32

Re: [C#] IA ennemi basique

Message par Rei_k » 26 Oct 2014 19:58

Oui, tu prépare ta scène...
Les objets de ta scène qui ne bougeront pas et qui seront sur le chemin ou passe tes ennemis. Passent en mode statique. Tu sélectionne tous ces objets et sur l'onglet navigation tu "bake" la scène.
et hop la zone de navigation est visible en bleu.

Tu te retrouve alors avec un nouveau dossier qui porte le nom de ta scène avec a l'intérieur un fichier "NavMesh"
Si tu n'a pas fait ça, les scripts ne fonctionnent pas.

Skizzy
Messages : 16
Inscription : 03 Oct 2014 20:56

Re: [C#] IA ennemi basique

Message par Skizzy » 26 Oct 2014 20:26

D'abord merci de répondre si vite. Ensuite moi j'ai ca: http://prntscr.com/4zzwiv
Ce qui est surligné est ce qui ne bouge pas. Je les sélectionnent mais comment les bake?

Avatar de l’utilisateur
Rei_k
Messages : 96
Inscription : 17 Sep 2010 18:32

Re: [C#] IA ennemi basique

Message par Rei_k » 26 Oct 2014 20:57

Sur les menus de sélection (File/Edit/Assets....) tu vas sur "Window" et tu sélectionne "Navigation".
Tu pourras via cet outil bake ta scène.

Skizzy
Messages : 16
Inscription : 03 Oct 2014 20:56

Re: [C#] IA ennemi basique

Message par Skizzy » 26 Oct 2014 21:15

Merci . J'ai bake ma foret ca me donne ca : http://prntscr.com/500l1o
Mais mon ennemi ne bouge toujours pas.
Et dans l'inspector, sur mon script, il n'y a pas la possibilité de choisir le target, pourquoi? http://prntscr.com/500llu

Répondre

Revenir vers « Scripts »