2012-11-28 86 views
2

我正在使用C#編寫Unity3d遊戲,我們有很多情況需要訪問GameObject的特定成員(如int health)。我們這樣做是使用代碼,如:使用接口作爲通用方法的類型參數

GameObject obj; 
if(obj.GetComponent<Player>() != null) { 
    obj.GetComponent<Player>().health--; 
} 
else if(obj.GetComponent<Robot>() != null) { 
    obj.GetComponent<Robot>().health--; 
} 
// more painful code 

我想要做的是所有這些類實現一個接口一樣IHealth,然後做obj.GetComponent<IHealth>().health--;。這可能嗎?我環顧四周,似乎我不能使用接口作爲類型參數。

+0

工作正常。你試過了嗎? – SLaks

+0

@SLaks否,接口只能有方法或屬性,而不能有字段。 – Servy

+0

您可能需要考慮捕獲您在if塊中使用的結果,以免每個對象類型都調用兩次GetComponent。 –

回答

0

爲什麼不只是有一個組件Health。然後附加到你的遊戲對象,在任何需要健康的腳本上都有RequiresComponent註解,然後通過GetComponent<Health>();(將其緩存在私有變量中的同一對象腳本中)

如果您有多個'stats'總是在一起,你可以使它更容易,就像

public class Status : MonoBehaviour 
{ 
    public float health; 
    public float armor; 
} 

我發現與團結,這是一個驚人的常見的'問題'。不知道這是否是一個問題,因爲這種想法可以真正幫助解決一些問題...

+0

聽起來不錯;我不知道'RequiresComponent'。我將在未來的項目中使用它。 – Peter

0

正如SLaks指出的那樣,接口作爲泛型類型參數是完全可以接受的。如果你的問題是通過接口訪問一個字段,那麼我建議你簡單地將你的字段改爲屬性。如果出於某種原因,您絕對必須保留該字段,只需提供隱含實現接口的包裝屬性。如果問題是,字段和屬性具有完全相同的名稱(包括套管),你可以明確地實現接口:

public interface IHealth { int Health { get; set; } } 

// Change to a property 
public class Ogre : IHealth { public int Health { get; set; } } 

// Casing is different, so interface can be implemented implicitly 
public class Player : IHealth { 
    int health; 
    public int Health { get { return health; } set { health = value; } } 
} 

// Name collision with Pascal casing, so implement explicitly 
public class Robot : IHealth { 
    int Health; 
    int IHealth.Health { get { return Health; } set { Health = value; } } 
} 

// Later 
GameObject obj; 
var o = obj.GetComponent<IHealth>(); 
if (o != null) o.Health--; 
0

我認爲你有一個基本的設計問題,因爲你消耗的代碼需要了解每種類型。如果你正在做同樣的動作不分類型,那麼就使用好醇」多態性

public class Player: IHealth {} 

public class Robot: IHealth {} 

取而代之的是一堆if報表,從GetComponent刪除通用參數,並把它返回一個IHealth對象:

public IHealth GetComponent() 
{ 
    // return IHealth object here 
} 

在調用代碼:

obj.GetComponent().DecreaseHealth(); 
2

原來,這是不容易的,而且可能不是一個好主意,做的。問題是,GetComponent<T>預計類型參數TComponent派生(當然,Unity沒有記錄這一點)。我需要使Robot,Player等都來自一個抽象類,它自身繼承自Component(通過MonoBehaviour),並且包含有關健康和其他字段的信息。我懷疑這是否值得。它可能會導致其他地方的代碼亂七八糟。

相關問題