使用Unity的dotween库:http://dotween.demigiant.com/documentation.php
在C#上生锈......
例如,有没有办法将内联函数指定为.OnComplete的参数,这样我们就不必在单独的函数中删除一系列操作?
即我想在ObjC中使用称为块的功能,但在C#中。
啰嗦一种不直观的方式:
void myCallback () {
// do more stuff here
}
void mysequence() {
transform.DOMoveX(4, 1).OnComplete(myCallback);
}
我想做的事情更容易阅读并保持原样:
void mysequence() {
transform.DOMoveX(4, 1).OnComplete({
// do more stuff here
});
}
答案 0 :(得分:6)
C#的做法是使用lambdas:
void mysequence() {
transform.DOMoveX(4, 1).OnComplete(() => {
// do more stuff here
});
}
从您链接到的文档:
// Callback without parameters
transform.DOMoveX(4, 1).OnComplete(myCallback);
// Callback with parameters
transform.DOMoveX(4, 1).OnComplete(()=>myCallback(someParam, someOtherParam));
答案 1 :(得分:5)
您正在寻找C#statement lambdas。
void mysequence() {
transform.DOMoveX(4, 1).OnComplete(() => {
// do more stuff here
});
}
答案 2 :(得分:4)
使用匿名lambda函数:
void mysequence() {
transform.DOMoveX(4, 1).OnComplete(() => {/*code goes here*/});
}
() => {};
是一个匿名函数,不带任何参数,也不返回任何内容。
a => a
是一个匿名函数,它接受一个参数并返回它。
c#中的匿名函数可以是闭包,即函数可以修改在它们外部声明的变量。
var a = 0;
var f = () => a++;
f();
f();
// a is now 2
答案 3 :(得分:3)
更一般地说,除了已经给出的答案之外,C#/ .NET还包含与函数指针类似的委托的概念。您可以通过定义方法的签名来定义自己的委托类型,如下所示:
delegate ReturnType MethodPointer(ParamTypeA paramA, ParamTypeB paramB);
然后你可以将方法指定为函数指针,如下所示:
private ReturnType SomeMethod(ParamTypeA paramA, ParamTypeB paramB)
{
...
}
MethodPointer = SomeMethod;
或将其作为回调传递给另一个函数/方法:
private void OnComplete(MethodPointer callback)
{
...
}
OnComplete(SomeMethod);
由于以这种方式声明委托可能非常耗时并且使代码更加混乱,因此他们提出了通用委托类型:Action<...>
(对于void方法)和Func<...>
(对于具有返回类型的方法) )。现在你可以简单地说:
Func<ParamTypeA, ParamTypeB, ReturnType> func = SomeMethod;
无需显式定义自定义MethodPointer-delegate。
Lambda表达式,如其他帖子中所述,通过让您定义类似内联的函数,使得更容易实例化委托,以便您可以直接在OnComplete()调用中定义SomeMethod()的实现,例如:
private void OnComplete(Action<ParameterType> callback)
{
}
OnComplete(parameter =>
{
// implementation goes here...
});
使用lambda的另一个好处是实现可以访问本地变量。