Unity GetComponent通用类型

时间:2014-06-11 10:07:56

标签: c# generics unity3d covariance

在今天帮助朋友的同时,我在Unity中遇到了一个问题。 GetComponent方法是通用的,需要一个Type,直到目前为止,没有任何错误。

我正在使用有限状态机(FSM)匹配状态到某些实体。对于这种情况,我使用泛型。为了这个原因,每个实体都继承自StateMachine。

现在,当我遍历场景中的所有实体时,我想获取它们的Entity脚本并从中获取变量,在这种情况下:IsKillable。

但是,当Unity请求类型时,我想给它类型:“Entity”,但不是“Entity”或“Minion”,因为我需要复制我所拥有的每种类型的功能。

试图解决这个问题,我将继承从Entity移到了StateMachine,所以我可以很容易地做GetComponent()。但是,我如何让StateMachine恢复工作呢?

我在我的Entity类中添加了一个变量,类型为“StateMachine”。但是,在这个简单的例子中,我不能用StateMachine类型填充它。“

为了解决这个问题,我想到了我曾经读过的一些内容:协方差。有了协方差,我可以用StateMachine填充StateMachine,我至少认为我可以。

你不能在类上使用协方差,所以我为它创建了一个接口,如下所示:

 public interface IStateMachine<out T>
 {
 }

在我的Entity类中,我声明了一个变量:

 public IStateMachine<Entity> StateMachine;

但是,现在我需要IStateMachine来完成他的工作作为接口,并强制类StateMachine有一个SwitchState方法,这是我目前的情况。

我正试图给我的IStateMachine方法:

 void SwitchState(State<T> state);

但后来我收到了错误:

 IStateMachine.cs(4,18): error CS1961: The covariant type parameter `T' must be invariantly valid on `IStateMachine<T>.SwitchState(State<T>)'

这就是我迷路的地方。任何帮助都会受到赞赏,从解决错误到不同的解决方案。

0 个答案:

没有答案