C#返回参考

时间:2015-01-29 22:44:28

标签: c# reference unity3d pass-by-reference

已经提出了类似的问题,但我一直无法找到一个体面的答案来解决我的目标。

我有一个函数可以根据传递的变量取消设置变量。

void DestroyEquippedItem (GameObject itemSlot)
{

            if (itemSlot == itemSlot1) {
                    Destroy (itemSlot1);
                    itemSlot1 = null;
                    itemScript1 = null;
                    return;
            }
            if (itemSlot == itemSlot2) {
                    Destroy (itemSlot1);
                    itemSlot2 = null;
                    itemScript2 = null;
                    return;
            }
}

我有8个项目插槽和一些不同的功能,可以在这些插槽上执行操作。这些功能中的每一个看起来几乎相同,列表为8" if"下来的陈述,以确定我们想要修改哪个项目槽。我想我通过使用另一个函数返回对项目槽的引用来找到更好的方法,例如

GameObject GetSlotFromSlot (GameObject itemSlot)
    {
            if (itemSlot == itemSlot1) 
                    return itemSlot1;
            if (itemSlot == itemSlot2) 
                    return itemSlot2;
    }

然后将我的DestroyEquippedItem函数更改为

void DestroyEquippedItem (GameObject itemSlot)
    {
            Destroy (GetSlotFromSlot (itemSlot));
            GetSlotFromSlot (itemSlot) = null;
            GetScriptFromSlot (itemSlot) = null;
    }

所以我的问题基本归结为"我做错了什么?"

我知道我不能做那样的左撇子作业,但是能够返回对要修改的项目的引用会使这一点变得更容易并且会使代码缩短很多。有没有办法做我以后做的事情?

附录: itemSlot1,itemSlot2,itemScript1,itemScript2等都是清单中的类级变量。上面显示的这些功能也在清单中。

Public Class Inventory : MonoBehaviour
{
    GameObject itemSlot1;
    GameObject itemSlot2;
    EquipItem itemScript1;
    EquipItem itemScript2;
    //etc...

    void DestroyEquippedItem(...)
    {
    ...
    }
}

3 个答案:

答案 0 :(得分:0)

不确定Destroy正在做什么,但您可以使用局部变量来存储Get方法的结果,然后将它们分配为null:

void DestroyEquippedItem (GameObject itemSlot)
{
        var item = GetSlotFromSlot(itemSlot); 
        var script = GetScriptFromSlot(itemSlot); 
        Destroy (GetSlotFromSlot (itemSlot));
        item = null; 
        script = null;
}

答案 1 :(得分:0)

这似乎可以通过一个简单的循环来解决。我假设你有一些itemlot数组? (因为你一个接一个地检查它们。)

foreach (int itemSlot in itemArray)
{
  Destroy (itemSlot);
  itemSlot = null;
  GetScriptFromSlot(itemslot) = null;
}

我也不完全确定你要做什么,但是有更好的方法来做你正在做的事情,而不是列举所有变量。

答案 2 :(得分:0)

您的代码表明您在几个级别上迷失了方向,因此很难确定从哪里开始。

首先,请尝试:

,而不是为游戏对象提供8个变量
private GameObject[] itemSlots = new GameObject[8];

您似乎也对引用的工作方式感到困惑。您可以从方法返回引用,并使用它执行任何操作。只需将引用存储在局部变量中:

GameObject go = GetObjectFromSomeThing();
Destroy(go);

请注意,设置go = null在这里不会为您做很多事情,因为go是对您在其他地方引用的对象的新引用。

但是,您似乎想要做的只是销毁和取消itemSlot列表中的一个对象:

public DestroyEquippedItem(int index) {
    if (this.itemSlots[index] != null) {
        Destroy(this.itemSlots[index]);
        this.itemSlots[index] = null;
    }
}

使用它:

// Destroy itemSlot 2
DestroyEquippedItem(2);