首页 > 解决方案 > 成员 '' 无法在 Singleton Unity 中因实例引用错误而访问

问题描述

我在网站上多次看到这个问题,但是大多数解决方案似乎表明我应该将其设为实例变量而不是静态变量。然而,Singleton 模式的全部意义在于始终引用的这个静态对象。以下是我看过的链接:

无法使用实例引用访问成员;用类型名称限定它

无法使用实例引用访问成员“<method>”

最后一个链接使我了解以下内容:

类中的“静态”关键字有什么作用?

我觉得我确实理解这一点。Singleton 的重点是所有类都共享这个实例,所以感觉很完美?我没看到问题?它应该static根据 Singleton 约定和坦率的逻辑。

我很团结,正在尝试为一些同学和我正在尝试制作的游戏制作库存系统。我已经设置了 InventoryUI,但是我想构建一个在游戏中始终存在的静态库存。InventoryUI 将从这个 Singleton 类中提取必要的数据。

换句话说,PlayerInventory 将充当 InventoryUI 的后端。PlayerInventory 将是一个 Singleton 并且 InventoryUI 将从 PlayerInventory 中提取必要的数据

这是我的 Singleton 类的相关代码:

public class PlayerInventory : MonoBehaviour
{
    private static PlayerInventory instance;

    private PlayerInventory() { }

    public static PlayerInventory getInstance()
    {
        if (instance == null)
            return instance = new PlayerInventory();

        return instance;
    }
}

这是我的 InventoryUI 类的相关代码:

public class PlayerInventoryUI : MonoBehaviour
{
    //Inventory Instance
    static PlayerInventory inventory;

    void Start()
    {
        inventory = inventory.getInstance(); 
        //cannot be accessed with an instance reference Error occurs here.
    }
}

如果可能,有人可以向我解释为什么会发生此错误以及可能的解决方案。

标签: c#unity3d

解决方案


该静态方法在类中,而不是在实例中。因此,将 InventoryUI 中的代码更改为:

public class PlayerInventoryUI : MonoBehaviour
{
    //Inventory Instance
    static PlayerInventory inventory;

    void Start()
    {
        inventory = PlayerInventory.getInstance(); 
        //works because static methods are called from the class
    }
}

我经常在 Unity 中使用单例,在 Quora 回答中分享了我的模式:https ://qr.ae/TSqaWt

哦,如果您的 Inventory 不在某个 GameObject Script 组件中,则它不需要从 MonoBehaviour 继承。如果您不需要使用 MonoBehaviour 之类的东西,比如让 Unity 调用 Update ,最好只使用一个普通的 C# 类。

如果您不想将它作为脚本组件,将其显示在检查器等中会很好,那么您不应该自己“新建”它,而是让 Unity 创建它并将实例分配给静态引用发生。在 Awake() 中这样做很好,所以当其他脚本执行 Start() 时单例已经存在


推荐阅读