在今天帮助朋友的同时,我在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>)'
这就是我迷路的地方。任何帮助都会受到赞赏,从解决错误到不同的解决方案。