Page 3 sur 3

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

Publié : 27 Avr 2021 20:21
par Matocs

Code : Tout sélectionner

public static T[] ShuffleArray<T>(T[] array, int seed)
{
	// Cette méthode renvoie un tableau mélangé selon l'algorithme de Fisher-Yates. 
}
je n'ai rien compris a l'utilité de cette ligne :gene:

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

Publié : 27 Avr 2021 21:04
par jmhoubre
Il s'agit juste d'un exemple de commentaire utile.

Dans cet exemple, le code de la fonction, n'étant pas l'objet de l'exemple, est absent.

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

Publié : 28 Avr 2021 11:13
par boubouk50
Dans l'idée, définir une fonction par action n'est pas forcément lisible et efficace, surtout si elle fait la même chose. Mieux vaut définir une voir deux fonctions pour synthétiser:

Code : Tout sélectionner

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;
}
devient:

Code : Tout sélectionner

//Afficher le Text _texte par défaut ou le masquer
	void AfficherTexte (Text _texte, bool _afficher = true)
	{
		_texte.enabled = _afficher;
	}
Le component Text et le booléen sont passés en paramètre.

Code : Tout sélectionner

void Awake ()
{
	// Récupérer les components Text
	textePorter = text_interaction_porter.GetComponent<Text>();
	texteRamasser = text_interaction_ramasser.GetComponent<Text>();
}
	
void Start()
{
	// Masquer les Texts
	AfficherTexte (textePorter, false);
	AfficherTexte (texteRamasser, false);
}
pareil pour ramasser_objet () et lacher_objet () deviennent:

Code : Tout sélectionner

// Ramasser ou Lacher l'objet en fonction de _ramasser
void RamasserObjet (bool _ramasser)
{
        game_object_touched.GetComponent<Rigidbody>().isKinematic = _ramasser;
        game_object_touched.transform.parent = _ramasser ? player.transform : null;
        porter = _ramasser;
}
Ce que tu fais fonctionne, c'est juste que ça prend beaucoup de place et quand tu auras une vingtaine d'action, ce sera encore plus lisible de regrouper.

Par contre, comme disait JMHoubre, ton Update () est difficile à comprendre au niveau des conditions. Beaucoup de répétitions, de tests inutiles et de logique séparée. J'ai essayé de concaténer ça, mais ça ne me parle pas trop encore...

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;
	
	private Text texteRamasser = null;
	private Text textePorter = null;
	
	void Awake ()
	{
		// Récupérer les components Text
        	textePorter = text_interaction_porter.GetComponent<Text>();
        	texteRamasser = text_interaction_ramasser.GetComponent<Text>();
	}
	
	void Start()
	{
		// Masquer les Texts
        	AfficherTexte (textePorter, false);
        	AfficherTexte (texteRamasser, false);
	}

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

        if (Physics.Raycast(transform.position, transform.forward , out hit, 3))
        {
            game_object_touched = hit.transform.gameObject;
        }
        else
        {
            game_object_touched = null;
        }

        if (game_object_touched != null)
		{
			if (game_object_touched.tag == "Ramassable")
			{
				if (porter)
					AfficherTexte (textePorter, false);
				else
					AfficherTexte (texteRamasser);
					
				if (Input.GetKeyDown(KeyCode.E))
				{
					RamasserObjet (!porter);
				}
			}
			else
			{
				if(game_object_touched.tag == "Cube")
				{
					AfficherTexte (texteRamasser, !porter);
					
					if (Input.GetKeyDown(KeyCode.E) && !porter)
					{
						collect();
						nombre_de_cubes += 1;
						AfficherTexte (texteRamasser, porter);
					}
				}
			}
		}
	}

	void collect()
	{
		game_object_touched.SetActive(false);
	}
	
	// Ramasser ou Lacher l'objet en fonction de _ramasser
	void RamasserObjet (bool _ramasser)
	{
        	game_object_touched.GetComponent<Rigidbody>().isKinematic = _ramasser;
        	game_object_touched.transform.parent = _ramasser ? player.transform : null;
        	porter = _ramasser;
	}

	//Afficher le Text _texte par défaut ou le masquer
	void AfficherTexte (Text _texte, bool _afficher = true)
	{
		_texte.enbaled = _afficher;
	}
}
En regroupant, on constate que la logique est chancelante, que les cas sont traités un par un plutôt que d'entrevoir une globalité.

Attention, ce code ne fonctionne peut être pas exactement comme tu le souhaites. J'ai concaténé sans être sûr de comprendre la logique derrière.