[Résolu] Empêcher d'appuyer sur un bouton sous certaines conditions

Questions à propos du scripting. Hors Shader, GUI, Audio et Mobile.
Vevitek
Messages : 6
Inscription : 17 Mars 2021 20:18

[Résolu] Empêcher d'appuyer sur un bouton sous certaines conditions

Message par Vevitek » 18 Avr 2021 17:15

Le titre n'est peut-être pas adapté mais je ne savais pas trop comment décrire mon problème de façon concise.

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;
        }*/
    } 
}
Dernière édition par Vevitek le 24 Avr 2021 16:24, édité 1 fois.

Avatar de l’utilisateur
jmhoubre
Messages : 851
Inscription : 05 Oct 2019 22:05

Re: Empêcher d'appuyer sur un bouton sous certaines conditions

Message par jmhoubre » 19 Avr 2021 02:20

Bonsoir,

il s'agit toujours du Kuka iiwa LBR 14 ?

Je n'ai pas forcément bien compris tes explications (par exemple, au début tu indiques qu'il y a 12 boutons, et plus loin, chacun des 4 scripts est associé à un bouton : comment fait-on la répartition des scripts sur les boutons ?). J'ai regardé la doc du Kuka iiwa LBR 14, elle mentionne 7 axes : tu mentionnes 6 axes.

Voici comment j'ai compris ton problème : en supposant que mon bras soit ton bras articulé, tu veux que si ma main touche un meuble, l'avant-bras, le bras et l'épaule soit bloqués ?
Si c'est cela, je ferais comme ceci : 2 scripts A et B sont attachés à chaque partie. Le script A détecte (avec les fonctions trigger) les collisions et déclenche un event (en fait 2 : un pour OnTriggerEnter, un pour OnTriggerExit). Le script B écoute les événements, et agit en conséquence sur la partie à laquelle il est attaché (désactivation du ou des boutons concernés).

Vevitek
Messages : 6
Inscription : 17 Mars 2021 20:18

Re: Empêcher d'appuyer sur un bouton sous certaines conditions

Message par Vevitek » 19 Avr 2021 22:19

Merci de votre réponse,

Il s'agit bien de celui-là, j'ai en effet 6 axes car je n'ai pas encore eu l'utilité de faire tourner l'organe terminal, je me contente de déplacer le bras en lui-même. J'ai d'une part 6 boutons pour faire tourner chaque partie dans un sens et 6 autres boutons pour faire tourner dans l'autre sens (en somme j'ai des scripts YPLUS, YMOINS, ZPLUS, ZMOINS, ça peut paraître brutal mais comme je débute je n'ai trouvé que ça). Une partie sur deux est orientée selon l'axe z, l'autre selon l'axe y.

Vous avez bien compris mon problème.

J'ai encore du mal à formaliser comment savoir quels boutons doivent être arrêtés. Ou alors y a-t-il un moyen de dire "arrêter tel script exécuter sur tel gameObject"? Je suis désolé du manque de clarté, c'est très visuel. Je ne vois pas très bien ce que mon script A pourrait dire à B. Je vais me renseigner sur les Event Systems, ça ressemble bien à ce qui pourrait m'aider mais je n'en ai encore jamais utilisé.

Merci beaucoup pour votre réponse détaillée.

Vevitek
Messages : 6
Inscription : 17 Mars 2021 20:18

Re: Empêcher d'appuyer sur un bouton sous certaines conditions

Message par Vevitek » 24 Avr 2021 16:24

J'ai réussi sans passer par un event system, j'ai fait comme jmhoubre m'avait conseillé. Un script détecte les collisions sur chaque partie et renvoie un booléen qui est récupéré par le script relatif au bouton sur lequel on appuie et qui s'adapte. Merci encore de votre aide :-D .

Répondre

Revenir vers « Scripting »