[英]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.