在Unity3D中获取C#对象引用

在Unity3D中获取C#对象引用,c#,object,unity3d,inventory,C#,Object,Unity3d,Inventory,我想通过单击C#object来获得统一的C#object。我做了雷,它工作正常。问题在于复制对象。我在做一些类似于库存系统的东西。我所有可收藏的物品都有物品脚本,带有名称或ID等变量。为了从我正在使用的gameobject中获取C#对象脚本 itemList.Add (hitInfo.transform.gameObject.GetComponent<Item> ()); // adding C# object to C# List itemList.Add(hitInfo.tra

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

itemList.Add (hitInfo.transform.gameObject.GetComponent<Item> ()); // adding C# object to C# List
itemList.Add(hitInfo.transform.gameObject.GetComponent());//将C#对象添加到C#列表
然后我销毁了gameobject(可能这是个问题),但当我尝试打印类似itemList[0]的内容时,命名失败,因为:“NullReferenceException:对象引用未设置为对象的实例” 这是因为物体被破坏造成的?或者我应该以其他方式复制对象的引用(不使用
itemList.Add(hitInfo.transform.gameObject.GetComponent())

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

据我理解,您发布的代码是从您单击的对象中获取“项”组件。组件实例必须具有与其关联的单个对象。因此,当您删除该对象时,您也在删除该对象上的“项”组件

您真正应该做的是将该项的数据模型类作为组件上的字段。该类将包含库存所需的任何数据(名称)。因此,您将添加数据模型,而不是将项目组件添加到列表中。删除游戏对象时,对该模型类的引用将保持不变

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

public class ItemModel
{
    public string Name;
    public int Id;
}
这样做:

gameObject.GetComponent<Item>().Model
gameObject.GetComponent().Model

据我所知,您发布的代码是从您单击的对象获取“项”组件。组件实例必须有一个与其关联的对象。因此,当您删除该对象时,您也在删除该对象上的“项”组件

您真正应该做的是为该项目创建一个数据模型类,作为组件上的一个字段。该类将包含库存所需的任何数据(名称)。因此,您将添加数据模型,而不是将项目组件添加到列表中。删除游戏对象时,对该模型类的引用将保持不变

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

public class ItemModel
{
    public string Name;
    public int Id;
}
这样做:

gameObject.GetComponent<Item>().Model
gameObject.GetComponent().Model

是的,从我所能看出的问题是,在将对象添加到列表后,您正在销毁该对象

我假设,你想要的是玩家从世界上“拾起”一个物体并将其添加到一个目录中

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


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

是的,从我所知道的情况来看,问题是因为您在将对象添加到列表后正在销毁该对象

我假设,你想要的是玩家从世界上“拾起”一个物体并将其添加到一个目录中

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


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

一种可能的解决方案是,您可以使用
hitInfo.transform.gameObject.SetActive(False)
。当您需要游戏中的对象时,您可以在所需位置重新激活它,或者仅从
项目
脚本中检索所需信息,如名称、成员变量(StrengthhofAttack、healingPoints)或者精灵纹理或模型或其他任何东西。

一种可能的解决方案是,不破坏对象,您可以使用
hitInfo.transform.gameObject.SetActive(False)
。当您需要游戏中的对象时,您可以在所需位置重新激活它,或者仅从
项目
脚本中检索所需信息,如名称、成员变量(StrengthhofAttack、healingPoints)或者sprite纹理或模型或任何东西。

您能提供更多的代码,在哪里定义列表,以及导致
NullReferenceException
的调用在哪里?您能提供更多的代码,在哪里定义列表,以及导致
NullReferenceException
的调用在哪里?您的解决方案似乎可以工作,但在cl中ass:使用UnityEngine;使用System.Collections;公共类项:MonoBehavior{[System.Serializable]公共项模型;}我有一个错误:属性
System.SerializableAttribute'在此声明类型上无效。它在
class、struct、enum、delegate'声明上有效。只有我知道我做错了什么,但我不知道是什么。我有单独的脚本中的ItemModel和Item。好的,我删除了[System.Serializable],这很好,谢谢:)您的解决方案似乎有效,但在类中:使用UnityEngine;使用System.Collections;公共类项:MonoBehavior{[System.Serializable]public ItemModel;}我有一个错误:属性
System.SerializableAttribute'在此声明类型上无效。它在
class、struct、enum、delegate'声明上有效。只有我知道我做错了什么,但我不知道是什么。我有单独的脚本中的ItemModel和Item。好的,我删除了[System.Serializable],这很好,谢谢:)非常感谢。我试着做一些类似hitInfo.transform.gameObject.enabled的事情,但它不起作用,您的解决方案也起作用。当我从库存中删除项目时,如果删除对象将导致错误,我将使用这种方式。再次感谢:)很高兴我能帮上忙:)谢谢。我试图做一些类似hitInfo.transform.gameObject.enabled的事情,但没有成功