2017-05-16 21 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; 
    }  
} 

しかし、私はこれを短縮することができると信じています。私はこれまでのところ、これを持っている:機能CIで

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; 

} 

は一度押すと次の行を渡したいでしょう:

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

そしてもう一度押すと、それはこれに変更があります。

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

私はevalに出くわしました - しかし、私はそれがjavascriptのためであり、非常にプロセッサ集中的であると信じています。私は文字列として行を解析するのを見てきました。

私は現在、検索と試行で争いに近づいています。誰かが私のためにこれについていくつかの光を当てることができますか?あなたがActionタイプまたはカスタムデリゲートを渡す必要があり

答えて

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

:あなたが探しているものを

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ていると、あなたの答えは偉大でした。しかし、私は誰が最初に入ったのかという答えに基づいていなければなりませんでした。最高の願いとあなたからの声をもう一度聞くこと。 –

関連する問題