提问人: 提问时间:5/3/2022 最后编辑:DMGregory 更新时间:5/3/2022 访问量:69
如何将对 GameObject.transform.Translate 的调用存储在变量中并调用它?
How to store a call to GameObject.transform.Translate in a variable, and invoke it?
问:
如何创建一个变量来保存对 Gameobject.transform.Translate 的单个调用,如下所示,因为我需要输入很多 if-else 语句?
var Trans =
Gameobject.transform.Translate(screentouch.deltaPosition.x, screentouch.deltaPosition.x, 0);
if(a > 5){
Trans
}else if (a > 8){
Trans
}
这段代码显然是不正确的 - 它生成了一个编译器错误:
var Trans =
Gameobject.transform.Translate(screentouch.deltaPosition.x, screentouch.deltaPosition.x, 0);
error: Cannot assign void to an implicitly - typed variable.
答:
看起来你正在尝试做这样的事情:
System.Action trans = () => {
Gameobject.transform.Translate(
screentouch.deltaPosition.x,
screentouch.deltaPosition.x, // Are you sure you don't want y here?
0
);
};
该表达式定义了一个 lambda 函数,这是一种一次性的现场函数,它不会作为类的成员持久存在。我们存储它的变量是一个类型 - 类似于其他语言中的“函数指针”或“闭包”。它存储对函数(及其对应上下文)的引用,因此以后的代码可以通过引用变量(只需键入)来调用该函数,而无需该代码知道或关心它真正调用的函数。() => { ... }
System.Action
trans
delegate
this
trans()
问题在于,这并不真正适合游戏上下文,因为它会分配堆内存来保存 lambda 函数和委托 - 这在这里是浪费。它会减慢您的代码速度,并在垃圾收集器需要运行以清除垃圾时导致卡顿。一点垃圾并不是世界末日,但我们希望尽可能避免分配每一帧。让我们看看如何避免不必要的分配。
一种方法是使用 flag 变量。
bool shouldMove = false;
if(a > 5){
shouldMove = true;
}else if (a > 8){
shouldMove = true;
}
if (shouldMove) {
Gameobject.transform.Translate(
screentouch.deltaPosition.x,
screentouch.deltaPosition.x, // Still probably a y you want.
0
);
}
或者,根据你的 if 的复杂程度,你甚至可以将它们组合起来,比如:
bool shouldMove = (a > 5) || (a > 8) || ...
...甚至可能是一个开关表达式。
另一种方法是只定义一个帮助程序函数来处理这个问题。
private void Move(GameObject go, Touch touch) {
go.transform.Translate(
screentouch.deltaPosition.x,
screentouch.deltaPosition.x, // Still betting it's y...
0
);
}
然后,每次要移动时,您都可以键入一个更简单的东西:
if(a > 5){
Move(GameObject, screentouch);
}else if (a > 8){
Move(GameObject, screentouch);
}
但总的来说,我想说的是,如果你的代码变得如此重复,以至于你希望将函数存储在变量中以简化它,你可能只是以错误的方式处理这个问题,我们也许能够找到更简洁的方法来构建你的代码以实现相同的目标。在您的问题中包含有关您的用例的更多上下文可以帮助我们找到更优雅的解决方案。
上一个:Blazor 循环、闭包和绑定
评论