[Résolu][DB-AL] IA Basique - Mouvement aléatoire d'une balle

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
AllezCacahuète
Messages : 10
Inscription : 13 Juil 2017 13:39

[Résolu][DB-AL] IA Basique - Mouvement aléatoire d'une balle

Message par AllezCacahuète » 18 Juil 2017 10:38

Bonjour à tous ,

Donc voilà mon petit souci , j'essaye de créer un mouvement aléatoire d'une balle et j'ai trouvé le tuto parfait pour ça ===> https://www.youtube.com/watch?v=u4ArxWDiPu8

Pas la peine de voir la vidéo , voilà le script à retenir :

Code : Tout sélectionner

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

public class IA : MonoBehaviour {

private float speed=20 ;
  
void Start ()
 {
 }

void Update() 
{
 transform.Translate(Vector3.forward * speed * Time.deltaTime);
 if (Physics.Raycast(transform.position, transform.TransformDirection(Vector3.forward) , 1))
 {
  transform.Rotate(Vector3.up * Random.Range(90, 180));
  }
  }
}
Ce code fonctionne ... sauf que au bout de quelques secondes (c'est aléatoire) , la balle touche à la l'obstacle et au lieu de rebondir , se barre hors de l'arène (c'est à dire traverse l'obstacle) . Pourtant sa Position y reste fixe .
Et je suis quasiment sûr que le problème ne vient pas de moi mais du code car déjà , le gars de la vidéo a quelques soucis techniques.
Il y aurait-il un code "plus propre" pour ce petit mouvement aléatoire de rien du tout ?
Merci d'avoir pris la peine de me lire ;) .
Dernière édition par AllezCacahuète le 28 Juil 2017 16:38, édité 2 fois.
Tu me kiffes , je te kiffe alors on est kif-kif

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6216
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: [DB-AL] IA Basique - Mouvement aléatoire d'une balle

Message par boubouk50 » 18 Juil 2017 11:11

Ton code ne fait pas ce que tu dis.

Ici, ta balle avance tout droit jusqu'à ce qu'elle soit à moins d'1 unité d'un collider. Lorsqu'elle est suffisamment proche, elle effectue une rotation aléatoire indépendante de la collision. De ce fait, elle peut très bien continuer à avancer jusqu’à sortir du cadre.

Pour qu'elle reste dans le cadre, il faut récupérer la normale contenue dans le hit et effectuer une rotation aléatoire en fonction de ce vecteur pour que la balle parte du bon côté.

Il existe des événements liés à la collision (OnCollisionEnter (), OnCollisionExit (), etc) qui se déclenchent lorsque ta balle entre en collision avec un collider. Ainsi, plus besoin de test dans l'Update (), juste un appel événementiel au moment de la collision.
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

Avatar de l’utilisateur
AllezCacahuète
Messages : 10
Inscription : 13 Juil 2017 13:39

Re: [DB-AL] IA Basique - Mouvement aléatoire d'une balle

Message par AllezCacahuète » 23 Juil 2017 13:54

Tout d'abord , merci boubouk50 pour ta réponse !

Sinon , effectivement , ce code ressemblait beaucoup à ce que je voulais avoir mais ne faisait finalement pas ce que je voulais/disais .
J'ai modifié le code et maintenant , c'est un vrai mouvement aléatoire (Ça ne va plus tout droit) :D .

Aussi , j'ai écouté tes conseils et utilisé un "OnCollisionEnter ()" et avec le nouveau code , ça a donné ça :

Code : Tout sélectionner

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

public class Mouvement : MonoBehaviour
{

    private const float speed = 20f;
    private Vector3 direction;

    void Start()
    {
        direction = (new Vector3(Random.Range(-1.0f, 1.0f), 0.0f, Random.Range(-1.0f, 1.0f))).normalized;
    }

    void Update()
    {
        transform.position += direction * speed * Time.deltaTime;
    }


    void OnCollisionEnter(Collision hit)

    {
        direction = (new Vector3(Random.Range(-1.0f, 1.0f), 0.0f, Random.Range(-1.0f, 1.0f))).normalized;
    }


}
Donc dès qu'il y a une collision , la direction change aléatoirement comme voulu .
Sauf que la balle sort encore parfois du cadre et a un comportement encore plus fou qu'avant . ><
Tu me kiffes , je te kiffe alors on est kif-kif

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6216
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: [DB-AL] IA Basique - Mouvement aléatoire d'une balle

Message par boubouk50 » 24 Juil 2017 09:29

Salut,

Encore une fois, ton mouvement aléatoire n'est pas dépendant de la collision. Il faut que ta balle rebondisse avec la contrainte du mur, donc elle doit être bornée pour ne pas sortir dur cadre. Il te manque donc le calcul de cette borne.
Pour cela, il te faut récupérer la normale au point de contact. Et magie du moteur physique, Unity te donne tout dans la fonction OnColliderEnter ().
En effet, tu récupères le collider touché (collision), qui lui te donne le point de contact (collision.contacts) qui lui te donne la normale (collision.contacts[0].normal). Ainsi, grâce à cette normale tu peux définir les bornes de la nouvelle direction pour éviter que ta balle sorte du cadre.
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

Avatar de l’utilisateur
AllezCacahuète
Messages : 10
Inscription : 13 Juil 2017 13:39

Re: [DB-AL] IA Basique - Mouvement aléatoire d'une balle

Message par AllezCacahuète » 28 Juil 2017 16:37

Hey , encore une fois , merci pour ta réponse !

Donc en fait , il fallait juste ajouter un "Vector3.Reflect" .

Code : Tout sélectionner

    void OnCollisionEnter(Collision hit)

    {
        dir = Vector3.Reflect(direction,hit.contacts[0].normal);
        direction = dir.normalized;
    }
Ça a l'air de bien fonctionner pour le moment , à part que les boules se barrent (encore) toutes les 80 secondes environ .
Mais je pense pas que ça soit à cause du code (D'ailleurs les boules deviennent folles comme avant quand j'augmente leur taille/scale ) .
Si quelqu'un a une explication , ça m'aiderait beaucoup (Mais je vais quand-même mettre résolu) .

En tout cas , merci à toi boubouk50 ! J'ai apprécié le fait que tu me guides mais sans vraiment me donner la réponse , ça m'a vraiment beaucoup aidé tout en m'obligeant à faire des recherches par moi-même .
J'oublierai pas de te citer dans les crédits de mon prochain jeu à succès x) .
Tu me kiffes , je te kiffe alors on est kif-kif

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6216
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: [Résolu][DB-AL] IA Basique - Mouvement aléatoire d'une balle

Message par boubouk50 » 28 Juil 2017 17:20

Je préfère que les membres cherchent plutôt que de copier, ça leur permet d'apprendre, de comprendre et d'assimiler.
Qui plus est, je n'ai pas toutes les réponses, puisque je ne connaissais pas la fonction Reflect () de Vector3...

Pour la folie de tes balles, cela veut dire quoi? Qu'elles accélèrent?
Si c'est le cas et qu'elles se barrent, c'est que le déplacement entre 2 frames est supérieur à la distance de collision. Du coup, sur la 1e frame la balle est dedans, sur la 2e, elle est dehors. Donc pas de collisions.
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

Avatar de l’utilisateur
ZJP
Messages : 5748
Inscription : 15 Déc 2009 06:00

Re: [Résolu][DB-AL] IA Basique - Mouvement aléatoire d'une balle

Message par ZJP » 28 Juil 2017 21:56

boubouk50 a écrit :
28 Juil 2017 17:20
... puisque je ne connaissais pas la fonction Reflect () de Vector3..
idem.. ;-)

Répondre

Revenir vers « (C#) CSharp »