Unity-Animator深入系列---FAQ

回到 Animator深入系列总目录

 

 

Q: 如果想做角色负伤的一套动画,但是又和原有状态机不冲突,只是想换动画剪辑,应该怎么办?

 

A:

新建一个层,设置为同步模式。这时候你不能在同步层添加状态,但你可以替换动画剪辑。

官方的解释是:

Sometimes it is useful to be able to re-use the same state machine in different layers. For example if you want to simulate "wounded" behavior, and have "wounded" animations for walk / run / jump instead of the "healthy" ones. You can click the Sync checkbox on one of your layers, and then select the layer you want to sync with. The state machine structure will then be the same, but the actual animation clips used by the states will be distinct.

有些时候在不同层中能够重用一些相同的状态机是很有用的。比如:如果你希望模拟一个“负伤”的行为,并且这个“负伤”的动画是为代替走动/跑动/跳动中“健康”(的动画)。你可以点击某个层上的“同步”(Sync)复选框,并且选择你希望同步的那一层。这样的话,这些状态机结构将会保持一致,但是实际的动画剪辑会有区别。

 

此外,使用同步层有2个问题需要注意:

1.开启多个层会使动画事件也触发多次。除非层的权重为0,比较简单的处理方法是对多余的事件做屏蔽操作。

2.代码中改变状态等操作,全部使用映射层,用同步层去操作会出现警告提示。

 

 

Q: 公用状态机还是单独配置状态机?

A:村民之类的角色可以公用状态机,Unity有一个Animator Override Controller(Project面板下,右键创建里)。用这个来重写公用状态机的动画文件。

而主角没办法,只能单独配置状态机,最后策划在表里填写用哪一个控制器文件,控制器文件可以经过Resources载入

 

Q: 位移如何通过状态机的变量而改变长度?

A: 游戏中可能你角色力量值高一些,位移就长一些。解决方法有很多可以用StateMachineBehaviour,在OnAnimatorMove中添加附加移动值,这种最为直观

可以参考这篇:LINK

 

Q: 使用Animator时,以前Animation的事件去哪了?

A:选中带动画的模型(就是@后缀),Inspector里第三个页签Animations-最下方Events

 

Q: 角色连技难道要手动链接状态吗?

A:可以用.CrossFade(...)接口自行去实现逻辑,关于CrossFade可以看这个LINK

(2017/10/05补充:如果要完全运行时可配置,可以用Playable API (Playable API Practice)

 

Q:Animator打开根骨骼位移后,动画一直向上飘?

A:原因可能是当前状态没有加动画剪辑去控制根骨骼,可以加一个idle动画,默认播放这个idle动画

 

Q:如何实现Animator的动画倒播?

A:比较麻烦,可以参考我的这篇文章:LINK

 

Q:根骨骼坐标被锁定,不可修改?

A:在Animator初始化时候会锁定一次根骨骼坐标,重置好坐标,调用Rebind()即可解决

 

Q:一帧内调用CrossFade先后播放2个状态,第二个状态不执行?

A:Animator默认混合结束之后才算进入第二个状态,比如在Idle状态,进入Run状态。这时同一帧内或者短时间内再回到Idle,由于混合没有结束,未到达Run之前还在Idle,就会无效

最后会发现还在Run状态,没回去

 

Q:Animator挂载的节点下,某个节点Active状态被锁定

A:原因是AnimationController里用了某个K了Active动画的剪辑,即使这个剪辑没有参与到混合,也会导致Animator记录初始值

 

Q:Animator中用了同步层(Sync Layer),但混合树(Blend Tree)不能被同步怎么办?

A:可以写一个编辑器脚本外部创建混合树文件,因为同步层motion资源是可以单独自定义的。

AssetDatabase.CreateAsset(new UnityEditor.Animations.BlendTree(), savedPath);
AssetDatabase.SaveAssets();
AssetDatabase.Refresh();

 

posted @ 2016-01-04 09:06  HONT  阅读(2299)  评论(0编辑  收藏  举报