在 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)或精灵纹理或模型或随便。
我想通过单击统一获取 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' 世界中的一个对象并将其添加到库存中。
有许多不同的方法可以实现这一点,最佳解决方案将取决于您需要库存如何运作。
实现库存的一个简单方法是使用字典
一种可能的解决方案是不销毁对象,而是将其停用
hitInfo.transform.gameObject.SetActive(False)
。当您需要游戏中的对象时,您可以在所需位置重新激活它,或者仅从 Item
脚本中检索所需的信息,例如名称、成员变量(strengthOfAttack、healingPoints)或精灵纹理或模型或随便。