在 Unity3D 中获取 C# 对象引用

Getting C# object reference in Unity3D

我想通过单击统一获取 C# 对象。我做了 ray,它工作正常。问题在于复制对象。我正在制作类似库存系统的东西。我所有的可收集物品都有带有名称或 ID 等变量的物品脚本。为了从我使用的游戏对象获取脚本的 C# 对象

itemList.Add (hitInfo.transform.gameObject.GetComponent<Item> ()); // adding C# object to C# List

然后我销毁了游戏对象(也许这是个问题),但是当我尝试打印类似 itemList[0].name 的东西时它不起作用,因为:"NullReferenceException: Object reference not set to an instance of an object" 它是由破坏对象引起的?或者我应该以其他方式复制对象的引用(不使用 itemList.Add (hitInfo.transform.gameObject.GetComponent<Item> ()))?

编辑://即使我不销毁游戏对象也会出现异常。 EDIT2://当我开始游戏并检查 itemList.Count; (它应该显示我认为列表中的元素数量)它是 15 而不是 0 我不知道为什么。

据我了解,您发布的代码是从您单击的对象获取 "Item" 组件。一个组件实例必须有一个与之关联的对象。因此,当您删除该对象时,您也会删除该对象上的 "Item" 组件。

您真正应该做的是为项目创建一个数据模型 class 作为组件上的字段。此 class 将包含任何数据(名称,是您的清单所需的。因此,您无需将项目组件添加到列表中,而是添加数据模型。对该模型的引用 class 将在游戏对象被删除。

public class Item : MonoBehaviour
{
    [System.Serializable]
    public ItemModel Model;
}

public class ItemModel
{
    public string Name;
    public int Id;
}

这样获取:

gameObject.GetComponent<Item>().Model

是的,据我所知,问题是因为您在将对象添加到列表后销毁了它。

我假设,你想要的是玩家 'pick up' 世界中的一个对象并将其添加到库存中。

有许多不同的方法可以实现这一点,最佳解决方案将取决于您需要库存如何运作。

实现库存的一个简单方法是使用字典,其中字符串是项目的名称,int 是持有的数量。

一种可能的解决方案是不销毁对象,而是将其停用 hitInfo.transform.gameObject.SetActive(False) 。当您需要游戏中的对象时,您可以在所需位置重新激活它,或者仅从 Item 脚本中检索所需的信息,例如名称、成员变量(strengthOfAttack、healingPoints)或精灵纹理或模型或随便。