您的位置:首页 > 编程语言

代码创建动画状态机

2018-01-19 09:54 387 查看
Unity的动画状态机有以下一些特性:
1:动画状态机是无法直接获取到指定名称的状态的,这也就意味着,你不能加载一个已有的状态机,然后对其中的状态或状态连线做修改,只能是完全重新创建整个状态机。
2:在子状态机中,无法手动创建(Up)Base Layer节点到其他节点的连线。
3:假设有子状态机,play_anim和Jump_Fall 如下图:

当只有AnyState到play_anim的连线,没有其他状态连接到它,如下图:


当只有AnyState到play_anim的连线,没有其他状态连接到它,如下图:



此时(Up)Base Layer是没有到其他状态的连线的。
当没有AnyState状态连接到Jump_Fall,但有其他节点连接到它时,如下图:



此时可以看到(Up)BaseLayer自动连接到了Entry状态。此时AnyState状态也没有到其他状态的连线。
4:在子状态机中,如果想创建AnyState到其他节点的连线,需要调用如下语句:



machine是父状态机,forward是子状态,结果如下:



5:machine.AddStateMachineTransition()可以创建子状态机到子状态机,状态到子状态机,子状态机到状态的连线。
6:state.AddTransition()可以创建状态到子状态机,状态到状态的连线。
7:state.AddExitTransition()可以创建状态到Exit状态的连线。
8:如下图,在JumpFall状态机中,不需要手动添加Entry到fall的连线,系统会自动添加上,前提是fall状态是第一个被创建的自定义状态,一定要注意第一个被创建的状态就是该状态机的默认状态,Entry到此默认状态的连线时黄色的,如果手动添加,连线上会出现多箭头的情况。



如果想手动添加Entry连线到其他状态(非默认状态)的连线,则需要如下所示:



9:如下图,AddCondition添加一个转换条件,其中第一个参数为条件参数类型枚举。第三个参数为条件参数名。
如果条件参数类型枚举为less,Greater,Equals,NotEqual,则第二个参数的值为条件参数的值,表示Int或float类型参数。
如果条件参数类型枚举为If,IfNot,则第二个参数无作用,表示bool类型参数,If表示true,IfNot表示false,与参数的默认值无关。
如果条件参数为触发器类型,则条件参数类型枚举需要选择Equals,第二个参数无作用,填0即可。



10:在UI界面上,只有AnyState到其他节点的连线才会有canTransitionToSelf选项。:
11:创建控制器
AnimatorController.CreateAnimatorControllerAtPath
12:添加创建参数:



原来的API不带默认参数,我增加了扩展方法:

13:获取状态机
AnimatorControllerLayer layerBase = ctrl.layers[0];
AnimatorStateMachine machine = layerBase.stateMachine;
14:创建状态机,并设置AnyState,Entry,Exit,(UpBaseLayer)节点的位置:


添加状态:



15:所有节点的坐标是从左向右,从上到下依次增大。16:state.motion设置状态对应的clip文件。只有设置了clip文件,Settings里的属性才会自动变化,当然某些选项是需要用户手动编辑的,无法自动生成。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息