繁体   English   中英

C#返回参考

[英]C# Return 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;
    }

因此,我的问题基本上可以归结为“我做错了什么?”

我知道我不能做这样的左手任务,但是能够返回对要修改的项目的引用将使此REMARKABLY更加容易并且大大缩短了代码。 有什么方法可以做我想要的吗?

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

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

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

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

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

这似乎可以通过一个简单的循环来解决。 我假设您有某种itemlot数组? (因为您正在逐一检查它们)。

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

我也不完全确定您要执行的操作,但是有比枚举所有变量更好的方法来执行您的操作。

您的代码表明您在多个层面上迷路了,因此很难确定从哪里开始。

首先,不要为您的GameObjects设置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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM