"GameObject destroy" mais pourtant non

Questions à propos du scripting. Hors Shader, GUI, Audio et Mobile.
Bilu
Messages : 91
Inscription : 20 Nov 2019 09:24

"GameObject destroy" mais pourtant non

Message par Bilu » 02 Mars 2022 12:20

Bonjour à tous,

J'utilise le script suivant pour afficher des publicités avec unity-Ad. Je publie pourtant bien ma question dans cette partie du forum car c'est bien un problème de script, vous allez comprendre.

Code : Tout sélectionner

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Advertisements;

public class AdDisplay : MonoBehaviour, IUnityAdsInitializationListener, IUnityAdsLoadListener, IUnityAdsListener, IUnityAdsShowListener
{
    public string myGameIdAndroid = "XXXXXX";
    public string myGameIdIOS = "XXXXXX";
    public string myVideoPlacement = "supportad";
    public bool adStarted = false;
    public bool adInitializedComplete = false;
    private bool testMode = true;

    public GameObject panel;

    void Awake()
    {
        Debug.Log("Test 1");
        
        InitializedAd();
        Debug.Log("Test2)");
        
    }

    public void InitializedAd()
    {
        Debug.Log("Test3");
        
        Advertisement.Initialize(myGameIdAndroid, testMode, this);
        panel.SetActive(false);
        
        Debug.Log("Test4");
        
    }

    public void OnInitializationComplete()
    {
        Debug.Log("Unity Ads initialization complete");
        
    }

    public void OnInitializationFailed(UnityAdsInitializationError error, string message)
    {
        Debug.Log($"Unity Ads Initialization Failed : {error.ToString()} - {message}");
    }


    // Start is called before the first frame update
    void Update()
    {
        if (Advertisement.isInitialized)
        {
            adInitializedComplete = true;
        }
        //Debug.Log("test start ad_script");
        //Advertisement.AddListener(this);

        //Advertisement.Initialize(myGameIdAndroid, testMode);
        //panel.SetActive(false);
    }

    // Update is called once per frame
    public void ShowAd()
    {
        Advertisement.Load("supportad",this);
        //Debug.Log("test update ad_script");
        
        //Debug.Log("Advertissement ready : " + Advertisement.IsReady(supportad));
        // Debug.Log("adStarted" + adStarted);
        panel.SetActive(true);
        if (adInitializedComplete && /*Advertisement.IsReady(supportad) &&*/ !adStarted)
        {
            Advertisement.Show("supportad",this);
            adStarted = true;

        }
    }
    public void OnUnityAdsShowComplete(string adUnitId, UnityAdsShowCompletionState showCompletionState)
    {
        //Debug.Log("Test Show Complete");
        switch (showCompletionState)
        {
            case UnityAdsShowCompletionState.COMPLETED:
                Debug.Log("The ad was successfully shown.");
                //
                // CODE TO REWARD THE GAMER
                // Give coins etc.
                panel.SetActive(false);
                adStarted = false;
                Advertisement.Load("supportad", this);
                break;
            case UnityAdsShowCompletionState.SKIPPED:
                Debug.Log("The ad was skipped before reaching the end.");
                adStarted = false;
                Advertisement.Load("supportad", this);
                break;
            case UnityAdsShowCompletionState.UNKNOWN:
                Debug.LogError("The ad failed to be shown.");
                adStarted = false;
                Advertisement.Load("supportad", this);
                break;
        }
    }

    

    

    public void OnUnityAdsAdLoaded(string placementId)
    {
        Debug.Log("Cool c'est load");
        //throw new System.NotImplementedException();
    }

    public void OnUnityAdsFailedToLoad(string placementId, UnityAdsLoadError error, string message)
    {
        throw new System.NotImplementedException();
    }

    public void OnUnityAdsShowFailure(string placementId, UnityAdsShowError error, string message)
    {
        throw new System.NotImplementedException();
    }

    public void OnUnityAdsShowStart(string placementId)
    {
        Debug.Log("Cool c'est start to be show");
        //throw new System.NotImplementedException();
    }

    public void OnUnityAdsShowClick(string placementId)
    {
        throw new System.NotImplementedException();
    }

    /*public void OnUnityAdsShowComplete(string placementId, UnityAdsShowCompletionState showCompletionState)
    {
        throw new System.NotImplementedException();
    }*/
    void OnGUI()
    {
        GUI.Label(new Rect(300, 150, 300, 100), "adInitializedComplete : " + adInitializedComplete);
        GUI.Label(new Rect(300, 175, 300, 100), "adStarted : " + adStarted);
    }
}
Le code se lance quand je suis dans le Menu principal de mon jeu et il montre une publicité lorsqu'on appuie sur un bouton qui appel la fonction ShowAd(). Comme vous pouvez le voir, il y a un GameObject que j'ai appelé "panel" C'est juste un objet qui affiche "Ad loading" parce que ça met un peu de temps à s'afficher. Et lorsque la publicité est terminée le panel disparait grâce à la ligne

Code : Tout sélectionner

