Partage
  • Partager sur Facebook
  • Partager sur Twitter

Unity Js : fonction d'un script à partir d autre

    25 janvier 2020 à 22:30:54

    Bonjour

    J'ai vu ici mon pb

    https://openclassrooms.com/forum/sujet/unity-acceder-a-1-variable-depuis-1-autre-script

    mais je n'arrive pas à appliquer l'explication. De plus j'ai fait un autre post hier sur ce sujet mais quand j'écrit sur le post cela s'écrit mal, du coup je refait ce post.

    J'ai ce script sur sur 9 objets nommés Feu_orange. Dans un post il est dit de créer une variable égale à la fonction ( ici Start (on peut le faire?)) et de l'appeler par un autre script au moment de la fonction OnTriggerExit

    FeuCligotant.js 

    #pragma strict
    
    public var temps = 1.0;
    
    
    function Start () {
    
    while (true) {
    			yield WaitForSeconds(temps);
    			light.enabled = !light.enabled;
    		}
    
    }
    
    function Update () {
    
    }
    
    var FonctionChrono = Start;
    
    

    Dans le gros script , OntriggerEnter désactive les Feu_orange. OnTiggerExit doit réactiver la fonction Start 

    Dans ce gros script, ligne 14 je déclare la variable scriptfeuxdesclignotantsorange pour le script  FeuClignotant ( est-ce bon ?)

    lignes 163 à 165, j'ai essayé 3 façons de le faire mais cela ne va pas.

    lignes 163 et 165 j'ai ce code erreur qui dit que l'objet n'existe pas mais je sèche et ligne 162 erreur SetActive n'existe pas

    NullReferenceException: Object reference not set to an instance of an object
    DeclencheurFeu.OnTriggerExit (UnityEngine.Collider other) (at Assets/Intersection et feux/Feu rouge/DeclencheurFeu.js:165)



    Pourriez-vous m'aider svp ?

    Merci

    gros script      DeclencheurFeu.js

    #pragma strict
    
    /*  internet en java http://www.unity3d-france.com/unity/phpBB3/viewtopic.php?f=7&t=3653
    
        internet en C#  http://www.unity3d-france.com/unity/phpBB3/viewtopic.php?t=972
        https://openclassrooms.com/forum/sujet/unity-acceder-a-1-variable-depuis-1-autre-script
    */
    
    
     //déclenche l'arret des 3 feux clignotants orange
    // mise au vert pour voie du bus
    // mise au rouge pour les 2 voies de coté pour voie du bus
    
    var scriptfeuxdesclignotantsorange :  FeuClignotant;
    
    
    var feuOrangeDeclencheur : GameObject;
    var feuOrangeDroit : GameObject;
    var feuOrangeGauche : GameObject;
    var petitfeuOrangeDeclencheur : GameObject;
    var petitfeuOrangeDroit : GameObject;
    var petitfeuOrangeGauche : GameObject;
    
    var feuVertDeclencheur : GameObject;
    var feuVertDroit : GameObject;
    var feuVertGauche : GameObject;
    
    var petitfeuVertDeclencheur : GameObject;
    var petitfeuVertDroit : GameObject;
    var petitfeuVertGauche : GameObject;
    
    
    var feuRougeDeclencheur : GameObject;
    var feuRougeDroit : GameObject;
    var feuRougeGauche : GameObject;
    
    var petitfeuRougeDeclencheur : GameObject;
    var petitfeuRougeDroit : GameObject;
    var petitfeuRougeGauche : GameObject;
    
    
    var cube0kmDroit : GameObject;
    var cube50kmDroit : GameObject;
    var cube0kmGauche : GameObject;
    var cube50kmGauche : GameObject;
    
    var poteaupietonVertDeclencheur : GameObject;
    var poteaupietonVertDroit : GameObject;
    var poteaupietonVertGauche : GameObject;
    var poteaupietonRougeDeclencheur : GameObject;
    var poteaupietonRougeDroit : GameObject;
    var poteaupietonRougeGauche : GameObject;
    
    var grandpietonVertDeclencheur : GameObject;
    var grandpietonVertDroit : GameObject;
    var grandpietonVertGauche : GameObject;
    var grandpietonRougeDeclencheur : GameObject;
    var grandpietonRougeDroit : GameObject;
    var grandpietonRougeGauche : GameObject;
    
    
    
    
    function Start () {
    
    	
    feuOrangeDeclencheur.SetActive(true);	
    feuOrangeDroit.SetActive(true);	
    feuOrangeGauche.SetActive(true);	
    petitfeuOrangeDeclencheur.SetActive(true);	
    petitfeuOrangeDroit.SetActive(true);	
    petitfeuOrangeGauche.SetActive(true);	
    
    feuVertDeclencheur.SetActive(false);
    petitfeuVertDeclencheur.SetActive(false);	
    
    
    feuRougeDroit.SetActive(false);
    feuRougeGauche.SetActive(false);
    petitfeuRougeDroit.SetActive(false);
    petitfeuRougeGauche.SetActive(false);
    
    
    cube0kmDroit.SetActive(false);
    cube50kmDroit.SetActive(true);	
    cube0kmGauche.SetActive(false);
    cube50kmGauche.SetActive(true);	
    
    poteaupietonVertDeclencheur.SetActive(true);	
    poteaupietonVertDroit.SetActive(true);	
    poteaupietonVertGauche.SetActive(true);	
    poteaupietonRougeDeclencheur.SetActive(false);
    poteaupietonRougeDroit.SetActive(false);
    poteaupietonRougeGauche.SetActive(false);
    	
    
    grandpietonVertDeclencheur.SetActive(true);	
    grandpietonVertDroit.SetActive(true);	
    grandpietonVertGauche.SetActive(true);	
    grandpietonRougeDeclencheur.SetActive(false);
    grandpietonRougeDroit.SetActive(false);
    grandpietonRougeGauche.SetActive(false);	
    	
    
    }
    
    
    
    function Update() {
    		}
    function OnTriggerEnter (other : Collider)
       {
    	
    // arret feux orange OK ***********************   
    feuOrangeDeclencheur.SetActive(false);
    feuOrangeDroit.SetActive(false);
    feuOrangeGauche.SetActive(false);	
    petitfeuOrangeDeclencheur.SetActive(false);
    petitfeuOrangeDroit.SetActive(false);
    petitfeuOrangeGauche.SetActive(false);
    
    // allumage feux vert bus OK ***********************  
    feuVertDeclencheur.SetActive(true);
    petitfeuVertDeclencheur.SetActive(true);	
    
    // allumage feux rouge des 2 autres voies OK *********************** 
    feuRougeDroit.SetActive(true);
    feuRougeGauche.SetActive(true);
    petitfeuRougeDroit.SetActive(true);
    petitfeuRougeGauche.SetActive(true);
    
    // extinction feux rouge bus  ***********************  
    feuRougeDeclencheur.SetActive(false);
    petitfeuRougeDeclencheur.SetActive(false);
    
    
    // Modif des vitesses OK ***********************
    cube0kmDroit.SetActive(true);
    cube50kmDroit.SetActive(false);	
    cube0kmGauche.SetActive(true);
    cube50kmGauche.SetActive(false);
    // ********************************************
    
    poteaupietonVertDeclencheur.SetActive(false);
    poteaupietonVertDroit.SetActive(true);
    poteaupietonVertGauche.SetActive(true);
    poteaupietonRougeDeclencheur.SetActive(true);
    poteaupietonRougeDroit.SetActive(false);
    poteaupietonRougeGauche.SetActive(false);
    	
    
    grandpietonVertDeclencheur.SetActive(false);	
    grandpietonVertDroit.SetActive(true);	
    grandpietonVertGauche.SetActive(true);	
    grandpietonRougeDeclencheur.SetActive(true);
    grandpietonRougeDroit.SetActive(false);
    grandpietonRougeGauche.SetActive(false);	   
       
    	}
    function OnTriggerExit (other : Collider)
       {
    
        scriptfeuxdesclignotantsorange = GameObject.Find("Feu_orange").GetComponent(FeuClignotant); // Cherche l'objet nommé Cube et récupère le FeuClignotant
     scriptfeuxdesclignotantsorange.FonctionChrono.SetActive(true); //Accède a la variable du FeuClignotant et l'active ??
       scriptfeuxdesclignotantsorange.Start(); // Lance la fonction Start du FeuClignotant
       
       
       
    
    // Réactivation du script de clignotement ????????? 
    // Reprise à voir  feux orange ???????????????????***********************
    // extinction des feux  oranges
    feuOrangeDeclencheur.SetActive(false);	
    feuOrangeDroit.SetActive(false);	
    feuOrangeGauche.SetActive(false);	
    petitfeuOrangeDeclencheur.SetActive(false);
    petitfeuOrangeDroit.SetActive(false);	
    petitfeuOrangeGauche.SetActive(false);
    //**************************************
    //**************************************
    //**************************************
    
    
    // allumage feux rouge bus  ***********************  
    feuRougeDeclencheur.SetActive(true);
    petitfeuRougeDeclencheur.SetActive(true);
    
    // extinction feux vert bus *********************** 
    feuVertDeclencheur.SetActive(false);	
    petitfeuVertDeclencheur.SetActive(false);	
    
    			
    
    // allumage feux vert des 2 autres voies OK *********************** 
    feuVertDroit.SetActive(true);
    feuVertGauche.SetActive(true);
    petitfeuVertDroit.SetActive(true);
    petitfeuVertGauche.SetActive(true);
    
    // extinction feux rouge des 2 autres voies OK *********************** 
    feuRougeDroit.SetActive(false);	
    feuRougeGauche.SetActive(false);	
    petitfeuRougeDroit.SetActive(false);	
    petitfeuRougeGauche.SetActive(false);	
    
    
    
    
    
    // Modif des vitesses OK ***********************
    cube0kmDroit.SetActive(false);
    cube50kmDroit.SetActive(true);	
    cube0kmGauche.SetActive(false);
    cube50kmGauche.SetActive(true);
    // ********************************************
    
    poteaupietonVertDeclencheur.SetActive(true);
    poteaupietonVertDroit.SetActive(false);
    poteaupietonVertGauche.SetActive(false);
    poteaupietonRougeDeclencheur.SetActive(false);
    poteaupietonRougeDroit.SetActive(true);
    poteaupietonRougeGauche.SetActive(true);
    	
    
    grandpietonVertDeclencheur.SetActive(true);
    grandpietonVertDroit.SetActive(false);
    grandpietonVertGauche.SetActive(false);
    grandpietonRougeDeclencheur.SetActive(false);
    grandpietonRougeDroit.SetActive(true);
    grandpietonRougeGauche.SetActive(true);
       
       
       
       
       
       
       
       
       
       
    	}
    
       
    





    • Partager sur Facebook
    • Partager sur Twitter
      26 janvier 2020 à 0:00:55

      Bonjour,

      Une explication plus claire de votre problème serait souhaitable car bien que vous dites que c'est le même probleme que sur un autre post, on ne sait pas ce que vous souhaitez faire ni précisemment votre probleme.

      Tout d'abord je tiens à préciser que UnityJS est devenu obsolète depuis environ 2017 et il est donc très déconseillé de programmer dans ce langage (surtout que la documentation commence à dater).

      Je ne suis pas un grand connaisseur de UnityJS mais le problème me semblerait plutot de venir de la ligne 164 puisque setActive n'est pas sensé fonctionner comme cela (du moins en C#). Essayez de mettre un print(ou l'équivalent en UnityJs) pour voir si le programme continue après la ligne 164.

      D'ailleurs il est  très légérement plus optimisé d'utiliser un tag et gameObject.findGameObjectWithTag() que gameObject.find, surtout si votre projet risque de devenir assez gros (mais c'est du petit détail)

      De plus GameObject.find() retourne le premier objet, donc l'un des 9 feux et ne s'appliquera donc pas à tout les feux.

      Je pense qu'il serait tout de même préférable de refaire le script en C# pour qu'il soit plus facile de trouver sur internet des réponses à vos questions car rien que pour trouver facilement des exemples propres d'appel de fonctions sous UnityScript sur Google fut mission impossible pour moi.

      -
      Edité par coukil 26 janvier 2020 à 0:02:15

      • Partager sur Facebook
      • Partager sur Twitter
        26 janvier 2020 à 8:35:37

        using UnityEngine;
        
        /*http://www.unity3d-france.com/unity/phpBB3/viewtopic.php?f=7&t=2540&start=10  
        
        using UnityEngine;
        using System.Collections;
        
        public class load_audio_collider1 : MonoBehaviour {
        
        private bool flag = false;
        
        void Awake() {
                MonAwake();
            }
        
        	IEnumerator Decompte()
            {
                yield return new WaitForSeconds(15);
            }
        
        
        void Start()
        	{
        	collider.isTrigger = true;
        	}
        
        
        void OnTriggerEnter(Collider other) 
        	{
        	Decompte();
        	flag = true;
        	}
        
        void OnTriggerExit(Collider other) 
        	{
        	flag = false;			
        	}	
        }
         */
        
        
        using UnityEngine;
        using System.Collections;
        using System;
        
        public GameObject groupeVertD;
        public GameObject groupeOrangeD;
        public GameObject groupeRougeD;
        
        public class DeclencheurFeu : MonoBehaviour {
        
        	void Start () {
        		groupeVertD.SetActive(false);
        		groupeOrangeD.SetActive(true);
        		groupeRougeD.SetActive(false);	
        		}
        
        
        
        	private void OnTriggerEnter(Collider other){
        		groupeVertD.SetActive(false);
        		groupeOrangeD.SetActive(false);
        		groupeRougeD.SetActive(true);	   
        	}
        
        
        
        	private void OnTriggerExit(Collider other){
        
        
        		yield WaitForSeconds(7.0);
        
        		while (true) {
        			yield WaitForSeconds(temps);
        			groupeOrangeD.RendererEnabled = !groupeOrangeD.RendererEnabled
        		}
        		
        		groupeVertD.SetActive(false);
        		groupeOrangeD.SetActive(true);
        		groupeRougeD.SetActive(false);
        	}
        	
        
        }
        


        Bonjour
        Merci de ton aide

        J'ai essayé en C# et j'ai juste mis 3 groupes d'objets
        J'ai 2 types d'erreur
        lignes 7 et 8
        error CS0116: A namespace can only contain types and namespace declarations
        ligne 31
        error CS1525: Unexpected symbol `(', expecting `)', `,', `;', `[', or `='

        31 Je pense que ce n'est pas la bonne méthode

        35 idem pour la déclaration
        7 et 8 , je ne troue pas comment bien déclarer

        En début, c'est un script que j'ai trouvé mais je n'arrive pas à l'appliquer

        -
        Edité par freepl 26 janvier 2020 à 10:42:23

        • Partager sur Facebook
        • Partager sur Twitter
          26 janvier 2020 à 10:59:48

          Bonjour,

          Tout d'abord les variables :

          public GameObject groupeVertD;
          public GameObject groupeOrangeD;
          public GameObject groupeRougeD;

          doivent être insérés dans la classe en dessous de "public class Declencheur...."

          De plus il y a deux fois la ligne "using UnityEngine"

          Je ne crois pas que ce soit une bonne idée de faire une boucle while(true) dans une partie du script. Si tu souhaite faire qu'un code s'execute en permanence, met le dans le Update() mais dans ton cas je ne vois meme pas à quoi sert cette boucle.

          Ensuite si tu souhaite faire qu'il y ai un temps d'attente dans ton code, utilise les coroutines en faisant une fonction IEnumerator et en l'appelant avec StartCoroutine()  (n'hésite pas à regarder sur internet pour des exemples tels que):

          https://docs.unity3d.com/ScriptReference/Coroutine.html

          PS : n'oublie pas de référencer tes gameObjects groupeVert, groupeOrange, groupeRouge dans l'inspecteur.

          • Partager sur Facebook
          • Partager sur Twitter
            26 janvier 2020 à 11:33:30

            /*http://www.unity3d-france.com/unity/phpBB3/viewtopic.php?f=7&t=2540&start=10  
            
            using UnityEngine;
            using System.Collections;
            
            public class load_audio_collider1 : MonoBehaviour {
            
            private bool flag = false;
            
            void Awake() {
                    MonAwake();
                }
            
            	IEnumerator Decompte()
                {
                    yield return new WaitForSeconds(15);
                }
            
            
            void Start()
            	{
            	collider.isTrigger = true;
            	}
            
            
            void OnTriggerEnter(Collider other) 
            	{
            	Decompte();
            	flag = true;
            	}
            
            void OnTriggerExit(Collider other) 
            	{
            	flag = false;			
            	}	
            }
             */
            //////////////////////////////////////////////
            
            
            
            
            
            using UnityEngine;
            using System.Collections;
            using System;
            
            
            
            public class DeclencheurFeu : MonoBehaviour {
            
            	public GameObject groupeVertD;
            	public GameObject groupeOrangeD;
            	public GameObject groupeRougeD;v
            
            	void Start () {
            		groupeVertD.SetActive(false);
            		groupeOrangeD.SetActive(true);
            		groupeRougeD.SetActive(false);	
            		}
            
            
            
            	private void OnTriggerEnter(Collider other){
            		groupeVertD.SetActive(false);
            		groupeOrangeD.SetActive(false);
            		groupeRougeD.SetActive(true);	   
            	}
            
            
            
            	private void OnTriggerExit(Collider other){
            
            
            		yield WaitForSeconds(7.0);
            
            		while (true) {
            			yield WaitForSeconds(temps);
            			groupeOrangeD.RendererEnabled = !groupeOrangeD.RendererEnabled;
            		}
            		
            		groupeVertD.SetActive(false);
            		groupeOrangeD.SetActive(true);
            		groupeRougeD.SetActive(false);
            	}
            	
            
            }
            


            Je corrige petit à petit

            code modifié plus haut

            Mon projet c'est un feu de circulation commandé par ontrigger

            triggerEnter , les feux passent à vert  / triggerExit , les feux passent à orange clignotant c'est le pourquoi de ma boucle

            lige 57 il ne reconnait pas void ( (57,12): error CS1519: Unexpected symbol `void' in class, struct, or interface member declaration)

            lige 76 eet 79 (error CS1525: Unexpected symbol `(', expecting `)', `,', `;', `[', or `=')

            • Partager sur Facebook
            • Partager sur Twitter
              26 janvier 2020 à 12:51:27

              Tu as mis un v à la fin de la ligne 54.

              Le yield n'est pas sensé fonctionner dans une fonction non Ienumator.

              Tente d'utiliser un editeur de code type VisualStudio ou VsCode, il te soulignera les erreurs dans ton code.

              Plutot que d'utiliser un while true, tu pourrais utiliser un InvokeRepeating et appeler une fonction qui désactive puis active peu de temps après.

              Tu dis que les feux passent vert lors du enter mais tu désactive pourtant tout les feux sauf le rouge  dans ton OnTriggerEnter.

                  public GameObject feuVert;
                  public GameObject feuOrange;
              
                  void Start()//Se lance au debut du programme
                  {
                      feuVert.SetActive(false);
                      feuOrange.SetActive(false);
              
                      InvokeRepeating("ClignoterOrange", 0, 3.0f);//On lance le clignotement du feu Orange
              
              
              
                  }
              
              
                  void ClignoterOrange() {
              
              
                      StartCoroutine(ClignoterFeu(feuOrange));//On appel ClignoterFeu
              
                  }
              
                  IEnumerator ClignoterFeu(GameObject feu)
                  {
                      
                      feu.SetActive(true);//On le met actif
                      yield return new WaitForSeconds(1.5f);//On attend 1.5s
                      feu.SetActive(false);//on le desactive
              
                  }
              
              
              
                  private void OnTriggerEnter(Collider other)
                  {
                      feuVert.SetActive(true);//on active le feu vert
                      feuOrange.SetActive(false);//on desactive le feu orange
              
                      CancelInvoke("ClignoterOrange");//On annule le clignotement du feu orange
                  }
              
              
              
                  private void OnTriggerExit(Collider other)
                  {
              
                      feuVert.SetActive(false);
                      InvokeRepeating("ClignoterOrange", 0, 3.0f);
              
                  }

              Voici un exemple de moyen de faire clignoter le feu orange et d'aretter le clignotement lorsque le joueur entre. Cela ne marche que pour un seul feu.


              Je te conseille de voir des tutos sur la programmation sous Unity car j'ai l'impression que tu y vas un peu à l'aveugle.

              -
              Edité par coukil 26 janvier 2020 à 12:54:58

              • Partager sur Facebook
              • Partager sur Twitter
                26 janvier 2020 à 20:02:36

                Bonsoir  et merci pour to script

                Je l'ai utilisé et j'ai 7 fois cette erreur

                error CS0116: A namespace can only contain types and namespace declarations

                aux lignes 1,19  2,19  4,6  16,6  23,13  34,14 et 44,14

                • Partager sur Facebook
                • Partager sur Twitter
                  26 janvier 2020 à 20:12:00

                  J'ai mis ici que le code de la classe DeclencheurFeu,

                  Le code entier est donc :

                  using System.Collections;
                  using System.Collections.Generic;
                  using UnityEngine;
                  
                  public class DeclencheurFeu: MonoBehaviour
                  {
                      public GameObject feuVert;
                      public GameObject feuOrange;
                  
                      void Start()
                      {
                          feuVert.SetActive(false);
                          feuOrange.SetActive(false);
                  
                          InvokeRepeating("ClignoterOrange", 0, 5.0f);
                  
                  
                  
                      }
                  
                  
                      void ClignoterOrange() {
                  
                  
                          StartCoroutine(ClignoterFeu(feuOrange));
                  
                      }
                  
                      IEnumerator ClignoterFeu(GameObject feu)
                      {
                          Debug.Log("ici");
                          feu.SetActive(true);
                          yield return new WaitForSeconds(2.5f);
                          feu.SetActive(false);
                  
                      }
                  
                  
                  
                      private void OnTriggerEnter(Collider other)
                      {
                          feuVert.SetActive(true);
                          feuOrange.SetActive(false);
                  
                          CancelInvoke("ClignoterOrange");
                      }
                  
                  
                  
                      private void OnTriggerExit(Collider other)
                      {
                  
                          feuVert.SetActive(false);
                          InvokeRepeating("ClignoterOrange", 0, 5.0f);
                  
                      }
                  
                  
                  }
                  
                  

                   Si jamais tu souhaite activer/desactiver plusieurs feux, il te faudra utiliser une List<GameObject> et un foreach mais je te laisse chercher et apprendre pour cela.

                  -
                  Edité par coukil 26 janvier 2020 à 20:14:26

                  • Partager sur Facebook
                  • Partager sur Twitter

                  Unity Js : fonction d'un script à partir d autre

                  × 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