[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 : 32
Inscription : 22 Oct 2016 00:24

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

Message par Matocs » 26 Avr 2021 23:06

Bonjour tout le monde , j'essaye de faire en sorte que lorsque j'appuie sur E mon personnage porte l'objet en face de lui et que lorsque j'appuie une 2eme fois sur E il le pose, seulement je n'arrive pas a definir le parent de l'objet sur null lorsque j'appuie une 2eme fois :/

Code : Tout sélectionner

 if (Input.GetKeyDown(KeyCode.E) && game_object_touched.tag == "Ramassable")
        {
            ramasser = true;
            Debug.Log("un objet est porté");
            game_object_touched.transform.parent = GameObject.Find("FirstPersonCharacter").gameObject.transform;
            game_object_touched.GetComponent<Rigidbody>().isKinematic = !game_object_touched.GetComponent<Rigidbody>().isKinematic;
            text_interaction.GetComponent<Text>().enabled = false;
            
        }
merci d'avance :)

Avatar de l’utilisateur
jmhoubre
Messages : 851
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 » 26 Avr 2021 23:16

Bonsoir,
quelque part, il devrait y avoir un test pour savoir si un objet est porté. Dans ce cas on le lâche, sinon on prend l'objet touché.

Tel que c'est codé, la condition pour prendre ou lâcher l'objet dépend de game_object_touched, ce qui peut conduire à des soucis s'il est null.

Il me semble plus judicieux de faire :

Code : Tout sélectionner

Transform membrePortant;

private void Start ()
{
	// Met en cache la référence du GameObjet qui porte.
	// Ce serait judicieux d'ajouter un empty dans le personnage...
	membrePortant = GameObject.Find("FirstPersonCharacter").gameObject.transform;

private void Update ()
{
	if (touche E pressée)
	{
		if (un objet est-il tenu ?)
		{
			LeLacher ();
		}
		else
		{
			if(game_object_touched != null)
			{
				if (game_object_touched.CompareTag("Ramassable)
				{
					game_object_touched.transform.SetParent(membrePortant, false);
					// Ta sauce...
				}
			}
		}
	}
}

private void LeLacher ()
{
	// Si l'objet a un rigidbody, laisser faire la physique, sinon traiter la chute de l'objet
	// Par exemple on le téléporte 1 unité devant les pieds du personnage
	
	game_object_touched.transform.parent = null;
}
Dernière édition par jmhoubre le 26 Avr 2021 23:34, édité 1 fois.

Matocs
Messages : 32
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 » 26 Avr 2021 23:25

voila le code complet si jamais vous voyez ou est mon erreur :/

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 ramasser;
    public GameObject text_interaction;

    public int nombre_de_cubes;
    void Start()
    {
        text_interaction.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;
        }

        
        // Pour Les Objets Ramassables (clés etc...)
        if (Input.GetKeyDown(KeyCode.E) && game_object_touched.tag == "Ramassable")
        {
            ramasser = true;
            Debug.Log("un objet est porté");
            game_object_touched.transform.parent = GameObject.Find("FirstPersonCharacter").gameObject.transform;
            game_object_touched.GetComponent<Rigidbody>().isKinematic = !game_object_touched.GetComponent<Rigidbody>().isKinematic;
            
            
        }
        if (game_object_touched.tag == "Ramassable")
        {
            text_interaction.GetComponent<Text>().enabled = true;
        }
        if (ramasser == true)
        {
            text_interaction.GetComponent<Text>().enabled = false;
        }
        

        if(game_object_touched.tag == "Ramassable" )
        {
            text_interaction.GetComponent<Text>().enabled = true;
        }
        

        //pour les objets que l'on peu collecter (pieces etc...)
        if (Input.GetKeyDown(KeyCode.E) && game_object_touched.tag == "Cube")
        {
            Debug.Log(game_object_touched.name + " a été ramassé");
            game_object_touched.SetActive(false);
            nombre_de_cubes = +1;
           

        }


    }
}

Matocs
Messages : 32
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 » 26 Avr 2021 23:28

il y a un autre probleme c'est que meme lorsque le raycast ne touche plus l'objet étant donné qu'il est le dernier a avoir été touché le message ne disparait pas tant que je ne touche pas un autre game object

Matocs
Messages : 32
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 » 26 Avr 2021 23:31

jmhoubre a écrit :
26 Avr 2021 23:16
Bonsoir,
quelque part, il devrait y avoir un test pour savoir si un objet est porté. Dans ce cas on le lâche, sinon on prend l'objet touché.
j'ai essayer en créant une condition if(objet_ramasser = false && input.getkey(keycode.e)) sauf que unity me renvoie une erreur comme quoi je ne peu pas mettre de bool dans le &&

Avatar de l’utilisateur
jmhoubre
Messages : 851
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 » 26 Avr 2021 23:38

Le test d'égalité c'est == et non pas =.
Tu as des bases en C# ou en programmation ?

Matocs
Messages : 32
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 » 26 Avr 2021 23:39

jmhoubre a écrit :
26 Avr 2021 23:38
Le test d'égalité c'est == et non pas =.
Tu as des bases en C# ou en programmation ?
ouai mais pas sur tout notamment le == je pensais que c'était strictement égal

Matocs
Messages : 32
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 » 26 Avr 2021 23:42

en effet mon erreur pour le texte provenait du == Ducoup j ai pu régler ca merci beaucoup :) reste plus que le parent a définir sur null et le game_object_porter lorsqu'il ne touche plus et il n'y auras plus de problèmes

Avatar de l’utilisateur
jmhoubre
Messages : 851
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 » 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.

Matocs
Messages : 32
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 » 26 Avr 2021 23:51

En gros ce qui reglerait tout mes problemes ca serait de dire si j'appuie sur E ca fait une action , si je rappuie sur E ca fait l'inverse et que cela soit répétable

Répondre

Revenir vers « (C#) CSharp »