2016-08-24 59 views
1

我需要知道如何將方法傳遞給類構造函數,以便稍後調用它。這個想法是有一個Bullet類,它有兩個屬性,一個損害整數和一個Method,當這個類型的子彈擊中一個對象時可以調用它。下面的代碼應該解釋好一點:如何將方法保存在稍後要執行的類中

public class Bullet 
{ 
    public Method OnHit; 
    public int Damage; 
    public Bullet(int Damage,Method OnHit) 
    { 
     this.Damage = Damage; 
     this.OnHit = OnHit; 
    } 
} 

這讓我可以作出這樣通過運行這樣Bullet.OnHit(HitGameObject)瓶坯在撞擊不同的任務子彈。

回答

3

您可以使用Action將函數傳遞給函數,然後將其存儲在另一個Action中。存儲的功能可以使用Action.Invoke()調用。

public class Bullet 
{ 
    public int Damage; 
    System.Action savedFunc; 

    public Bullet(int Damage, System.Action OnHit) 
    { 
     if (OnHit == null) 
     { 
      throw new ArgumentNullException("OnHit"); 
     } 

     this.Damage = Damage; 
     savedFunc = OnHit; 
    } 

    //Somewhere in your Bullet script when bullet damage == Damage 
    void yourLogicalCode() 
    { 
     int someBulletDamage = 30; 
     if (someBulletDamage == Damage) 
     { 
      //Call the function 
      savedFunc.Invoke(); 
     } 
    } 
} 

使用

void Start() 
{ 
    Bullet bullet = new Bullet(30, myCallBackMethod); 
} 

void myCallBackMethod() 
{ 

} 
+1

只是一個補充。 OP還可以使用系統「代表」和「事件」 – Cabrra

+1

@Cabrra是的,OP可以使用原始的'delegates'和'events'。只是OP想要將函數傳遞給一個函數,然後再調用它。** NOT **稍後調用一個事件。我認爲'System.Action'或'Func'對於這個或者更少的代碼來說更適合。 – Programmer

+1

優秀解釋(也upvoted) – Cabrra

0

你需要在c#中調用委託, 首先你應該定義方法的輸入/輸出,然後你就像變量一樣處理這種類型的方法。

public class Bullet 
{ 
public delegate void OnHit(bool something); 
public OnHit onHitMethod; 
public int Damage; 
public Bullet(int Damage, OnHit OnHit) 
{ 
    this.Damage = Damage; 
    this.onHitMethod = OnHit; 
} 
} 
在這一行 public delegate void OnHit(bool something);剛剛定義在這一行 public OnHit onHitMethod;所定義的方法,就像一個變量代表的類型和

相關問題