角色跳跃,翻滚,前冲,RootMotion
继续补充角色的动作
在“Leevy”状态机里,Base Layer层,拖入“jump”动画。Parameters里新增 Trigger,"jump"。
在这里新增加一个判断条件,动作只能在地面上才能进行。因此,增加一个Parameters, bool型的"isGround",后面会进行检测。
从“ground”拉线到“jump”,取消勾选“Has Exit Time”,转态条件为“jump”,“isGround==true”,再拉状态到“ground”,默认即可。
“roll_back”,"rush"动作,操作同“jump”。
脚本控制:
《PlayerKeyInput》:
新增按键,信号
Update():
《PlayerController》:
到此,如果没有“isGround==true”条件,可以控制角色,跳,后翻,前冲。
而且,还有几个问题:
1.只有动作,没有位移。
2.按键累积,连续按两次跳跃键,这个信号会保存下来,依次触发完毕。
3.动作触发时,仍可以控制转向,位移等。
IsGround判断:《OnGroundSensor》
利用官方函数,Physics.OverlapCapsule(),来检测。
添加脚本《OnGroundSensor》:
《PlayerContoller》里添加两个方法接收:
清除累积信号:
在动画上添加Behaviour,在脚本里,有 Enter,Update,Exit,Move,Ik等函数。
在动画执行到改状态时,就会触发该函数。
在“ground”动画上,新增一个Behaviour,《FSMOnClearSignal》:
在base动画时,清除掉累积的Trigger信号。
这样就不会连续按跳跃键,就会跳好多次。而是,每次跳跃完毕,再次按才会触发跳跃。
翻滚时,不可控制角色转向,移动。
继续使用Behavior。新增脚本《FSMOnEnter》《FSMOnExit》《FSMOnUpdate》.
便可以控制该状态下的事件。
“jump” Animation下:
对应《PlayerController》添加函数,OnJumpEnter(),OnJumpExit().
“roll_back”,"rush"同“jump”。
使用动画自带位移
有的动画自带Root Motion冲量,是动画师制作时赋予的,是动作标准的位移量。可以利用这一点。
但是启用了Root Motion后,角色model和Player的位移量因为不一样而发生偏移。解决办法是通过脚本,获得动画的位移,并把它赋值给Palyer。
《RootMotionControl》: 主要函数 OnAnimatorMove().获得animator的位移量,装箱成Object
《PlayerContoller》里接收消息: 拆箱
然后赋值给Player的Rigidbody:
赋值后,清零,接收下一个动画的位移。