panel.SetActive(false);
dans

Code : Tout sélectionner

   public void OnUnityAdsShowComplete(string adUnitId, UnityAdsShowCompletionState showCompletionState)
    {
        //Debug.Log("Test Show Complete");
        switch (showCompletionState)
        {
            case UnityAdsShowCompletionState.COMPLETED:
                Debug.Log("The ad was successfully shown.");
                //
                // CODE TO REWARD THE GAMER
                // Give coins etc.
                panel.SetActive(false);
                adStarted = false;
                Advertisement.Load("supportad", this);
                break;
Quand on lance le jeu, tout se passe bien donc le panel affiche "Ad loading", puis la pub defile et une fois la pub terminée, le panel disparait et je peux faire ça autant de fois que je veux (je suis en mode test ;) ) . Par contre, quand je change de scène et que je reviens dans le Menu, si je clique sur le bouton, le panel ad loading apparait, la pub défile mais le panel "ad loading" reste affiché avec l'erreur dans la console suivante :

Code : Tout sélectionner

MissingReferenceException: The object of type 'GameObject' has been destroyed but you are still trying to access it.
Your script should either check if it is null or you should not destroy the object.
AdDisplay.OnUnityAdsShowComplete (System.String adUnitId, UnityEngine.Advertisements.UnityAdsShowCompletionState showCompletionState) (at Assets/ScriptGameVal/AdDisplay.cs:90)
UnityEngine.Advertisements.Platform.Editor.EditorPlatform+<>c__DisplayClass14_0.<Show>b__1 (System.Object sender, UnityEngine.Advertisements.Events.FinishEventArgs e) (at Library/PackageCache/com.unity.ads@4.0.0/Runtime/Advertisement/Platform/Editor/EditorPlatform.cs:156)
UnityEngine.Advertisements.Placeholder.<CreatePlaceholder>b__15_1 () (at Library/PackageCache/com.unity.ads@4.0.0/Runtime/Advertisement/Platform/Editor/Placeholder.cs:132)
UnityEngine.Events.InvokableCall.Invoke () (at <ad50157ee00e45cdb3c8bd67012f8804>:0)
UnityEngine.Events.UnityEvent.Invoke () (at <ad50157ee00e45cdb3c8bd67012f8804>:0)
UnityEngine.UI.Button.Press () (at Library/PackageCache/com.unity.ugui@1.0.0/Runtime/UI/Core/Button.cs:70)
UnityEngine.UI.Button.OnPointerClick (UnityEngine.EventSystems.PointerEventData eventData) (at Library/PackageCache/com.unity.ugui@1.0.0/Runtime/UI/Core/Button.cs:114)
UnityEngine.EventSystems.ExecuteEvents.Execute (UnityEngine.EventSystems.IPointerClickHandler handler, UnityEngine.EventSystems.BaseEventData eventData) (at Library/PackageCache/com.unity.ugui@1.0.0/Runtime/EventSystem/ExecuteEvents.cs:57)
UnityEngine.EventSystems.ExecuteEvents.Execute[T] (UnityEngine.GameObject target, UnityEngine.EventSystems.BaseEventData eventData, UnityEngine.EventSystems.ExecuteEvents+EventFunction`1[T1] functor) (at Library/PackageCache/com.unity.ugui@1.0.0/Runtime/EventSystem/ExecuteEvents.cs:272)
UnityEngine.EventSystems.EventSystem:Update() (at Library/PackageCache/com.unity.ugui@1.0.0/Runtime/EventSystem/EventSystem.cs:501)
(at Assets/ScriptGameVal/AdDisplay.cs:90)

J'ai surligné en rouge la partie qui cause problème et qui renvoie donc à la ligne

Code : Tout sélectionner

panel.SetActive(false);
Mais dans hierarchy, le panel est bien présent et dans le script AdDisplay, la variable GameObject panel est bien rempli avec le bon panel. Donc je ne comprends pas pourquoi il me dit qu'il est détruit surtout qu'avant de changer de Scène, tout était ok.
Pourriez-vous m'aider à identifier le soucis ?

Bien à vous,

Bilu
Dernière édition par Bilu le 02 Mars 2022 16:00, édité 2 fois.

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6225
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: "GameObject destroy" mais pourtant non

Message par boubouk50 » 02 Mars 2022 12:53

Ça sent le DontDestroyOnLoad () tout ça.

Je pense que ton objet qui possède le script AdDisplay n'est pas détruit en changeant de scène, et lorsque tu reviens dans la scène principale, toutes ces références sont détruites (avec le changement de scène).
Lorsque tu vérifies les données, tu vérifies sur le nouveau AdDisplay créé au chargement de scène, mais pas sur l'ancien. Il doit se trouver sous un noeud appelé DontDestroyOnLoad.
Sinon tu peux taper AdDisplay dans la barre de recherche de la hiérarchie pour voir toutes les occurrences.

Vérifie donc cela en premier stp.
"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

Bilu
Messages : 91
Inscription : 20 Nov 2019 09:24

Re: "GameObject destroy" mais pourtant non

Message par Bilu » 02 Mars 2022 13:02

Bonjour boubouk50,

Je viens de vérifier et il est bien détruit d'une scène à l'autre. Pas de DontDestroyOnLoad() de tout façon ^^

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6225
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: "GameObject destroy" mais pourtant non

Message par boubouk50 » 02 Mars 2022 14:01

Il n'y a pas de mystère en informatique, s'il te dit qu'il est détruit il est détruit.
Si tu le vois dans la hiérarchie et que tout est bien affecté, alors c'est que tu ne regardes pas au bon endroit.

Insère

Code : Tout sélectionner

if (panel != null)
juste avant

Code : Tout sélectionner

panel.SetActive(false);
Et dis moi si le panneau reste affiché ou non. S'il se masque, c'est qu'un autre component AdDisplay existe.
"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

Bilu
Messages : 91
Inscription : 20 Nov 2019 09:24

Re: "GameObject destroy" mais pourtant non

Message par Bilu » 02 Mars 2022 14:10

MERCI !!

Ca marche !!
Plus de soucis et le panel disparait bien comme il faut ^^

Merci encore mais pas sûr d'avoir compris pourquoi :gene2:

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6225
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: "GameObject destroy" mais pourtant non

Message par boubouk50 » 02 Mars 2022 15:14

Bilu a écrit :
02 Mars 2022 14:10
Merci encore mais pas sûr d'avoir compris pourquoi :gene2:
Si ça fonctionne c'est donc que tu as bien un objet contenant AdDisplay qui n'est pas détruit au changement de scène.
En testant la nullité de panel, j'ai court-circuité l'erreur pour ce cas donc ton panel n'aurait pas dû se masquer. Mais cela ne règle ne rien le problème qui va continuer de s'accumuler et pourra même faire une erreur ailleurs (au prochain ShowAd () peut-être)
Vérifie de nouveau au Runtime, passe plusieurs fois de la scène de pub à celle de menu.

D'ailleurs,

Code : Tout sélectionner

Debug.Log("The ad was successfully shown.");
devrait s'inscrire plusieurs fois en console si c'est le cas lors d'un appel à OnUnityAdsShownComplete ()
"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

Bilu
Messages : 91
Inscription : 20 Nov 2019 09:24

Re: [RESOLU]"GameObject destroy" mais pourtant non

Message par Bilu » 02 Mars 2022 15:35

En effet

Code : Tout sélectionner

Debug.Log("The ad was successfully shown.");
apparait plusieurs fois dans les log de la console. Donc je vais continuer à chercher où se trouve le AdDisplay qui n'est pas détruit au changement de scène.


Merci à toi boubouk50

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6225
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: "GameObject destroy" mais pourtant non

Message par boubouk50 » 02 Mars 2022 15:54

boubouk50 a écrit :
02 Mars 2022 12:53
Tu peux taper AdDisplay dans la barre de recherche de la hiérarchie pour voir toutes les occurrences.
Fais le au runtime, ça fonctionne.
Si tu ne veux que les components, tape t:AdDisplay
"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

Bilu
Messages : 91
Inscription : 20 Nov 2019 09:24

Re: "GameObject destroy" mais pourtant non

Message par Bilu » 02 Mars 2022 16:12

JE viens d'essayer sans même changer de scene et le message

The ad was successfully shown.
UnityEngine.Debug:Log (object)
AdDisplay:OnUnityAdsShowComplete (string,UnityEngine.Advertisements.UnityAdsShowCompletionState) (at Assets/ScriptGameVal/AdDisplay.cs:87)
UnityEngine.EventSystems.EventSystem:Update () (at Library/PackageCache/com.unity.ugui@1.0.0/Runtime/EventSystem/EventSystem.cs:501)

apparait deux fois l'un à la suite de l'autre dans la console. Pourtant dans Hierarchy si je cherche après AdDsiplay, je n'ai qu'un seul resultat; le canvas au quel est attaché le script et qui a comme enfant le panel dont il est question
Et si je veux visionner la pub pour la 3 ième fois, le message "The ad was successfully shown" va apparait trois fois les un à la suites des autres dans la console
Et ainsi de suite (j'ai même mis un int qui s'incrémente quand on passe dans la partieAdvertisements.UnityAdsShowCompletionState et le int s'incrémente effectivement mais je comprend pas pourquoi on passe deux fois de suite (ou trois fois, ou quatre , etc) dans Advertisements.UnityAdsShowCompletionState. Aucun n'objet n'est dédoublé (ou triplé ou quadruplé) dans hierarchy
...

:pasdrole: :(

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6225
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: "GameObject destroy" mais pourtant non

Message par boubouk50 » 02 Mars 2022 17:51

Ok.
Ca pourrait être celui qui appelle la fonction qui est dupliqué dans ce cas, ou une mauvaise gestion d'un abonnement à un Event .

Comment est appelé cette fonction? Par qui? Recherche le coupable dans en remontant ce fil.
"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 « Scripting »