[DB AL] IA Patrouillant autour d'une plateforme
Publié : 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:
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:
Voilà merci à ce qui auront le courage de tout lire et répondre!
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:
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;
}
}
}