UnityAds. Reklama usuwa przypisany obiekt do zmiennej.

Ogólne pytania na temat Unity3D

UnityAds. Reklama usuwa przypisany obiekt do zmiennej.

Postprzez TreektusPL » 06 Lut 2020, 19:37

Witam.
Podczas podpinania UnityAds do mojej gry napotkałem się na dość dziwny problem.
Gdy wyświetlę testową reklamę z nagrodą oraz nacisnę przycisk "Close" to zmienna typu GameObject wraz z przypisanym obiektem wskazuje wartość null. Dzieje się tak tylko w przypadku gdy z przykładowej sceny "Level" przejdę na scenę "Menu" i ponownie włączę scenę "Level".
Do testów stworzyłem całkiem nowy projekt zawierający tylko dwa skrypty, by upewnić się, że winę nie ponosi żaden inny skrypt:
Skrypt odpowiadający za działanie reklamy:
Kod: Zaznacz wszystko
using System.Collections;
using System.Collections.Generic;
using UnityEngine.Advertisements;
using UnityEngine.SceneManagement;
using UnityEngine;

public class AdSystem : MonoBehaviour, IUnityAdsListener
{
    string gameID = "1234567"; //<--W skrypcie ustawiony jest prawidłowy, ale nwm czy można go publicznie udostępniać.
    string rewardPlacementID = "rewardedVideo";
    bool testMode = true;

    Core core;

    private void Start()
    {
        core = GetComponent<Core>();
        if (!Advertisement.isInitialized)
        {
            Debug.Log("Initialized");
            Advertisement.Initialize(gameID, testMode);
            Advertisement.AddListener(this);
        }
    }

    public void ShowAdWithReward() {
        if (Advertisement.IsReady(rewardPlacementID))
        {
            Advertisement.Show(rewardPlacementID);
        }
    }

    public void OnUnityAdsDidFinish(string placementId, ShowResult showResult)
    {
        if (showResult == ShowResult.Finished)
        {
            if (placementId == rewardPlacementID) {
                Debug.Log("FINISHED");
                core.SkipLevel();
            }
        }
    }

    public void OnUnityAdsReady(string placementId){}
    public void OnUnityAdsDidError(string message){}
    public void OnUnityAdsDidStart(string placementId) {}
}

Drugi skrypt:
Kod: Zaznacz wszystko
using System.Collections;
using System.Collections.Generic;
using UnityEngine.SceneManagement;
using UnityEngine;

public class Core : MonoBehaviour
{
    public GameObject obj;

    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.P)) {
            Debug.Log(obj.name);
        }
    }

    public void OpenLevelScene() {
        SceneManager.LoadScene("Level");
    }
    public void OpenMainMenuScene() {
        SceneManager.LoadScene("MainMenu");
    }

    public void SkipLevel() {
        Debug.Log("SKIP LEVEL");
        Debug.Log(obj.name);
    }
}


Kod błędu:
Kod: Zaznacz wszystko
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.
UnityEngine.Object.get_name () (at C:/buildslave/unity/build/Runtime/Export/Scripting/UnityEngineObject.bindings.cs:189)
Core.SkipLevel () (at Assets/Core.cs:26)
AdSystem.OnUnityAdsDidFinish (System.String placementId, UnityEngine.Advertisements.ShowResult showResult) (at Assets/AdSystem.cs:39)
UnityEngine.Advertisements.Platform.Platform+<UnityAdsDidFinish>c__AnonStorey5.<>m__0 () (at <9e8b2f7fae864d3e9cbfbe193f1de9de>:0)
UnityEngine.Advertisements.Utilities.CoroutineExecutor.Update () (at <9e8b2f7fae864d3e9cbfbe193f1de9de>:0)


Dodam, że jeśli wcisnę przycisk [P] to prawidłowo wyświetla nazwę przypisanego obiektu.
Jeśli rozwiązanie nie jest oczywiste, mogę również udostępnić projekt.
TreektusPL
 
Posty: 42
Rejestracja: 23 Wrz 2018, 20:16
Has thanked: 0 time
Been thanked: 0 time

Re: UnityAds. Reklama usuwa przypisany obiekt do zmiennej.

Postprzez Hostur » 08 Lut 2020, 22:20

Kod: Zaznacz wszystko
public GameObject obj;

Następnie przechodzisz do innej sceny i tam obj jest nullem? Nie możesz sprawdzić na scenie czy ten obiekt istnieje?

Przede wszystkim wszystkie tego typu funkcjonalności jak reklamy powinny być singletonami ale w zdrowym tego słowa znaczeniu. Do swojego testy dodaj jeszcze jedną scenę. Nazwij ją "Initialization", dodaj tam wszystkie komponenty potrzebne Ci do reklam. Na obiekcie który je trzyma dodaj gdzieś DontDestroyOnLoad(gameObject);. Następnie z tej sceny na starcie gry przejdź do swojej prawdziwej "pierwszej sceny". NIGDY W TRAKCIE DZIAŁANIA APLIKACJI NIE POWRACAJ NA SCENĘ INITIALIZATION. Trzymaj się tej zasady ze wszystkimi singletonami zamiast babrać się z paskudnym kodem singletonowych gameobjectów. Obiekty ze sceny Initialization oznaczone jako NIE do zniszczenia będziesz mieć dostępne na wszystkich innych scenach, tworzysz je raz, nigdy tam nie wracasz więc nie stworzą się ponownie, masz jedną prostą scenę na której dodajesz tego typu logikę niezależną od reszty gry.
Hostur
 
Posty: 750
Rejestracja: 05 Sie 2015, 07:36
Has thanked: 0 time
Been thanked: 0 time


Wróć do Wsparcie Unity

Kto jest na forum

Użytkownicy przeglądający to forum: Brak zarejestrowanych użytkowników oraz 5 gości