2012-11-28 61 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),并且包含有关健康和其他字段的信息。我怀疑这是否值得。它可能会导致其他地方的代码乱七八糟。

相关问题