Page 2 sur 3

Re: [DB-AL] Définir le parent d'un Game Object lorsque j'appuie une 2eme fois sur une touche

Publié : 26 Avr 2021 23:51
par jmhoubre
Super.
Bon courage. Regarde ce que je t'ai proposé : ce pourrait t'aider...

Re: [DB-AL] Définir le parent d'un Game Object lorsque j'appuie une 2eme fois sur une touche

Publié : 26 Avr 2021 23:52
par Matocs
jmhoubre a écrit :
26 Avr 2021 23:50
Il est tard, et j'ai du mal à lire ton code.

Déjà, il y a une petite erreur ici :

Code : Tout sélectionner

	nombre_de_cubes = +1; // Affecte 1 à la variable.
	// Au lieu de :
	nombre_de_cubes += 1; // Ajoute 1 à la variable.
Tu devrais écrire quelques fonctions pour aérer ton Update (). Et t'inspirer de la logique de ce que je t'ai proposé ici.
ok je vais regarder si ça marche merci ;)

Re: [DB-AL] Définir le parent d'un Game Object lorsque j'appuie une 2eme fois sur une touche

Publié : 27 Avr 2021 00:28
par Matocs
Bon ducoup le ramassage d'objet c'est bon !
je vais penssera creer des fonctions plus souvent ça change vraiment tout !
ducoup voila le code au complet

Code : Tout sélectionner

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

public class ramassage : MonoBehaviour
{
    public GameObject game_object_porter;
    public GameObject game_object_touched;
    bool ramasser;
    bool porter;
    public GameObject text_interaction_porter;
    public GameObject text_interaction_ramasser;
    public GameObject player;

    public int nombre_de_cubes;
    void Start()
    {
        text_interaction_porter.GetComponent<Text>().enabled = false;
        text_interaction_ramasser.GetComponent<Text>().enabled = false;
        ramasser = false;
    }

    // Update is called once per frame
    void Update()
    {
        
        RaycastHit hit;
        Debug.DrawRay(gameObject.transform.position, gameObject.transform.forward * 2, Color.red);
       

        if (Physics.Raycast(gameObject.transform.position, gameObject.transform.forward , out hit, 2))
        {

            game_object_touched = hit.transform.gameObject;
        }


        

            if (Input.GetKeyDown(KeyCode.E) && porter == true && game_object_touched.tag == "Ramassable")
            {
                lacher_objet();
            }
            else
            {
                if (Input.GetKeyDown(KeyCode.E) && porter == false && game_object_touched.tag == ("Ramassable"))
                {
                    ramasser_objet();

                }
            }
        
        

      
       if (Input.GetKeyDown(KeyCode.E) && game_object_touched.tag == "Cube")
        {
            collect();
            nombre_de_cubes += 1;
           

        }


    }

    void ramasser_objet()
    {

        game_object_touched.GetComponent<Rigidbody>().isKinematic = true;
        game_object_touched.transform.parent = player.transform;
        porter = true;

    }

    void lacher_objet()
    {
        game_object_touched.GetComponent<Rigidbody>().isKinematic = false;
        game_object_touched.transform.parent = null;
        porter = false;
    }

    void collect()
    {

        game_object_touched.SetActive(false);
    }
}

le seul probleme qui persiste c'est que le game_object_touched n'est jamais nul il stock constament le dernier GO a avoir été touché ducoup le texte ne disparait pas

Re: [DB-AL] Définir le parent d'un Game Object lorsque j'appuie une 2eme fois sur une touche

Publié : 27 Avr 2021 00:50
par Matocs
Matocs a écrit :
27 Avr 2021 00:28
Bon ducoup le ramassage d'objet c'est bon !
je vais penssera creer des fonctions plus souvent ça change vraiment tout !
ducoup voila le code au complet

Code : Tout sélectionner

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

public class ramassage : MonoBehaviour
{
    public GameObject game_object_porter;
    public GameObject game_object_touched;
    bool ramasser;
    bool porter;
    public GameObject text_interaction_porter;
    public GameObject text_interaction_ramasser;
    public GameObject player;

