前言
在unity中用C#实现3d游戏的动作系统操作框架,包含移动,冲刺,跳跃,待机等。
主要的思路就是状态机,通过按键输入,使角色模型进入对应状态,在相对应的状态中,进行位移、交互、动画等等行动,通过这种逻辑实现动作系统。
比如wasd键就进入移动状态,在这个状态中,就是按方向进行移动,持续的按按键,就持续的保持这个状态。在这个状态中,按空格就切换到跳跃状态跳跃一次。
在每个状态机执行的过程中,只有允许切换的时间点按下转换到其他状态的按键才会切换。
好处就是,可以预防按键冲突,不会出现那种左脚踩右脚前进又上天的状态。
同时,添加新的状态,比如飞行、滑翔、游泳或者连招,只用新加状态,然后在状态内增加动画和操作即可,相对比较独立,操作起来也比较方便。
主要是学习了youtube上Indie Wafflus 老哥的思路,所以这一篇文章,也可以看作是我学习成果的整理。
实现逻辑
插件准备
在准备阶段,首先要。在unity中提前加载好Input Actions插件,这个插件用来处理键盘输入,从而实现键盘控制。
模型与动画
然后是模型准备和对应不同状态的动画准备。这里推荐直接去mixamo官网上下载已经做好的动画与模型,有其他的模型或者动作动画也行。
下载的时候格式一定是FBX for unity
代码
代码分类
基本上就是相机,人物,数据,状态机,再加个公用
5个大类。不过相机人物和功用主要是实现其他功能的,关于状态机,最基础的代码只需要两大类State和Data。
最基础的代码文件分两大类:
一个是State,一个是Data。
每个状态基本上要包含一个State和一个Data,分别对应着,进入这个状态之后所要进行的操作,和所需要的一些数据。
如下图
状态
最上层的是接地状态和空中状态
之后可能会加个水中状态,搓招的话也会在这一层再加一个招式状态。
接地状态
接地状态下的移动状态
接地状态下的停止状态
这是一个中间状态,做停止动作,从而过渡到待机状态。
着路状态,从高处落下、落地,用于从空中状态落地过渡到待机状态。
空中状态,主要是跳跃和坠落。
没做滑翔,但是滑翔的实现逻辑很简单,控制它降落的那个y轴的速度,让它在垂直轴上降的很慢,同时允许它前后左右移动空中转换视角等,再加上飞行的动画,就可以完成。
水中状态
也没有做水中状态,但是水中状态的实现逻辑也很简单,就是让角色的碰撞胶囊能检测出水碰撞层,只要检测到,就控制它的y轴悬浮,在垂直轴上保持不动,除非使用上下键进行调整。这样就可以实现在水中的漂浮,或者是在水中上下潜水。
招式状态
同样的逻辑招式状态也很简单。
按住对应的按键,进入招式状态,在状态中导入相应的动画特效镜头视角转换,和与外界环境的交互,还有伤害判定需求。
随手录了个展示视频:
随手录的Unity学习成果留档
结语
大体上就是这个逻辑,具体的代码文件我挂到github上
https://github.com/kunchenghanbao/movementSystem
因为是第1次做这么系统的东西,所以会有很多不足,而且有很多想法,想继续加进去扩展出来,所以等学习深入之后,我会继续进行修改和优化。