rebondissement d'objets instanciés

Pour les scripts écrits en C#
Règles du forum
Merci de respecter la NOMENCLATURE suivante pour vos TITRES de messages :

Commencez par le niveau de vos scripts
DB = Débutant
MY = Moyen
CF = Confirmé

Puis le domaine d'application
-RS = Réseau
-AL = Algorithmie

Exemple :

[DB-RS] Mouvement perso multijoueur
Avatar de l’utilisateur
Kaloverian
Messages : 342
Inscription : 10 Août 2016 03:03

rebondissement d'objets instanciés

Message par Kaloverian » 05 Avr 2023 16:15

bonjour,

Voici 2 scripts appliqués à un même objet(une sphère par exemple)dont survient un léger problème de programmation.
Pour des scripts simples,j'arrive à les faire communiquer entre eux.

Le 1er script instance_3balls.cs instancie 3 objets comme ceci:

Code : Tout sélectionner

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class instance_3balls : MonoBehaviour
{ 
   
    public GameObject objet1;
    List<GameObject> ObjectList;
    int i;
   
    
    public int variable_i;

    // Start is called before the first frame update
    void Start()
    {
      
        ObjectList=new List<GameObject>();
         for(i=0;i<3;i++)
         {variable_i=i;
           ObjectList.Add(objet1);
           ObjectList[i] = new GameObject("toto" + i);
           ObjectList[i].transform.position=new Vector3(2*i,0,0);
           ObjectList[i].AddComponent<BallBouncer_without_rigidbody3>();
         
          ObjectList[i].GetComponent<BallBouncer_without_rigidbody3>().get_i=objet1; //une erreur réside à cette ligne
          ObjectList[i].GetComponent<BallBouncer_without_rigidbody3>().initialVelocity=new Vector3(1+i,0,3*(1+i));
          ObjectList[i].GetComponent<BallBouncer_without_rigidbody3>().minVelocity=20;
           
          
     }
    }

    // Update is called once per frame
    void Update()
    {   
       



         
    }
}

Le second script BallBouncer_without_rigidbody3 permet le rebondissement d'un objet obj récupéré dans le 1er script par son nom.

Code : Tout sélectionner

using System.Collections;
using System.Collections.Generic;
using UnityEngine;


public class BallBouncer_without_rigidbody3: MonoBehaviour
{ 
  public instance_3balls  get_i;//get_i doit récupérer la valeur de i du 1er script.Comme i est une variable non 
                                                                    publique,la ligne variable_i=i est nécessaire car vriable_i est publique
  
   GameObject obj;
   int p;
  

    public Vector3 initialVelocity;
    public float minVelocity;

     Vector3 lastFrameVelocity;
   
   
  void Start()
      { //récupére l'objet ObjectList[i] du 1er script
           p=get_i.variable_i;
          obj=GameObject.Find("toto"+p);
          
     }

    private void OnEnable()
    {  
      
      lastFrameVelocity=initialVelocity;//initilaVelocity est attribué dans le 1er script
     

    }

     void Update()
    {
      
     obj.transform.Translate(Time.deltaTime*lastFrameVelocity.x,Time.deltaTime*lastFrameVelocity.y,Time.deltaTime*lastFrameVelocity.z);
 
    }
     
    
    private void OnCollisionEnter(Collision collision)
    {
        Bounce(collision.contacts[0].normal);
    }
    
    private void Bounce(Vector3 collisionNormal)
    {
       
      var direction = Vector3.Reflect(lastFrameVelocity.normalized, collisionNormal);
     lastFrameVelocity = direction*minVelocity;
   //   print("lastFrameVelocity: ("+lastFrameVelocity.x+","+lastFrameVelocity.y+","+lastFrameVelocity.z);
    
    }
}
ça ne fonctionne pas ! Pourqoui?


merci de votre aide

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6208
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: rebondissement d'objets instanciés

Message par boubouk50 » 06 Avr 2023 09:18

Les deux scripts effectuent leur tâche dans le Start ().
Tu n'as aucun moyen de savoir que l'un est effectué avant l'autre.

Si le Start () du second script est lancé en premier, alors variable_i n'est pas encore initialisé, et les balles ne sont pas encore instanciées, donc tu ne peux rien récupérer du tout.

C'est encore et toujours un problème d'architecture et de logique.
Lorsque tu crées une balle, alors le premier script devrait appeler une fonction du second script en lui donnant la balle en paramètre pour que ce second script fasse ce qu'il a à faire avec.

Ici, c'est au petit bonheur la chance. Ça n'existe pas en programmation. Tout doit être cadré et réfléchi.
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

Répondre

Revenir vers « (C#) CSharp »