目标
1. 一个实现了基础角色控制的版本,包括角色的移动、潜行、跳跃,翻滚等功能。
2. 定义角色相关的API接口给其他模块使用。比如当前角色的状态,状态切换的回调等。
3. 定义角色相关属性配置的SO,让策划可以编辑一些游戏中不会改变的角色的属性。
实现
效果
用了大概一天的时间基于nodeCanvas插件的FSM完成了一个角色控制框架的搭建,并向其他模块提供API接口。具体效果如下:

由于是第一版,本着快速交付的原则,只实现了一些基础的动作,动作也会比较糙,手感也会比较生硬,后续会继续完善。
角色控制的FSM
由于组里小伙伴提供了正版的nodeCanvas插件,其中有FSM的模块,所以作者就直接使用它来实现角色控制。硬说理由的话单纯是想学习使用下这个插件,之前一直是用自己实现的一个简单状态机,也想看下商业插件是如何实现的。
由于本身的FSM框架NodeCanvas已经搭好了,所以作者只需要按照框架来派生两种类,
1. 角色状态类:继承至NodeCanvas的FSMState类,实现角色的各种状态,比如移动、潜行、跳跃、翻滚等。
具体的代码结构如下:

状态类主要重载:
- OnInit: 初始化状态时调用
- OnEnter: 进入状态时调用
- OnUpdate: 更新状态时调用,更新频率是每帧。好像没提供fixupdate,需要的话可能要自己找个地方实现一个。
- OnExit:退出状态时调用
2. 切换条件类:继承至NodeCanvas的ConditionTask类,实现角色状态切换的条件,比如按下某个按键,检测碰到地面等。
具体的代码结构如下:

条件类主要重载:
- OnCheck: 检查条件是否满足时调用
- info: 显示在连接线上的提示信息,用来描述这个条件的作用。
在这两个类里想要有序列化的字段的话,跟mono脚本一样写就行,它会自动显示在State的Inspector面板上。如果要字段能引用Blackboard上的数据(就是这个图的全局变量),就需要用BBParameter<T>这个泛型类来声明。
CharacterAPI类
刚才我们在定义角色状态类和切换条件基类的时候,都往里面加个一个CharacterAPI类。这个类的作用有两个:
1. 提供角色状态类和切换条件类的一些公共属性和方法,还有就是一些挂载在角色身上的组件,比如动画组件、角色控制器组件等,这样就不必每个状态类/条件类初始化时都再去GetComponent一遍。
2. 提供一些角色控制的API接口给其他模块使用,比如角色的状态切换回调,角色状态值,血量什么的。
具体的代码结构如下:

角色基础属性配置
比如一些基础的跳跃高度,跑步速度现在是分散到各个状态类里,这样不太方便策划编辑,所以为了让策划可以方便修改,作者设计了一个角色基础属性配置SO,让策划可以在统一的地方编辑一些游戏中不会改变的角色的属性。 具体代码就是一个简单的SO的单例。
