Page 1 sur 1

[RESOLU] pourquoi ce script simple ne fonctionne-t-il pas?

Publié : 07 Jan 2022 00:03
par Kaloverian
bonjour,

J'ai un objet obj qui est translaté dans un environnment.
Je souhaite que dès l'objet arrive à la fin de l'environnement,il s'y retrouve au début.
Cela ne fonctionne pas avec ce script basique et je ne comprends pas pourquoi ?

Code : Tout sélectionner

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


public class end_to_start : MonoBehaviour
{   
    public GameObject environment,obj;

    float debut_environment,fin_environment;

    public float speed;

    Vector3 posObj;
    
    // Start is called before the first frame update
    void Start()
    {
        float debut_environment=-environment.GetComponent<Transform>().localScale.z/2;
         float fin_environment=environment.GetComponent<Transform>().localScale.z/2;
         print("debut environment: "+debut_environment);
         print("fin environment: "+fin_environment);
    }     
      
    // Update is called once per frame
    void Update()
    { 
          
        obj.transform.Translate(0,0,speed*Time.deltaTime,Space.Self);
       Vector3 posObj=obj.GetComponent<Transform>().position;
        

        if(posObj.z==fin_environment)
        {
            obj.transform.position=new Vector3(posObj.x,posObj.y,debut_environment);
        }
      
    }
}

merci de votre aide

Re: pourquoi ce script simple ne fonctionne-t-il pas?

Publié : 07 Jan 2022 09:00
par Max
Bonjour,

tu déclares et initialises tes variables debut_environment et fin_environment de façon locale dans Start.
Mais la portée de ces déclarations reste limitée à la méthode Start.
Ce qui veut dire que par exemple dans ton Update, debut_environment et fin_environment sont toujours à zéro.

Le concept de variable locale/globale est un concept de base dans le manipulations des données au sein du code.

En suite, accessoirement, on évite les tests d’égalité sur des floats.

Re: pourquoi ce script simple ne fonctionne-t-il pas?

Publié : 07 Jan 2022 16:23
par Kaloverian
Ceci ne fonctionne toujours pas.Pourquoi?

Code : Tout sélectionner

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



public class end_to_start : MonoBehaviour
{   
    public GameObject environment,obj;

    float debut_environment,fin_environment;

    

    public float speed;

    Vector3 posObj;
    
    // Start is called before the first frame update
    void Start()
    {
       
    }

    // Update is called once per frame
    void Update()
    {   debut_environment=-environment.GetComponent<Transform>().localScale.z/2;
         fin_environment=environment.GetComponent<Transform>().localScale.z/2;
          
        obj.transform.Translate(0,0,speed*Time.deltaTime,Space.Self);
        Vector3 posObj=obj.GetComponent<Transform>().position;
      

        if(posObj.z==fin_environment)
        {
            obj.transform.position=new Vector3(posObj.x,posObj.y,debut_environment);
            
        }
      
    }
}

[/code

Re: pourquoi ce script simple ne fonctionne-t-il pas?

Publié : 07 Jan 2022 17:45
par Max
Tu ne semble pas voir lu la remarque faite dans mon précédent message.
On évite au maximum les tests d'égalité sur les float. Dans ton cas il vaut mieux écrire if (posObj.z > fin_environment).

Re: [RESOLU] pourquoi ce script simple ne fonctionne-t-il pas?

Publié : 07 Jan 2022 17:51
par Kaloverian
ok merci!
résolu