Partage
  • Partager sur Facebook
  • Partager sur Twitter

Unity - bloquer un gameObject

    15 décembre 2018 à 0:23:56

    Bonjour, je rencontre un problème sur Unity, dans le cadre de la réalisation d'un logiciel pour une épreuve du Bac.

    Le rond rouge peut se déplacer aléatoirement, le rond blanc suit un mouvement aléatoire lui aussi. J'aimerais que malgré ces deux facteurs, le rond rouge ne quitte jamais le blanc.

    J'ai donc créé un collider Polygonal (2D car le logiciel sera en 2D) qui a la forme d'un cercle inversé.

    Quand le rond rouge le touche, il le détecte bien, tout est ok j'ai vérifié.

    Cependant il ne devrait pas sortir du blanc donc j'ai TOUT essayé (enfin tout sauf la bonne solution apparemment) : quand je détecte la collision, lui assigner une direction opposée à la précédente pour le renvoyer dans l'autre sens, ou même le téléporter à la position qu'il avait deux secondes plus tôt s'il touche le collider.

    A chaque fois au début ça marche mais il se débrouille pour sortir.

    Il faudrait vraiment que le collider vert le bloque.

    Voici le script du rond rouge

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class PlasmideMoveScript : MonoBehaviour
    {
    
    	//Vitesse
    
    	private float speedNumber = 0.3f;
    	private Vector2 speed;
    
    	//Direction
    	private Vector2 direction;
    
    	private Vector2 movement;
    	private Rigidbody2D rigidbodyComponent;
    
    	private float tpsDeplacement;
    
    	private float nombreAleatX;
    	private float nombreAleatY;
    
    	private bool nombreChange = false;
    	private bool coroutineAutorise = true;
    
    	void Awake()
    	{
    		speed = new Vector2(speedNumber, speedNumber);
    		nombreAleatX = Random.Range(-1.0f, 1.0f);
    		nombreAleatY = Random.Range(-1.0f, 1.0f);
    
    		tpsDeplacement = Random.Range(3.0f, 7f);
    
    		StartCoroutine(CoroutineNormale());
    	}
    
    	void Update()
    	{
    		if (nombreChange == false)
    		{
    			direction = new Vector2(nombreAleatX, nombreAleatY);
    
    			movement = new Vector2(
    			  speed.x * direction.x,
    			  speed.y * direction.y);
    		}
    		else
    		{
    			StartCoroutine(CoroutineNormale());
    			nombreChange = false;
    		}
    	}
    
    	void FixedUpdate()
    	{
    		if (rigidbodyComponent == null) rigidbodyComponent = GetComponent<Rigidbody2D>();
    
    
    		rigidbodyComponent.velocity = movement;
    	}
    
    	IEnumerator CoroutineNormale()
    	{
    		if (coroutineAutorise == true)
    		{
    			yield return new WaitForSeconds(tpsDeplacement);
    			nombreAleatX = Random.Range(-1.0f, 1.0f);
    			nombreAleatY = Random.Range(-1.0f, 1.0f);
    			nombreChange = true;
    		}
    	}
    
    	void OnTriggerEnter2D(Collider2D col)
    	{
    		if (col.gameObject.name == "membrane")
    		{
    			// Là je bloque
    		}
    	}
    }
    

    Merci !

    -
    Edité par Jean.V 16 décembre 2018 à 22:35:57

    • Partager sur Facebook
    • Partager sur Twitter
      15 décembre 2018 à 9:08:51 - Message modéré pour le motif suivant : La demande de l'équipe de modération a été honorée


      Pas d'aide concernant le code par MP, le forum est là pour ça :)

        16 décembre 2018 à 22:36:26

        Désolé je n'avais pas fait attention

        • Partager sur Facebook
        • Partager sur Twitter
          17 décembre 2018 à 9:01:03

          Il te faut un collider et un rigidbody sur tes deux gameobjects, le moteur physique d'Unity entrera en jeu et empechera le rond rouge de sortir du rond blanc
          • Partager sur Facebook
          • Partager sur Twitter
            22 décembre 2018 à 17:14:07

            Oui mais en faisant ça, le rond rouge sort direct du blanc car deux gameobjects ne peuvent pas se superposer donc il ne pourra jamais se situer à l'intérieur du blanc.
            • Partager sur Facebook
            • Partager sur Twitter
              2 janvier 2019 à 19:34:39

              Pourquoi sortir l'artillerie méga-lourde du moteur physique et autre colider, quand il suffit de connaitre l'équation de la distance entre 2 points.

              A chaque frame, vous calculez la distance entre les 2 points.

              Si elle est trop grande, vous changez les coordonnées du centre du cercle rouge pour qu'il revienne dans les clous.

              La manière de le remettre dans les clous, c'est fonction de vos goûts :

              -collez le centre du cercle rouge de diamètre "r" sur le cercle de centre celui du cercle blanc ("R" étant le rayon du cercle blanc), et de rayon (R-r). Pour la position sur le cercle, un peu de trigo pour maintenir l'angle entre les 2 centre (C'est comme si le bord du cercle blanc est absorbant)

              -calculer l'angle d'incidence de la trajectoire du cercle rouge par rapport au vecteur normal vers l'intérieur du cercle blanc, au niveau du point de contact entre les cercles. Utilisation de cet angle pour y applique une règle de réflexion de rayon. Le calcul de l'instant de la collision des 2 cercles donne la longueur entre le point d'impact et le nouveau centre du cercle rouge, en fonction de la vitesse du cercle rouge(C'est comme si le bord du cercle blanc est rigide et de poids infini).

              -etc...

              -

              • Partager sur Facebook
              • Partager sur Twitter
              Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
                7 janvier 2019 à 18:55:56

                D'accord merci beaucoup je vais essayer !
                • Partager sur Facebook
                • Partager sur Twitter

                Unity - bloquer un gameObject

                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                • Editeur
                • Markdown