[DB AL] IA Patrouillant autour d'une plateforme

Pour les scripts écrits en C#
Règles du forum
Merci de respecter la NOMENCLATURE suivante pour vos TITRES de messages :

Commencez par le niveau de vos scripts
DB = Débutant
MY = Moyen
CF = Confirmé

Puis le domaine d'application
-RS = Réseau
-AL = Algorithmie

Exemple :

[DB-RS] Mouvement perso multijoueur
Avatar de l’utilisateur
Nikolls
Messages : 9
Inscription : 10 Fév 2019 22:41

[DB AL] IA Patrouillant autour d'une plateforme

Message par Nikolls » 13 Avr 2020 19:10

Bonjour à tous!

Je viens aujourd'hui chercher conseil car j'ai plus ou moins réussi à faire ce que je veux avec un ennemie mais le résultat n'est pas "clean" et j'aimerais avoir votre avis sur comment l'améliorer.

Alors pour faire court, j'ai conçu un ennemie dont le but est de tourner dans le sens horaire le long de la plateforme sur laquelle il se trouve. S'il arrive au bout de la plateforme, il pivotera a 90 degré et descendra le long de la paroi et il continue ainsi à suivre le relief de la plateforme. De la même manière s'il rencontre un mur il se mettra à l'escalader. Bref c'est le mob de base de Metroid.

Voilà la vue dans l'inspecteur:
Image

J'utilise un GroundDetection en enfant pour savoir s'il arrive au bout de la plateforme et un HitWall pour savoir s'il à escalader un éventuel mur.

Le premier soucis que j'ai rencontré, c'est qu'arrivé au bout de la plateforme il partait en toupie et sortait totalement de la plateforme. Pour éviter qu'il commence à paniquer puisqu'il ne touchait pas de suite le sol après un virage j'ai donc rajouté un délai avant de le faire de nouveau éventuellement pivoter. De cette manière il tourne, est forcé d'attendre un court délai durant lequel il détecte la plateforme sous ses pieds et voilà.

Mais quel est mon p***** de problème alors?

Eh bien le soucis c'est que ça fait un peu bricolage et je doit jouer sur son délai de réaction et la position de mes Ground et Wallcheck pour que tout ce passe bien. Et je suis évidement sur qu'il y'a une solution propre à ce problème.

De plus lorsqu'il aborde un angle, il fait des virages inutile avant de faire proprement le virage.

Voilà ce que cela donne en vidéo:

https://www.youtube.com/watch?v=x_b9Uiy4NMY&feature=youtu.be

Et voilà mon code:

Code : Tout sélectionner

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Patrol : MonoBehaviour
{
    public float speed;
    public float distance;
    public float waitingDetection;
    public float counterWaitingDetection;
    public bool turnClockwise = true;
    public Transform groundDetection;
    public Transform wallDetection;
    public bool grounded;
    public bool walled;
    public float checkradius;
    public LayerMask whatIsGround;
    public string direction = "droite";
    //0 droite, 1 haut, 2 bas, 3 gauche
    //transform.eulerAngles = new Vector3(0, 0, 90);//vers le haut
    //transform.eulerAngles = new Vector3(0, -180, 0);//vers la droite
    //transform.eulerAngles = new Vector3(0, 0, 0);//vers la gauche
    //transform.eulerAngles = new Vector3(0, 0, -90);//vers le bas
    void STart()
    {
        counterWaitingDetection = waitingDetection;
    }

    void Update()
    {
        transform.Translate(Vector2.right * speed * Time.deltaTime);
        RaycastHit2D groundInfo = Physics2D.Raycast(groundDetection.position, Vector2.down, distance );
        grounded = Physics2D.OverlapCircle(groundDetection.position, checkradius, whatIsGround);
        walled = Physics2D.OverlapCircle(wallDetection.position, checkradius, whatIsGround);
 
        if (counterWaitingDetection <= 0)
        {
            if (grounded != true)
            {
                switch (direction)
                {
                    case "droite":
                        transform.Rotate(0f, 0f, -90f);
                        direction = "bas";
                        break;
                    case "bas":
                        transform.Rotate(0f, 0f, -90f);
                        direction = "gauche";
                        break;
                    case "gauche":
                        transform.Rotate(0f, 0f, -90f);
                        direction = "haut";
                        break;
                    case "haut":
                        transform.Rotate(0f, 0f, -90f);
                        direction = "droite";
                        break;
                }
            }
            if (walled)
            {
                switch (direction)
                {
                    case "droite":
                        transform.Rotate(0f, 0f, 90f);
                        direction = "haut";
                        break;
                    case "bas":
                        transform.Rotate(0f, 0f, 90f);
                        direction = "droite";
                        break;
                    case "gauche":
                        transform.Rotate(0f, 0f, 90f);
                        direction = "haut";
                        break;
                    case "haut":
                        transform.Rotate(0f, 0f, 90f);
                        direction = "droite";
                        break;
                }
            }
            counterWaitingDetection = waitingDetection;
        }
        else
        {
            counterWaitingDetection -= Time.deltaTime;
        }
    }

}
Voilà merci à ce qui auront le courage de tout lire et répondre!

