Unity3d Unity ads协同路由主机丢失和NullReferenceException

Unity3d Unity ads协同路由主机丢失和NullReferenceException,unity3d,nullreferenceexception,unityads,Unity3d,Nullreferenceexception,Unityads,我一直很难找出这个错误。该代码适用于我的其他项目,但由于某些原因,它不适用于此项目 这就是错误所在 NullReferenceException:对象引用未设置为对象LevelManager.AdsLoadlevel(System.String名称)(位于Assets/Scripts/LevelManager.cs:21)LevelManager.ScoreLevelLoad()(位于Assets/Scripts/LevelManager.cs:46)UnityEngine.Events.Inv

我一直很难找出这个错误。该代码适用于我的其他项目,但由于某些原因,它不适用于此项目

这就是错误所在

NullReferenceException:对象引用未设置为对象LevelManager.AdsLoadlevel(System.String名称)(位于Assets/Scripts/LevelManager.cs:21)LevelManager.ScoreLevelLoad()(位于Assets/Scripts/LevelManager.cs:46)UnityEngine.Events.InvokableCall.Invoke(System.Object[]args)的实例(at/Users/builduser/buildslave/unity/build/Runtime/Export/UnityEvent.cs:153)UnityEngine.Events.InvokableCallList.Invoke(System.Object[]参数)(at/Users/buildslave/unity/build/Runtime/Export/UnityEvent.cs:634)UnityEngine.Events.UnityEventBase.Invoke(System.Object[]参数)(at/Users/builduser/buildslave/unity/build/Runtime/Export/UnityEvent.cs:769)UnityEngine.Events.UnityEvent.Invoke()(at/Users/builduser/buildslave/unity/buildslave/buildslave/buildslave/unity/Extensions/guisystem/UnityEngine.UI/UI/Core/Button.cs:35)UnityEngine.UI.Button.OnPointerClick(UnityEngine.EventSystems.PointerEventData事件数据)(位于/Users/builduser/buildslave/unity/build/Extensions/guisystem/UnityEngine.UI/Core/Button.cs:44)UnityEngine.EventSystems.ExecuteEvents.Execute(IPointerClickHandler,UnityEngine.EventSystems.BaseEventData事件数据)(位于/Users/builduser/buildslave/unity/build/Extensions/guisystem/UnityEngine.UI/EventSystem/ExecuteEvents.cs:52)UnityEngine.EventSystems.ExecuteEvents.executeHandler[IPInterclickHandler](UnityEngine.GameObject目标,UnityEngine.EventSystems.BaseEventData事件数据,UnityEngine.EventSystems.EventFunction`1 function)(位于/Users/builduser/buildslave/unity/build/Extensions/guisystem/UnityEngine.UI/EventSystem/ExecuteEvents.cs:269)UnityEngine.EventSystems.EventSystem:Update()

这是LevelManager类中的代码

using UnityEngine;
using System.Collections;
using UnityEngine.SceneManagement;


public class LevelManager : MonoBehaviour {

private AdsManager ads;



// Use this for initialization
void Start () {
    ads = GameObject.FindObjectOfType<AdsManager> ();

}

//LEVELMANAGEMENT

public void AdsLoadlevel(string name){
    ads.ShowRewardedAd ();
    SceneManager.LoadScene(name);   
}

public void LoadLevel(string name){
    SceneManager.LoadScene(name); 
}




//For death
private void LoadLevelDeath(){
    SceneManager.LoadScene ("LoseScreen");
}

public void DeathLevel(){
    Invoke ("LoadLevelDeath", 2.5f);
}



//Score level management
public void ScoreLevelLoad(){
    if (Score.score < 200) {
        AdsLoadlevel ("Level1");
    } 

    if (Score.score >= 200 && Score.score < 400) {
        AdsLoadlevel ("Level2");
    }

    if (Score.score >= 400 && Score.score < 600) {
        AdsLoadlevel ("Level3");
    }

    if (Score.score >= 600 && Score.score < 800) {
        AdsLoadlevel ("Level4");
    }

    if (Score.score >= 800 && Score.score < 1000) {
        AdsLoadlevel ("Level5");
    }


}
}
using UnityEngine;
using System.Collections;
using UnityEngine.Advertisements;

public class AdsManager : MonoBehaviour {


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


public void ShowRewardedAd()
{
    if (Advertisement.IsReady("rewardedVideo"))
    {
        var options = new ShowOptions { resultCallback = HandleShowResult };
        Advertisement.Show("rewardedVideo", options);
    }
}

private void HandleShowResult(ShowResult result)
{
    switch (result)
    {
    case ShowResult.Finished:
        Debug.Log("The ad was successfully shown.");


        //
        // YOUR CODE TO REWARD THE GAMER
        // Give coins etc.



        break;
    case ShowResult.Skipped:
        Debug.Log("The ad was skipped before reaching the end.");
        break;
    case ShowResult.Failed:
        Debug.LogError("The ad failed to be shown.");
           break;
       }
   }
}

当我按下按钮调用ScoreLevelLoad函数时,会出现错误,它突出显示的行是“ads.ShowRewardedAd()”。此外,有时会弹出一条警告,说我缺少引用,当我单击时,它会显示“Unity ads Corroutine host”。我已经为此苦苦挣扎了几天,似乎还没弄明白。

我弄明白了,虽然我不完全明白为什么,我认为这与全局变量或其他什么有关,但基本上我所需要做的就是将Start函数中的内容移到AdsLoadlevel函数中,使其看起来像

public void AdsLoadlevel(string name){
    ads = GameObject.FindObjectOfType<AdsManager> ();
    ads.ShowRewardedAd ();
    SceneManager.LoadScene(name);   
}
public void AdsLoadlevel(字符串名称){
ads=GameObject.FindObjectOfType();
ads.ShowRewardedAd();
SceneManager.LoadScene(名称);
}

如果有人对此有更详细的原因,请发表评论!

我会检查
ads=GameObject.FindObjectOfType();
是否成功,并且在函数中使用该对象之前可能会进行空检查。此错误发生在哪一行代码上?错误发生在“ads.ShowRewardedAd()”这一行你写了
AdManager
代码了吗?如果是的话,把代码贴出来。这个类来自哪里?是的,对我来说已经足够了。在
ads=GameObject.FindObjectOfType();
之后,如果(ads==null){Debug.Log(“null”);}或者{Debug.Log(“notnull”);}返回;然后告诉我输出。我只能假设“GameObject.FindObjectOfType();”在Start()函数运行时(即创建脚本的所有者时),根本找不到任何AdsManager类型的游戏对象。因此,基本上:创建LevelManager时,AdsManager尚未创建。