2016-04-19 30 views
1

我不知道这样做的正确的术语添加到方法链,但我有一个简单的C#代码段,其补间像这样的一些对象:如何通过检查报表

camera.gameObject.transform.DOMove(target,3.0f) 
.SetEase(Ease.InOutQuad) 
.OnComplete(animation.FadeIn); 

但我需要做的是添加另一种方法来这个链条根据一定的条件是这样的:

camera.gameObject.transform.DOMove(target,3.0f)      
.SetEase(Ease.InOutQuad)    

    //the general idea 
    if(visible == true){ 
    .OnStart(animation.FadeOut); 
    }   

.OnComplete(animation.FadeIn); 

显然,这是一个语法错误,但我不知道正确的方式来处理这样的事情的语法。

我该如何处理它?

回答

1

你会需要把整个块在if - else声明,你不能把它分解:

if(visible == true){ 
    camera.gameObject.transform.DOMove(target,3.0f)     
.SetEase(Ease.InOutQuad) .OnStart(animation.FadeOut).OnComplete(animation.FadeIn); 
    }  
else { 
    camera.gameObject.transform.DOMove(target,3.0f)     
.SetEase(Ease.InOutQuad).OnComplete(animation.FadeIn);  
} 

Alertnatively:

var intermediateObject = camera.gameObject.transform.DOMove(target,3.0f)     
    .SetEase(Ease.InOutQuad); 

if (visible) { 
    intermediateObject.OnStart(animation.FadeOut).OnComplete(animation.FadeIn);; 
} 
else { 
    intermediateObject.OnComplete(animation.FadeIn);; 
} 

var关键字意味着你不需要担心自己的对象类型,但是再一次,它的使用阻碍了可读性(在我看来)。

+0

是的,我可以看到,这将导致混乱,因为我添加更多的东西。如果我转换为对象 - 我需要将其转换回来吗?我怎么知道什么类型将其转换回。 – WDUK

+0

@WDUK:您需要查看对象返回的内容。我会尽快更新我的答案。 – npinti

+0

啊,似乎我不需要将它转换回原来的类型,这非常方便!谢谢 - 这工作完美。 – WDUK

1

如果你想保持在一个链的一切,你可以尝试使用If扩展:

internal static T If<T> (this T source, bool isTrue, Action<T> thenAction) { 
    if (isTrue) { 
     thenAction(source); 
    } 
    return source; 
} 

这个扩展将工作,如果OnStart回报率相同camera对象。否则,应该更改If扩展名。

那么你的代码应该是这样的:

camera.gameObject.transform.DOMove(target,3.0f). 
    SetEase(Ease.InOutQuad) 
    If(visible == true, value => value.OnStart(animation.FadeOut)). 
    OnComplete(animation.FadeIn) 

如果OnStart实际上返回不同的object

internal static T If<T> (this T source, bool isTrue, Func<T, T> thenFunction) => 
    isTrue ? thenFunction(source) : source; 
+1

这是一个很好的答案,但是你的'If'的签名是错误的。 'Action thenAction'参数应该是'Func thenAction'。 – Enigmativity

+0

@Enigmativity取决于。如果它是同一个“对象”,那么你实际上不需要返回它。这就是我写评论的原因:“如果OnStart返回相同的相机对象,则此扩展将起作用。”如果'OnStart'实际上返回不同的'object',那么整个定义应该改为'' –

+0

你应该始终假设构建器返回一个新的引用。返回'this'的构建者是一种懒惰的编程习惯。除非还有“其他”选项,否则这些类型不能是“”。 – Enigmativity