EmileF
Messages : 681
Inscription : 18 Mars 2017 19:39

Re: [DB AL] IA Patrouillant autour d'une plateforme

Message par EmileF » 13 Avr 2020 19:48

Salut,
une simple petite idée, pourquoi ne déterminerais-tu pas simplement 4 positions à chaque coin autour de ta plateforme et ton ennemi irai de position à position et à chaque fois il pivote de 90°.
Simple à mettre en place et surement plus efficace
La différence entre l'intelligence et la stupidité est que l'intelligence est limitée.

Avatar de l’utilisateur
Nikolls
Messages : 9
Inscription : 10 Fév 2019 22:41

Re: [DB AL] IA Patrouillant autour d'une plateforme

Message par Nikolls » 13 Avr 2020 20:06

Alors si on parle bien de "repères" pour le mob à suivre donc de faire point A puis aller à B ect ça me force créer un trajet pour chaque ennemies que je vais créer. Et du coup ben c'est long quoi. Si je veux faire 50 ennemies je vais pas leur faire un trajet personnalisé à chacun. D'autant que j'ai peut être envie qu'il marche le long de plateforme plus complexe que de simple rectangles.

Du coup il faut clairement que ce soit lui qui réagisse à ce sur quoi je le pose.

Mais merci de l'idée néanmoins.

djulio74
Messages : 682
Inscription : 19 Déc 2009 22:55

Re: [DB AL] IA Patrouillant autour d'une plateforme

Message par djulio74 » 13 Avr 2020 20:47

Perso il y a peut être une optimisation a faire au niveau du pivot, qui a l'air loin du "sol".
Tu devrait mettre le pivot bien plus proche du niveau du sol voulu, voir même en dedans du sol un tout petit peu.
La rotation se fera autour de ce pivot, ce qui signifie que tu n'aura plus besoin d’instaurer de délai, une fois la rotation effectuer, il devrait tout de suite retrouver le sol.

______________________________________________________________
\_______________________ Impossible is nothing _______________________/

EmileF
Messages : 681
Inscription : 18 Mars 2017 19:39

Re: [DB AL] IA Patrouillant autour d'une plateforme

Message par EmileF » 13 Avr 2020 20:52

non, je pensais a une zone autour de chaque plateforme accessible par l'ennemi
Donc, un trigger pour chaque plateforme, une array de 4 vector3 pour les repères, un ennemi entre dans le trigger, il se dirige vers le repère le plus proche et il fait son tour
La différence entre l'intelligence et la stupidité est que l'intelligence est limitée.

Avatar de l’utilisateur
Nikolls
Messages : 9
Inscription : 10 Fév 2019 22:41

Re: [DB AL] IA Patrouillant autour d'une plateforme

Message par Nikolls » 22 Avr 2020 16:02

Eh bien j'essayerais ça plus tard et je vous dirais!

Avatar de l’utilisateur
E3DStef
Administrateur
Administrateur
Messages : 1646
Inscription : 14 Juil 2013 18:30
Localisation : https://www.carte-des-membres.com/fr/Unity3D-France/

Re: [DB AL] IA Patrouillant autour d'une plateforme

Message par E3DStef » 26 Avr 2020 22:08

Bonsoir,

Pourquoi ne pas utiliser les navmesh ?

https://docs.unity3d.com/Manual/nav-Bui ... vMesh.html

A+

Stef
Le Savoir n'est Précieux que s'il est Partagé

Si besoin urgent de me contacter, faites moi un mail sur : franceunity3d@gmail.com

Répondre

Revenir vers « (C#) CSharp »