Page 1 sur 1

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

Publié : 21 Août 2020 11:03
par simiji
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);
    	}
	}
}

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

Publié : 21 Août 2020 11:37
par boubouk50
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.

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

Publié : 21 Août 2020 11:59
par simiji
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

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

Publié : 21 Août 2020 13:42
par boubouk50
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 ()

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

Publié : 21 Août 2020 21:28
par simiji
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);
    	}
	}
}

  
    


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

Publié : 22 Août 2020 09:51
par Max
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 ?