    public int nombre_de_cubes;
    void Start()
    {
        text_interaction_porter.GetComponent<Text>().enabled = false;
        text_interaction_ramasser.GetComponent<Text>().enabled = false;
        ramasser = false;
    }

    // Update is called once per frame
    void Update()
    {
        
        RaycastHit hit;
        Debug.DrawRay(gameObject.transform.position, gameObject.transform.forward * 2, Color.red);
       

        if (Physics.Raycast(gameObject.transform.position, gameObject.transform.forward , out hit, 2))
        {

            game_object_touched = hit.transform.gameObject;
        }


        

            if (Input.GetKeyDown(KeyCode.E) && porter == true && game_object_touched.tag == "Ramassable")
            {
                lacher_objet();
            }
            else
            {
                if (Input.GetKeyDown(KeyCode.E) && porter == false && game_object_touched.tag == ("Ramassable"))
                {
                    ramasser_objet();

                }
            }
        
        

      
       if (Input.GetKeyDown(KeyCode.E) && game_object_touched.tag == "Cube")
        {
            collect();
            nombre_de_cubes += 1;
           

        }


    }

    void ramasser_objet()
    {

        game_object_touched.GetComponent<Rigidbody>().isKinematic = true;
        game_object_touched.transform.parent = player.transform;
        porter = true;

    }

    void lacher_objet()
    {
        game_object_touched.GetComponent<Rigidbody>().isKinematic = false;
        game_object_touched.transform.parent = null;
        porter = false;
    }

    void collect()
    {

        game_object_touched.SetActive(false);
    }
}

le seul probleme qui persiste c'est que le game_object_touched n'est jamais nul il stock constament le dernier GO a avoir été touché ducoup le texte ne disparait pas
bon bah enfait il sufisait de rajouter un else game_object_touched = null au if physics.raycast :)

Re: [DB-AL] Définir le parent d'un Game Object lorsque j'appuie une 2eme fois sur une touche

Publié : 27 Avr 2021 01:44
par Matocs
il y a un probleme sauf que je ne pense pas que la mon code soit faux voila le texte pour un objet portable :

Code : Tout sélectionner

if (game_object_touched != null &&  game_object_touched.tag == "Ramassable" && porter == false)
        {
            affichertexteporter();
        }
        else

        {
            

                enlevertexteporter();
            
        }
et celui d'un objet ramassable :

Code : Tout sélectionner

if(game_object_touched.tag == "Cube" && game_object_touched != null && porter == false)
        {

            affichertexteramasser();
        }
        else
        {
            Debug.Log("text_enlevé");
            enlevertexteramasser();
        }
pourtant meme lorsque le game_object_touched est == null car il ne touche aucun game object le texte du cube ramassable reste afficher jusqua ce que je regarde un autre game object, et comme je l'ai dit il n'y a pas ce probleme sur un objet portable :/

Re: [DB-AL] Définir le parent d'un Game Object lorsque j'appuie une 2eme fois sur une touche

Publié : 27 Avr 2021 08:57
par boubouk50

Code : Tout sélectionner

