如何将对 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 函数,类似于 one-off、on-the-spot 函数,它不会作为 class 的成员持续存在。我们存储它的 System.Action
变量 trans
是一个 delegate
类型——类似于其他语言中的“函数指针”或“闭包”。它存储对函数(及其对应的 this
上下文)的引用,因此以后的代码可以通过引用变量(只需键入 trans()
)来调用该函数,而该代码不需要知道或关心什么函数它真的在召唤。
问题是这并不适合游戏上下文,因为它分配堆内存来保存 lambda 函数和委托 - 这在这里很浪费。它会减慢您的代码速度,并可能在垃圾收集器需要 运行 清除垃圾时造成故障。一点垃圾不是世界末日,但我们希望尽可能避免分配每一帧。让我们看看如何避免不必要的分配。
一种方法是使用标志变量。
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
);
}
或者,根据您的 ifs 的复杂程度,您甚至可以像这样组合它们:
bool shouldMove = (a > 5) || (a > 8) || ...
...或者甚至 switch expression.
另一种方法是只定义一个辅助函数来处理这个问题。
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);
}
但总的来说,我想说的是,如果您的代码变得如此重复以至于您希望将函数存储在变量中以简化它,那么您可能只是采用了错误的方式,我们也许能够找到更简洁的方法来构建代码以实现相同的目标。在您的问题中包含有关您的用例的更多上下文可以帮助我们找到更优雅的解决方案。
如何创建一个变量来保存对 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 函数,类似于 one-off、on-the-spot 函数,它不会作为 class 的成员持续存在。我们存储它的 System.Action
变量 trans
是一个 delegate
类型——类似于其他语言中的“函数指针”或“闭包”。它存储对函数(及其对应的 this
上下文)的引用,因此以后的代码可以通过引用变量(只需键入 trans()
)来调用该函数,而该代码不需要知道或关心什么函数它真的在召唤。
问题是这并不适合游戏上下文,因为它分配堆内存来保存 lambda 函数和委托 - 这在这里很浪费。它会减慢您的代码速度,并可能在垃圾收集器需要 运行 清除垃圾时造成故障。一点垃圾不是世界末日,但我们希望尽可能避免分配每一帧。让我们看看如何避免不必要的分配。
一种方法是使用标志变量。
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
);
}
或者,根据您的 ifs 的复杂程度,您甚至可以像这样组合它们:
bool shouldMove = (a > 5) || (a > 8) || ...
...或者甚至 switch expression.
另一种方法是只定义一个辅助函数来处理这个问题。
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);
}
但总的来说,我想说的是,如果您的代码变得如此重复以至于您希望将函数存储在变量中以简化它,那么您可能只是采用了错误的方式,我们也许能够找到更简洁的方法来构建代码以实现相同的目标。在您的问题中包含有关您的用例的更多上下文可以帮助我们找到更优雅的解决方案。