我目前正在学习游戏开发,在我们的一个项目中,我们必须创建一个有限状态机,它将作为一个简单的人工智能。它一直被鼓励用SOLID原则来编写代码,但在这个项目中,我想不出一种方法来做到这一点。虽然它不是这个项目所必需的,但我仍然想找到一种方法来做到这一点。它是用Unity C#编写的。
public interface IState
{
public IState CheckForState();
}
public class Walk : IState
{
float speed = 10;
public IState CheckForState()
{
if (speed > 5)
{
return Run;
}
return this;
}
}
要使它成为固体,你必须找到一种方法来删除'运行'从函数的原因,如果'运行'脚本被删除的函数将不再工作,但它应该仍然能够得到它,如果可用。
1条答案
按热度按时间kq4fsx7k1#
有一对夫妇的解决方案,浮现在脑海中,将允许一个完全坚实的解决方案。
溶液1
满足依赖反转原则的第一个也是最简单的方法是将
Run
类注入到Walk
类中,如下所示:这个解决方案使得
Walk
不再依赖于Run的具体实现,但仍然允许它转换到运行状态。然而,这确实要求Walk
知道它可以转换到哪个状态(我认为这是一个合理的期望)。溶液2
您可以通过将状态转换表示为对象来进一步分离这一点。
然后可以创建一个Walk示例,如下所示:
这要求可以在
IStateTransition
中使用state对象中的值来检查是否需要发生状态转换。我在示例中使用了int
作为Value
属性的类型,但您可以轻松地将其切换为泛型类型。这种解决方案完全分离了每个状态,并将状态转换捕获为可重用组件。由于代码现在被分割到更多的类和接口,因此在某些方面更加复杂,但它也完全融入了SOLID原则。