我如何销毁游戏对象并将游戏对象存储在变量中

How i can destroy an GameObject but also store the gameobject in a variable

当我在场景中选择一个项目时,它会调用 AddItem() 方法,该方法会将项目添加到列表并从场景中销毁游戏对象,但是当我尝试访问列表出现此错误。

"MissingReferenceException: The object of type 'GameObject' has been destroyed but you are still trying to access it."

public class Inventory : MonoBehaviour
{
    public List<GameObject> itemsGOInInventory = new List<GameObject>();

    public void AddItem(GameObject itemToBeAdded)
    {
        itemsGOInInventory.Add(itemToBeAdded);
        Destroy(itemToBeAdded);
    }

    public void FindItem(string name)
    {
        foreach (GameObject item in itemsGOInInventory)
        {
            if (item.GetComponent<Item>().itemName == "pistol")
            {
                Instantiate(item.GetComponent<Item>().itemObject, this.transform);
            }
        }
    }
}

一旦你摧毁了游戏对象,它就消失了。

您可以做的是保留对该对象的引用,然后将其存储在某处并使其不可见。它称为对象池。

Unity 在这里有一个教程:https://unity3d.com/learn/tutorials/topics/scripting/object-pooling

您需要将游戏对象SetActive设置为false或者使用其他方式使其不可见。 https://docs.unity3d.com/ScriptReference/GameObject.SetActive.html

您已经有了对象列表,所以不要使用 Destroy(),而是使用 SetActive(false);

itemToBeAdded.SetActive(false);

希望这对您有所帮助。

你说你一旦拾取游戏对象就销毁它。一旦销毁,它就不存在了,所有对 GameObject 的引用都是空的。在您的案例中保留游戏对象列表是个坏主意。相反,您应该有一个库存项目的模型 class。

public class InventoryItem
{
    string name;
    string description;
    string spritePath;
    // other variables
}

您应该创建一个单独的 class 来表示场景中的 InventoryItem。你可以在你的游戏对象上有这样的东西:

public class InventoryItemView : MonoBehaviour
{
    public InventoryItem item;
    // ...
}

现在将项目脚本放在场景中的 'items' 上。每当您选择一个项目时,从游戏对象中获取 InventoryItem 脚本并将其添加到 Inventory 中的 InventoryItems 列表中。然后销毁游戏对象。现在,即使您的游戏对象被销毁,您仍然拥有 InventoryItem 对象。

public class Inventory : MonoBehaviour
{
    public List<InventoryItem> itemsGOInInventory = new List<InventoryItem>();

    public void AddItem(GameObject itemToBeAdded)
    {
        itemsGOInInventory.Add(itemToBeAdded.GetComponent<InventoryItemView>().item);
        Destroy(itemToBeAdded);
    }
//...
}

您可能需要检查 GameObject 上是否有 InventoryItemView 脚本。

理想情况下,您的库存 class 不应该是 MonoBehaviour,可序列化 class 就足够了,但这是题外话。