2017-05-16 76 views
2

我正在尋找將代碼行傳遞給我在c#中調用的函數,目的是優化我的代碼並嘗試學習新的東西。我熟悉使用字符串,整數,浮點數和布爾值,正如我在代碼中所顯示的那樣。將代碼行作爲參數傳遞到函數中

這個想法是調用一個按鈕單擊的函數來停止腳本並再次啓動腳本。如果沒有這個功能代碼的工作:

public void PlayOnClick() 
{ 
    if(count != 1) 
    { 
     m_animator.GetComponent<Animator>().Play("Scale"); 
     d_animator.GetComponent<Animator>().Play("CloseUp"); 
     ((MovieTexture)MovieOne.GetComponent<Renderer>().material.mainTexture).Play(); 
     Dialyser.GetComponent<RotationByMouseDrag>().enabled = false; 
     count = 1; 
    } 
    else 
    { 
     m_animator.GetComponent<Animator>().Play("Scale"); 
     d_animator.GetComponent<Animator>().Play("ScaleDown"); 
     ((MovieTexture)MovieOne.GetComponent<Renderer>().material.mainTexture).Stop(); 
     Dialyser.GetComponent<RotationByMouseDrag>().enabled = true; 
     count = 0; 
    }  
} 

但是我相信這可以縮短。再次按下時

((MovieTexture)MovieOne.GetComponent<Renderer>().material.mainTexture).Stop(); 

並將其改成這樣::我得到這個至今:按一次當

void Lock(string A, string B, ? C, bool D, int E) 
{ 
    m_animator.GetComponent<Animator>().Play(A); 
    d_animator.GetComponent<Animator>().Play(B); 
    C; 
    Dialyser.GetComponent<RotationByMouseDrag>().enabled = D; 
    count = E; 

} 

在功能CI想要通過以下行

((MovieTexture)MovieOne.GetComponent<Renderer>().material.mainTexture).Play(); 

我遇到過eval--但我相信這只是對於JavaScript而言可能是相當處理器密集型的。我已經考慮將該行解析爲一個字符串。

我目前正在搜索和嘗試的王牌。任何人都可以爲我闡明一些事情嗎?

回答

4

你在找什麼叫代表,或在C++方面的函數指針。

你可以在這裏找到關於delegates的更多信息。

Actions可能會更快地進行編碼。

基本上,你可以傳遞一個你想要執行的方法的引用。方法的簽名應該與方法中聲明的參數類型完全相同。因此,如果您希望傳遞並運行一段不返回任何值的代碼,則可以使用Action類型,而不使用任何類型參數。例如

class A { 
    void printAndExecute(String textToPrint, Action voidMethodToExecute) { 
     Debug.Log(textToPrint); 
     voidMethodToExecute(); 
    } 
} 

class B : MonoBehaviour { 
    void Start() { 
     new A().printAndExecute("SAY", sayHello); 
    } 

    void sayHello() { 
     Debug.Log("Hello!"); 
    } 
} 

希望它可以幫助

+0

謝謝 - 這就是我以後的樣子。非常感激。 –

3

你要通過一個Action型或自定義委託:

void Lock(string A, string B, System.Action C, bool D, int E) 
{ 
    m_animator.GetComponent<Animator>().Play(A); 
    d_animator.GetComponent<Animator>().Play(B); 
    C(); 
    Dialyser.GetComponent<RotationByMouseDrag>().enabled = D; 
    count = E;  
} 

// ... 

Lock("Scale", "CloseUp", ((MovieTexture)MovieOne.GetComponent<Renderer>().material.mainTexture).Play, false, 1) ; 
+0

謝謝你 - 我已經upvoted你和你的答案是偉大的。不過,我必須根據誰先入選答案。最好的祝願和希望再次收到你的來信。 –