Bonjour à tous,
Je pense que mon problème est plutôt commun mais j'ai eu beau écumer les pages webs, je n'ai pas trouvé quelque chose de satisfaisant . J'ai un bras robotique commandé par 12 boutons avec six axes de rotations (2 boutons pour tourner dans un sens ou l'autre), il peut alors occuper une multitude de positions dans l'espace. Ce bras repose sur un support et j'aimerais que lorsqu'il entre en collision avec un objet quelconque (surtout le support et lui-même) on ne puisse plus appuyer sur le bouton. Je suis donc passé par les fonctions triggers mais celles-ci ne s'appliquent que par rapport à l'objet sur lequel le script est appliqué. Pour être plus clair, si une extrémité se trouve à l'intérieur d'un objet, cette extrémité ne peut pas bouger mais la partie inférieure peut tourner et donc toutes les parties supérieures peuvent se déplacer à l'intérieur de l'objet en question. J'aimerais donc savoir si il est possible d'utiliser un OnTriggerEnter sur plusieurs colliders. En espérant avoir été assez clair. Voici un des quatre scripts que j'ai utilisé (deux par axe et deux par sens de rotation mais l'idée est la même pour tous les codes). Chacun de ces scripts est associé à un des boutons évoqués précédemment.
Code : Tout sélectionner
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class SupZPLUS : MonoBehaviour
{
public GameObject objectRotate;
Rigidbody Rigid1;
Rigidbody Rigid2;
Rigidbody Rigid3; //Rigidbody des différentes parties
Rigidbody Rigid4; //articulées du Kuka que l'on contraint par la suite
Rigidbody Rigid5;
Rigidbody Rigid6;
//Rigidbody[] Rigids; //définira tous les objets possédant un rigidbody, cela permet de gérer les différentes interactions avec l'environnement
Rigidbody Rigid;
private List<Rigidbody> Rigids;
GameObject[] machines; //de même que les rigidbodies, on cherche à récupérer tous les gameobjects
GameObject machine;
public float rotateSpeed = 50f; //vitesse de rotation
bool rotateStatus = false; //initialisation du booléen relatif à la rotation comme faux car immobile au lancement de la scène
public GameObject Sup1;
public GameObject Sup2; //on crée une référence aux différentes parties
public GameObject Sup3; // partie du Kuka pour pouvoir travailler sur celles-ci
public GameObject Sup4;
public GameObject Sup5;
public GameObject Sup6;
bool detectCollision;
private float zRotation;
void Start()
{
Rigid1 = Sup1.GetComponent<Rigidbody>();
Rigid2 = Sup2.GetComponent<Rigidbody>();
Rigid3 = Sup3.GetComponent<Rigidbody>();
Rigid4 = Sup4.GetComponent<Rigidbody>(); //définir les parties à figer pour ne pas avoir de mouvements induits dans Update
Rigid5 = Sup5.GetComponent<Rigidbody>();
Rigid6 = Sup6.GetComponent<Rigidbody>();
Rigids= new List<Rigidbody>();
machines=GameObject.FindGameObjectsWithTag("Machine");
int i=0;
foreach( GameObject machine in machines)
{
Rigids.Add(machine.GetComponent<Rigidbody>());
Debug.Log(machine.name);
i++;
}
Debug.Log(i); //compter les machines
}
public void RotateObject()
{
if (rotateStatus == false)
{
rotateStatus = true;
}
else
{
rotateStatus = false;
}
}
// Update is called once per frame
void Update()
{
if(!detectCollision)
{
zRotation= objectRotate.transform.localRotation.eulerAngles.z;
if (rotateStatus == true && ( zRotation<=120 || zRotation >=220 ))
{
objectRotate.transform.Rotate (Vector3.forward, rotateSpeed * Time.deltaTime);
}
else if (zRotation>120f && zRotation<180f)
{
objectRotate.transform.localEulerAngles = new Vector3(transform.localEulerAngles.x, transform.localEulerAngles.y,119.99991f);
}
else if (zRotation<220f && zRotation>180f)
{
objectRotate.transform.localEulerAngles = new Vector3(transform.localEulerAngles.x, transform.localEulerAngles.y,220.001f);
}
}
}
void LateUpdate()
{
Rigid1.constraints = RigidbodyConstraints.FreezeAll;
Rigid2.constraints = RigidbodyConstraints.FreezeAll;
Rigid3.constraints = RigidbodyConstraints.FreezeAll;
Rigid4.constraints = RigidbodyConstraints.FreezeAll;
Rigid5.constraints = RigidbodyConstraints.FreezeAll;
Rigid6.constraints = RigidbodyConstraints.FreezeAll;
}
void OnTriggerEnter(Collider col)
{
Debug.Log("ENTREE");
detectCollision = true;
GetComponent<SupZPLUS>().enabled = false;
Rigid1.constraints = RigidbodyConstraints.FreezeAll;
Rigid2.constraints = RigidbodyConstraints.FreezeAll;
Rigid3.constraints = RigidbodyConstraints.FreezeAll;
Rigid4.constraints = RigidbodyConstraints.FreezeAll;
Rigid5.constraints = RigidbodyConstraints.FreezeAll;
Rigid6.constraints = RigidbodyConstraints.FreezeAll;
/*switch( col.tag)
{
case "Machine":
print("ENTRE machine ZPLUS");
break;
case "Environnement":
detectCollision = true;
GetComponent<SupZPLUS>().enabled = false;
for(int i=0;i<machines.Length;i++)
{
//machines[i].GetComponent<Rigidbody>().enabled = false;
Rigids[i].constraints=RigidbodyConstraints.FreezeAll;
}
print("ENTRE machine ZPLUS");
break;
}*/
}
private void OnTriggerExit(Collider col)
{
Debug.Log("SORTIE");
detectCollision = false;
GetComponent<SupZPLUS>().enabled = true;
Rigid1.constraints = RigidbodyConstraints.None;
Rigid2.constraints = RigidbodyConstraints.None;
Rigid3.constraints = RigidbodyConstraints.None;
Rigid4.constraints = RigidbodyConstraints.None;
Rigid5.constraints = RigidbodyConstraints.None;
Rigid6.constraints = RigidbodyConstraints.None;
/*switch( col.tag)
{
case "Machine":
for(int i=0;i<machines.Length;i++)
{
Rigids[i].constraints=RigidbodyConstraints.None;
}
print("ça sort de soi ZPLUS");
break;
case "Environnement":
print("ça sort de la boite ZPLUS");
for(int i=0;i<machines.Length;i++)
{
Rigids[i].constraints=RigidbodyConstraints.None;
}
GetComponent<SupZPLUS>().enabled = true;
break;
}*/
}
}