Page 1 sur 1

[DB AL] IA Patrouillant autour d'une plateforme

Publié : 13 Avr 2020 19:10
par Nikolls
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!

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

Publié : 13 Avr 2020 19:48
par EmileF
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

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

Publié : 13 Avr 2020 20:06
par Nikolls
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.

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

Publié : 13 Avr 2020 20:47
par djulio74
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.

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

Publié : 13 Avr 2020 20:52
par EmileF
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

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

Publié : 22 Avr 2020 16:02
par Nikolls
Eh bien j'essayerais ça plus tard et je vous dirais!

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

Publié : 26 Avr 2020 22:08
par E3DStef
Bonsoir,

Pourquoi ne pas utiliser les navmesh ?

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

A+

Stef