状态机的设计
最初的设计很乱, 每个状态的切入切出都是靠一个Boolean值控制的, 比如 isRun,isAttack,isSkillAttack 等等.
当由A状态切换到B状态时候, 需要将除了控制A状态的Boolean都设置为False,仅将A状态设置为True.
参考了一些视频教程,发现用一个int值做这种互斥的设计会非常好,并且可以灵活的运用 Entry 和 Exit State. 将状态机设计的更清晰
同时 使用Sub-State 将Idel和Run放在下一层, 整体更加整洁.
并且对于后期增加或减少新的状态 很方便. 总之好处多多吧.
脚部动画制作
脚部动画使用的是2D的BlendTree, 用两个参数(垂直和水平) 去控制腿部使用哪个动画
当角色正好向前看时候, 可以直接将input的Vertical和Horizontal 值作为BlendTree的参数传入即可
但是当角色需要面向方块时候, Input传入的值是世界坐标(黄色箭头), 需要把这个值转换到角色的局部坐标系下(红色坐标).从而算出 水平和垂直方向的 分量来.
将问题数学化,且改变为一个方便计算的样式
o点为角色所在位置,红色圆圈为单位圆.
角色朝向方块,与单位圆相交的一点为A,
玩家只是右移键,所以世界坐标系下移动方向和单位圆相交一点为B
向量A'O 为 移动方向在 角色局部坐标系下 Z轴方向投影,
向量BA' 为 移动方向在 角色局部坐标系下 X轴方向投影,
对于向量A'O的 求解 可以简化为 : 求某向量A 在向量B上的投影, 具体的数学公式 可参照 这个帖子
而一旦求解出A'O 以后 对于BA'的求解 就变得简单了 BA' = BO-A'O (向量的加减法)
因为已经是单位向量了, 所以直接将结果作为BlendTree的参数 传入即可.