if(game_object_touched.tag == "Cube" && game_object_touched != null && porter == false)
Cette condition génèrera une erreur si game_object_touched vaut null car tu ne pourras pas accéder à propriété tag (null.tag n'existe pas).
Donc soit game_object_touched n'est pas remis à null, soit tu as une erreur.

Il me semble (à vérfiier) que les conditions logiques && se font par la gauche, donc modifier l'ordre évitera l'erreur:

Code : Tout sélectionner

if(game_object_touched != null && game_object_touched.tag == "Cube" && porter == false)
Ainsi, si game_object_touched vaut null, game_object_touched.tag ne sera pas vérifié car la condition vaudra déjà false.

Peux-tu poster l'entièreté de ton code stp? Qu'on puisse te donner un diagnostic complet.

Re: [DB-AL] Définir le parent d'un Game Object lorsque j'appuie une 2eme fois sur une touche

Publié : 27 Avr 2021 12:32
par jmhoubre
Bonjour,

content pour toi.

Une remarque : quand as-tu besoin de faire un raycast ? A mon sens, quand tu désires prendre un objet. Pour moi le code du raycast devrait être à l'intérieur du test de la touche E. Et même être une fonction. Quelque chose comme :

Code : Tout sélectionner

private void Update()
{
	// Prendre un objet
	if (Input.GetKeyDown(Keycode.E)
	{
		TestObject ();
	}
}

private void TestObject ()
{
	// Un objet ramassable est-il à portée ?
	if (Physics.Raycast(gameObject.transform.position, gameObject.transform.forward , Raycast out hit, 2)
	{
		game_object_touched = hit.transform.gameObject;
	
		if (game_object_touched.CompareTag("Ramassable")
		{
			DropObject ();
			TakeObject ();
		}
		else
		{
			game_object_touched = null;
		}
	}
}

private void DropObject ()
{
	game_object_touched.GetComponent<Rigidbody>().isKinematic = false;
    game_object_touched.transform.parent = null;
}

Re: [DB-AL] Définir le parent d'un Game Object lorsque j'appuie une 2eme fois sur une touche

Publié : 27 Avr 2021 17:20
par Matocs
boubouk50 a écrit :
27 Avr 2021 08:57

Code : Tout sélectionner

if(game_object_touched.tag == "Cube" && game_object_touched != null && porter == false)
Cette condition génèrera une erreur si game_object_touched vaut null car tu ne pourras pas accéder à propriété tag (null.tag n'existe pas).
Donc soit game_object_touched n'est pas remis à null, soit tu as une erreur.

Il me semble (à vérfiier) que les conditions logiques && se font par la gauche, donc modifier l'ordre évitera l'erreur:

Code : Tout sélectionner

if(game_object_touched != null && game_object_touched.tag == "Cube" && porter == false)
Ainsi, si game_object_touched vaut null, game_object_touched.tag ne sera pas vérifié car la condition vaudra déjà false.

Peux-tu poster l'entièreté de ton code stp? Qu'on puisse te donner un diagnostic complet.
ça a marché merci beaucoup !
sinon voici le code complet comme demandé

Code : Tout sélectionner

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

public class ramassage : MonoBehaviour
{
    
    public GameObject game_object_touched;

    bool porter;
    public GameObject text_interaction_porter;
    public GameObject text_interaction_ramasser;
    public GameObject player;

    public int nombre_de_cubes;
    void Start()
    {
        text_interaction_porter.GetComponent<Text>().enabled = false;
        text_interaction_ramasser.GetComponent<Text>().enabled = false;
        
    }

    // Update is called once per frame
    void Update()
    {
        
        RaycastHit hit;
        Debug.DrawRay(gameObject.transform.position, gameObject.transform.forward * 3, Color.red);
       

        if (Physics.Raycast(gameObject.transform.position, gameObject.transform.forward , out hit, 3))
        {

            game_object_touched = hit.transform.gameObject;
        }
        else
        {
            game_object_touched = null;
        }


        if (game_object_touched != null &&  game_object_touched.tag == "Ramassable" && porter == false)
        {
            affichertexteporter();
        }
        else

        {
            

                enlevertexteporter();
            
        }



            if (Input.GetKeyDown(KeyCode.E) && porter == true && game_object_touched.tag == "Ramassable")
            {
                lacher_objet();
            
        }

            else
            {
                if (Input.GetKeyDown(KeyCode.E) && porter == false && game_object_touched.tag == ("Ramassable"))
                {
                    ramasser_objet();
               

            }
            }
        
        
            if(game_object_touched != null && porter == false && game_object_touched.tag == "Cube" )
        {

            affichertexteramasser();
        }
        else
        {
           
                enlevertexteramasser();
            
            
        }
      
       if (Input.GetKeyDown(KeyCode.E) && game_object_touched.tag == "Cube" && porter == false)
        {
            collect();
            nombre_de_cubes += 1;
            enlevertexteramasser();


        }


    }

    void ramasser_objet()
    {

        game_object_touched.GetComponent<Rigidbody>().isKinematic = true;
        game_object_touched.transform.parent = player.transform;
        porter = true;

    }

    void lacher_objet()
    {
        game_object_touched.GetComponent<Rigidbody>().isKinematic = false;
        game_object_touched.transform.parent = null;
        porter = false;
    }

    void collect()
    {

        game_object_touched.SetActive(false);
    }

    void affichertexteporter()
    {
        text_interaction_porter.GetComponent<Text>().enabled = true;
    }
    void enlevertexteporter()
    {
        text_interaction_porter.GetComponent<Text>().enabled = false;
    }

    void affichertexteramasser()
    {
        text_interaction_ramasser.GetComponent<Text>().enabled = true;
    }

    void enlevertexteramasser()
    {
        text_interaction_ramasser.GetComponent<Text>().enabled = false;
    }
}




Re: [DB-AL] Définir le parent d'un Game Object lorsque j'appuie une 2eme fois sur une touche

Publié : 27 Avr 2021 17:20
par Matocs
jmhoubre a écrit :
27 Avr 2021 12:32
Bonjour,

content pour toi.

Une remarque : quand as-tu besoin de faire un raycast ? A mon sens, quand tu désires prendre un objet. Pour moi le code du raycast devrait être à l'intérieur du test de la touche E. Et même être une fonction. Quelque chose comme :

Code : Tout sélectionner

private void Update()
{
	// Prendre un objet
	if (Input.GetKeyDown(Keycode.E)
	{
		TestObject ();
	}
}

private void TestObject ()
{
	// Un objet ramassable est-il à portée ?
	if (Physics.Raycast(gameObject.transform.position, gameObject.transform.forward , Raycast out hit, 2)
	{
		game_object_touched = hit.transform.gameObject;
	
		if (game_object_touched.CompareTag("Ramassable")
		{
			DropObject ();
			TakeObject ();
		}
		else
		{
			game_object_touched = null;
		}
	}
}

private void DropObject ()
{
	game_object_touched.GetComponent<Rigidbody>().isKinematic = false;
    game_object_touched.transform.parent = null;
}
en effet c'est vrai que je ne réfléchis pas a l'optimisation en utilisant des fonctions merci du conseil

Re: [DB-AL] Définir le parent d'un Game Object lorsque j'appuie une 2eme fois sur une touche

Publié : 27 Avr 2021 18:50
par jmhoubre
Bonjour,

de rien.

Créer des fonctions n'est pas vraiment une optimisation dans ton cas (on ne les appelle qu'une fois), mais aide à la lisibilité du code et à sa maintenance.
Un codeur US (oncle Bob peut-être) estime qu'un codeur passe 90% de son temps à lire ou relire du code, contre 10% à l'écrire. Il est donc indispensable de prendre le temps d'améliorer sa lisibilité :
- indentation
- nommage des variables, membres de classe, méthodes ... Un nom long sera toujours mieux qu'un nom court avec un commentaire de 3 lignes, car le commentaire n'est qu'à un seul endroit.
- logique du code (ne pas se lancer dans l'écriture de plus de 2 ou 3 lignes de code sans avoir réfléchi, voire fait un schéma ou poser son algo en pseudo-code)
- ne pas se répéter (le code dupliqué devrait faire l'objet d'une méthode. On voit assez souvent l'acronyme DRY (Don't Repeat Yourself))
- commentaires :

Code : Tout sélectionner

// Commentaire inutile :
private void TakeObject ()
{
	// Cette fonction sert à prendre un objet.
}

// Commentaire utile (parce que cela ne saute pas aux yeux...)
public static T[] ShuffleArray<T>(T[] array, int seed)
{
	// Cette méthode renvoie un tableau mélangé selon l'algorithme de Fisher-Yates. 
}