[DB-AL] Détruire un prefab lors d'une collision

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
simiji
Messages : 21
Inscription : 06 Avr 2017 16:51

[DB-AL] Détruire un prefab lors d'une collision

Message par simiji » 21 Août 2020 11:03

Ouaip, ça me blase un peu de vous demander ça ahah mais je galère sur un truc tout simple en fait...

Mon code est opérationnel, j'ai bien fait attention aux tags, mon objet est correctement instancier MAIS pas moyen de faire fonctionner le OnCollisionEnter... Allez-savoir, il y a un truc qui ne veux pas :/

Du coup, je me demandais si vous auriez une idée s'il vous plaît du pourquoi et du comment ce code, qui a la base est niveau débutant, ne veux pas marcher ?

Le voici :

Code : Tout sélectionner

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

public class CollisionHeart : MonoBehaviour
{
   public GameObject Coeur;  
   float score;
    
    void Start()
    {        

        for (int i = 0; i < 1; i++) 
        { 
        Instantiate(Coeur);
        
    	}   
    }

    void OnCollisionEnter(Collision otherObj) 
    {
    	// j'ai utilisé ce Debug pour voir si le OnCollisionEnter fonctionnais et... surprise ! ça ne marche pas 
    	Debug.Log("yes");
       
    	if (otherObj.gameObject.tag == "Player") 
    	{
    		score = score +1;
    		//oui je me laisse des petits mots dans mes Debug, on ne juge pas. 
    		Debug.Log("Aussi surpprenant que cela puisse paraître ; oui je fonctionne.");
        	Destroy(Coeur.gameObject);
    	}
	}
}

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

Re: [DB-AL] Détruire un prefab lors d'une collision

Message par boubouk50 » 21 Août 2020 11:37

https://docs.unity3d.com/ScriptReferenc ... Enter.html
OnCollisionEnter is called when this collider/rigidbody has begun touching another rigidbody/collider.
Cette fonction est appelée lorsqu'un collider/rigidbody touche un autre collider/rigidbody.

As-tu bien des colliders/rigidbodies sur tes objets qui possèdent ce script?

https://docs.unity3d.com/Manual/LayerBa ... ision.html
Les collisions sont gérées en fonction des layers. Certains ne réagissent pas avec d'autres. La configuration est-elle bien faite?

Aussi, as-tu une erreur console? par exemple, si Coeur n'est pas affecté, cela créerait un arrêt du script.

Ton script est à revoir pour d'autres raisons, mais il devrait être fonctionnel tout de même.
"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

simiji
Messages : 21
Inscription : 06 Avr 2017 16:51

Re: [DB-AL] Détruire un prefab lors d'une collision

Message par simiji » 21 Août 2020 11:59

J'ai vérifié les collider, ils sont tous placés et en "is trigger".

Voici la seule erreur que j'obtiens mais elle concerne un autre script : NullReferenceException: Object reference not set to an instance of an object changeTextScreen.Start () (at Assets/Scripts/Keyboard/changeTextScreen.cs:12)

Mon script c'est CollisionHeart

Mouaip j'ai encore à apprendre niveau programmation mais je part du postulat que tant que ça fonctionne c'est ok ahah

Peut-tu m'en dire plus sur les layers s'il te plaît ? Comment vérifier ce point ?

En tout cas, merci pour la rapidité de ta réponse :D

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

Re: [DB-AL] Détruire un prefab lors d'une collision

Message par boubouk50 » 21 Août 2020 13:42

simiji a écrit :
21 Août 2020 11:59
J'ai vérifié les collider, ils sont tous placés et en "is trigger".
Voilà donc ton erreur.
Un trigger et un Collider ne sont pas la même chose (même si sur le même component).
Un trigger est un simple déclencheur alors qu'un collider gère une collision.
Il te faut donc utiliser OnTriggerEnter ()
"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

simiji
Messages : 21
Inscription : 06 Avr 2017 16:51

Re: [DB-AL] Détruire un prefab lors d'une collision

Message par simiji » 21 Août 2020 21:28

Génial :D merci c'était ça, fonctionne !

J'ai une dernière petite question si tu est d'accord :gene: L'objet instancier reste en place, il n'est pas détruit alors que tout fonctionne. Je n'ai pas d'erreur dans la console du coup j'aimerais avoir ton avis : savoir si tu voit un truc qui ne va pas ? Ai-je loupé un truc ? Je ne comprend pas :/

Voici le code à jour :

Code : Tout sélectionner

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

public class CollisionHeart : MonoBehaviour
{
   

   public GameObject Coeur;
   private GameObject LeCoeur;  
   
   float score;
    
    void Start()
    {        

        for (int i = 0; i < 1; i++) 
        { 
        GameObject LeCoeur = Instantiate(Coeur, new Vector3(-6.7f, 16.5f, 3.64f), Quaternion.identity);      
    	}

         
    }

    void OnTriggerEnter(Collider otherObj) 
    {
    	Debug.Log("yes");
       
    	if (otherObj.gameObject.tag == "Player") 
    	{
    		Debug.Log("Destroy");
    		score = score +1;
    		Destroy(LeCoeur,1);
    	}
	}
}

  
    


Avatar de l’utilisateur
Max
Newser
Newser
Messages : 7975
Inscription : 30 Juil 2011 13:57

Re: [DB-AL] Détruire un prefab lors d'une collision

Message par Max » 22 Août 2020 09:51

Bonjour,

c'est normal. Il faut que tu appréhendes le concept de variable globale et de variable locale.
Quand tu définis private GameObject LeCoeur;, il s'agit d'une définition globale, dont la porté sera globale à ton script.
Mais quand dans Start() tu écris GameObject LeCoeur = Instantiate() dans ta boucle "for", en fait tu définis une donnée locale, dont la porté va se cantonner juste à cette boucle. Et qui n'est pas la même que la donnée globale définis plus haut (même si leur nom est identique). Donc, quand tu fais dans ton OnTriggerEnter un Destroy(LeCoeur,1); et bien LeCoeur contient 'null' (tu dois probablement avoir une erreur console du genre NullReference...)

Dans ton Start, il faut donc juste écrire

Code : Tout sélectionner

LeCoeur = Instantiate(Coeur, new Vector3(-6.7f, 16.5f, 3.64f), Quaternion.identity);
En parlant de ça, ta boucle for avec une itération, à quoi sert elle ?
Pas d'aide par MP, le forum est là pour ça.
En cas de doute sur les bonnes pratiques à adopter sur le forum, consulter la Charte et sa FAQ

Répondre

Revenir vers « (C#) CSharp »