当前位置: 首页 > 知识库问答 >
问题:

为什么我的非静态GameObject在场景重新加载后失去了脚本中的引用?

蔚俊人
2023-03-14

我的Canvas上有一个空的GameObject用于显示广告菜单,我通过检查器将其附加到一个单独的脚本(不在菜单本身上)中的公共变量中。

我正在使用adMenu在脚本中将其设置为非活动状态。SetActive(false),它在我的游戏的第一次玩透时起作用。但是,当我通过场景中的一个按钮重新启动场景时,菜单将失去对检查器中相同游戏对象的引用,我收到以下错误:

MissingReferenceException: The object of type 'GameObject' has been destroyed but you are still trying to access it.

这种情况从未发生在我身上,其他游戏对象在场景重新加载后以类似的方式初始化。

其他详细信息:

  • 游戏对象。Find()可以使用同一脚本中的名称检索游戏对象
  • DontDestroyOnLoad()不会在脚本或其附加的游戏对象上的任何位置使用

代码:

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

public class AdManager : MonoBehaviour, IUnityAdsListener
{
    internal static AdManager instance;
    private static bool isInitialized = false;

    public GameObject adMenu;
    private string placement = "rewardedVideo";

    void Start()
    {
        instance = this;
        if (!isInitialized)
        {
            isInitialized = true;
            Advertisement.AddListener(this);
            Advertisement.Initialize(Constants.appleGameId, true);
        }
    }

    IEnumerator<float> ShowAd()
    {
        if (!Advertisement.IsReady())
        {
            yield return Timing.WaitForOneFrame;
        }
        Advertisement.Show(placement);
    }

    public void CloseAdMenu()
    {
        Debug.Log("Is adMenu null: " + (adMenu == null));  // Returns false on first playthrough only
        adMenu.SetActive(false);
    }


    public void OnUnityAdsDidFinish(string placementId, ShowResult showResult)
    {
        if (showResult == ShowResult.Finished)
        {
            CloseAdMenu();
        }
    }

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

    public void OnUnityAdsDidError(string message)
    {
        // throw new System.NotImplementedException();
    }

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

共有2个答案

郁吉星
2023-03-14

在您的重启方法上,您应该使用adMenu重新激活按钮。SetActive(true),如果没有,当您再次调用场景时,adMenuGameObject被禁用,因此您无法访问GameObject

也许您可以在AdManager中添加一个方法,如:

public void OpenAdMenu()
{
    adMenu.SetActive(true);
}

并在AdManager上调用它。start()

匡玉堂
2023-03-14

发生的事情与菜单对象或静态实例无关。

问题是回调

public void OnUnityAdsDidFinish(string placementId, ShowResult showResult)

由于您通过注册实例

Advertisement.AddListener(this);

但是,在场景更改后,此实例将成为Destroyer。

如示例所示,您应该执行以下操作

private void OnDestroy() 
{
    Advertisement.RemoveListener(this);
}
 类似资料:
  • 问题内容: 我有2个fxml文件: 布局(标题,菜单栏和内容) Anchorpane(应该放在另一个fxml文件的内容中) 我想知道如何从“主”场景将第二个文件加载到内容空间内。在javaFX中工作是一件好事,还是加载一个新场景更好? 我正在尝试做这样的事情,但是不起作用: 谢谢您的帮助。 问题答案: 为什么您的代码不起作用 加载程序会创建一个新的AnchorPane,但是您绝不会将新窗格添加到场

  • null 我正试着做这样的事情,但它不起作用: 谢谢你的帮助。

  • 我有一个非常简单的类,我想用它作为另一个类的子类。但当我将其代码放入父类时,我得到: 非静态变量,不能从静态上下文中引用 另一方面,当我将子类GenTest的类代码放在“父类”的类代码之外时,我没有得到这个错误。 为什么会发生这种情况?

  • 我在第一个场景上有一个简单的按钮,应该会导致第二个场景。当我点击按钮时,它改变场景,但只显示一个空白屏幕。如果我关闭原始舞台,然后显示一个包含新场景的新舞台,它会正常工作,但我不想打开一个新窗口。 这是我的控制器类: 主类:

  • 问题内容: java为什么无法从静态环境引用非静态? 问题答案: 要了解原因,你必须了解两者之间的区别。 实例(非静态)方法适用于特定类型(类)的对象。这些是使用新的创建的,如下所示: 要调用实例方法,请在实例(myObject)上调用它: 但是,只能直接在类型上调用静态方法/字段,如下所示: 前一条语句不正确。也可以使用诸如此类的对象引用来引用静态字段, myObject.staticMetho

  • 我想知道为什么C中的函数重载解析在调用静态方法时会考虑非静态成员函数。 我已经阅读了这里的文档,其中指出 如果任何候选函数是成员函数(静态或非静态),但不是构造函数,则将其视为具有额外参数(隐式对象参数),该参数表示调用它们的对象并出现在第一个之前实际参数。 因此,请考虑以下代码。 那么调用A::foo(1.f,1.f)是不明确的。 静态成员函数用于非静态函数调用的重载解析,这很有意义。 但是为什