可解决的问题:避免角色处于某一状态后又因为玩家的其他操作使角色在进入这一状态的同时又进入了其它状态从而导致出现意想不到的bug以及角色动作违和的情况。
基本思路:创建一个状态机行为脚本,并在状态机行为脚本和角色控制脚本(PlayerController)中分别定义好角色需要避免进入的状态变量,当进入某一状态时就通过改变状态机行为脚本的状态变量值的方式向角色控制脚本发送避免进入某些状态的指令,当该状态退出时再将状态变量重置。
示例需求:当角色进入攻击状态后就不能再进入任何其它状态。操作过程及代码示例如下:
1.先在AttackState状态下创建添加一个PlayerInputStateController脚本:
2.在角色控制(PlayerController)和PlayerInputStateController脚本中定义需要避免进入的状态变量:
3.在PlayerInputStateController中的OnStateEnter以及OnStateExit方法中获取PlayerController脚本的引用并设置PlayerControllerr脚本中定义的状态变量值:
4.找到PlayerController脚本的角色攻击方法并加入状态开关,其它状态也可进行同样的操作:
5.代码写好后返回unity,此时AttackState状态下挂载的PlayerInputStateController脚本已经出现了刚才写好的状态开关,不想进入哪个状态就在哪个状态旁打勾即可:
6.如果需要对其它状态进行类似的处理只需要把这个PlayerInputStateController脚本再挂载到要处理的状态下并设置状态开关就可以了。
(小tips:创建PlayerInputStateController脚本时在相应状态的Inspector窗口中创建并添加即可,这样创建好后就会自动继承StateMachineBehaviour并写好需要的方法。日后整理代码只需要在项目里找到PlayerInputStateController脚本并把它拖到Scripts文件夹里就行。
)