2016年3月4日 星期五

C# delegete


C# delegete

就像是把函式包裝過然後傳給別的函式使用。
有點像是變數的泛型,因為不確定使用時的什麼類型,所以訂一個通用的類型來用。

Unity Delegate

//delegate 定義
//以下是一個參數為string, 回傳值為int的函式
  delegate int Action(string amount);

//宣告成一個物件,以便使用
  Action action;

//接受傳入delegate物件
private void UseAction(int money,Action action)
{
  int n=action(money);
}
//假設有三個同參數同回傳值的函式
//一開始不知道要用哪一個
//就可使用delegate
private int TestA(int num) {}
private int TestB(int num) {}
private int TestC(int num) {}

private void UseA()
{
  //TestA指定給action,傳進UseAction
  //UseAction接受為派類型為參數
  //TestA必須是int為參數,回傳值為int的函式
  action=TestA;
  //action+=TestA;  也可以這樣用
  UseAction(3,action);
}

private void UseB()
{
  //TestA指定給action,傳進UseAction
  action=TestB;
  //action+=TestB;  也可以這樣用
  UseAction(3,action);
}

private void UseC()
{
  //TestA指定給action,傳進UseAction
  action=TestC;
 //action+=TestC;  也可以這樣用
  UseAction(3,action);
}

可以把A的函式委託給B

或是把B的函式委託給A



多重呼叫delegate

delegate一次註冊多個方法,呼叫時所有註冊的都會一起呼叫
using UnityEngine;
using System.Collections;

public class MulticastScript : MonoBehaviour 
{
    delegate void MultiDelegate();
    MultiDelegate myMultiDelegate;
    

    void Start () 
    {
        myMultiDelegate += PowerUp;
        myMultiDelegate += TurnRed;
        
        if(myMultiDelegate != null)
        {
            myMultiDelegate();
        }
    }
    
    void PowerUp()
    {
        print ("Orb is powering up!");
    }
    
    void TurnRed()
    {
        renderer.material.color = Color.red;
    }
}

沒有留言:

張貼留言