在Unity3D中获取C#对象引用
我想通过单击C#object来获得统一的C#object。我做了雷,它工作正常。问题在于复制对象。我在做一些类似于库存系统的东西。我所有可收藏的物品都有物品脚本,带有名称或ID等变量。为了从我正在使用的gameobject中获取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
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
是的,从我所能看出的问题是,在将对象添加到列表后,您正在销毁该对象
我假设,你想要的是玩家从世界上“拾起”一个物体并将其添加到一个目录中
有许多不同的方法来实现这一点,最佳的解决方案将取决于您如何需要您的库存工作
实现库存的一个简单方法是使用字典
实现库存的一个简单方法是使用字典
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的事情,但没有成功