c# - 成员 '' 无法在 Singleton Unity 中因实例引用错误而访问
问题描述
我在网站上多次看到这个问题,但是大多数解决方案似乎表明我应该将其设为实例变量而不是静态变量。然而,Singleton 模式的全部意义在于始终引用的这个静态对象。以下是我看过的链接:
最后一个链接使我了解以下内容:
我觉得我确实理解这一点。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.
}
}
如果可能,有人可以向我解释为什么会发生此错误以及可能的解决方案。
解决方案
该静态方法在类中,而不是在实例中。因此,将 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() 时单例已经存在
推荐阅读
- swift - 如何在 SwiftUI 中为 PreviewProvider 绑定字典?
- c++ - std::sort 的分段错误和错误输出
- python - 通过发送 http get 请求从 JSON 响应中获取详细信息
- r - 使用分组条形图时如何在R代码中旋转ggplot2中的x轴
- java - 为什么从 Toolkit 获取屏幕尺寸会产生不同的结果,具体取决于是否存在 JFrame
- php - 在个人网站上显示 maps.googleapis.com JSON 数据(特别是 weekday_text 和 open_now)
- r - 如何使用 R 的 ggplot2 编辑圆环图的标签?
- python - 执行命令 pip install jinja 时出现此错误
- swift - 分段选择器删除了可访问性
- javascript - 输入隐藏的html5验证问题