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
}
}
}
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
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.
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...
-
Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
× 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.
Pas d'aide concernant le code par MP, le forum est là pour ça :)