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

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
Matocs
Messages : 28
Inscription : 22 Oct 2016 00:24

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

Message par Matocs » 27 Avr 2021 20:21

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:

Avatar de l’utilisateur
jmhoubre
Messages : 437
Inscription : 05 Oct 2019 22:05

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

Message par jmhoubre » 27 Avr 2021 21:04

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.

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 5578
Inscription : 28 Avr 2014 11:57
Localisation : Toulouse

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

Message par boubouk50 » 28 Avr 2021 11:13

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.
"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 »