PlayMaker是我很喜欢的Unity3d开发插件,事实上游戏开发本身就是一个对[状态]的控制,FSM Editor的可视化编辑器完美的实现了这一点。
但是PlayMaker对于深度开发者而言是不友善的, 因为它没有使用接口来规范类型定义,所有的类都必须继承于PlayMakerFSM类。而PlaymakerFSM是MonoBehaviour的子类。换言之,假如我需要一个 NetworkBehaviour同时又要在上面实现FSM,在PlayMaker作者提供的框架上是不可能的。
我的需求:
1. 所有的自定义类型,包括继承于MonoBehaviour, UIBehavior, NetworkBehaviour的类都需要能成为一个FSM载体。并且能够在FSM Editor中编辑。
2. 摒弃PlayMakerFSM自带的基于Unity4时代的网络功能相关的代码
我的解决方案:
1.反编译PlayMakerFSM/ PlayMakerEditor这两个dll
2 用IFSM_Behaviour接口导出 FSM的关键变量和方法。如Fsm对象的引用,SendEvent()方法
3.修改 #1中反编译之后的代码,对所有引用到 PlayMakerFSM类的地方进行解耦合,这里总共改了大约300多处
结果:
相当令人满意,现在我可以使用任何自定义的类型成为一个搭载FSM的载体,例如:
定义一个 UIFSM:
public class UIFSM : UIBehaviour, IFSM_Behavior
{
//实现IFSM_Behaviour接口
}
同时这个UIFSM可以在PlayMakerFSM Editor 中像任何一个 FSM那样编辑。