2016-04-19 26 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