一个角色常常拥有多个可以在游戏中不同状态下调用的不同动作。例如,一个角色可以在等待时作揖,在得到命令时行走,从一个平台掉落时摔倒等。当这些动画回放时,使用脚本控制角色的动作是一个复杂的工作,Mecanim 动画系统借助动画状态机可以很简单地控制和序列化角色动画。
状态机对于动画的重要性在于它们可以很简单地通过较少的代码完成设计和更新,每个状态都有一个当前状态机在那个状态下将要播放的动作集合。这使动画师和设计师不必使用代码定义可能的角色动画和动作序列。
Mecanim 动画状态机提供了一种可以预览某个独立角色的所有相关动画剪辑集合的方式,并且允许在游戏中通过不同的事件触发不同的动作。动画状态机可以通过动画状态机窗口进行设置,如图7-6 所示。
图7-6 动画状态机
动画状态机之间的箭头标示两个动画之间的连接,过渡条件用于实现各个动画片段之间的逻辑,开发人员通过控制过渡条件可以实现动画的控制。要对过渡条件进行控制,就需要设置过渡条件参数,Mecanim动画系统支持的过渡条件参数有Float、Int、Bool和Trigger 4种。
状态机的基本思想是使角色在某一个给定时刻进行一个特定的动作,常用的动作有待机、走路、跑步、攻击和跳跃等,其中每一个动作被称为一种状态。一般来说,角色从一个状态立即切换到另外一个状态是需要一定限制条件的,即状态过渡条件。总之,将状态集合、状态过渡条件以及记录当前状态的变量放在一起,就组成了一个最简单的状态机。
(1)打开工程AnimationDemo,打开场景Ani,导入资源Teddy.unitypackage。在场景中创建一个Plane,把Plane放大3倍,即Scale属性设置为(3,1,3),并在场景中拖入unitychan和Teddy模型,如图7-7所示,并配置模型的Avatar。
图7-7 搭建场景
图7-8 设置动画组件属性
(2)创建动画状态机。Animator Controller是用来配置和储存动画状态,在Project视图中点击“Create”→“Animator Controller”命令,更名为“Chan”。在Hierarchy视图中选择unitychan游戏对象,将动画状态机Chan 赋值给该游戏对象的Animator 组件的Controller 属性,如图7-8所示。Animator 组件的具体参数如表7-1 所示。
表7-1 Animator 参数列表
双击动画状态机Chan,进入状态机,新创建Animator Control 都会自带3 种动画状态。
Any State(任意状态):是一个始终存在的特殊状态。它被应用于不管角色当前处于何种状态,都可以从当前状态进入另外一个指定状态的情形,这是一种为所有动画状态添加公共出口状态的便捷方法。
Entry(入口):动画状态机的入口,当游戏启动时,会自动切换到Entry的下一个状态;第一个拖到Animator视图的动画状态会默认连接到Entry上。可以在Animator视图通过右键动画状态“Set as Layer Default State”来更改其他Entry的过渡动画。
Exit(退出):退出当前动画状态机。
添加新的动画状态,可以在Animator 视图的空白处右击,依次选择“Create State”→“Empty”命令,也可以将Project视图中的动画拖入Animator视图中,从而创建一个包含该动画片段的动画状态。
在Project视图中,将“UnityChan”→“Animations”文件夹下的unitychan_WAIT01预制体下的WAIT01 动作,拖入状态机,如图7-9 所示。此时运行程序,会发现人物动起来了。
图7-9 设置状态机初始动画
图7-10 动画过渡
(3)设置Animation Transitions(动画过渡)。动画过渡是指由一个动画状态过渡到另外一个时发生的行为事件。需要注意的是,在一个特定时刻,只能进行一个动画过渡。两个动画的过渡连线可以在Animator 视图里,鼠标右击其中一个动画,选择“Make Transition”,把线连到另一个动画状态上,点击两个动画状态之前的过渡线,在Inspector 视图窗口,可以查看过渡的属性。
在Chan 状态机中再拖入RUN00_F 向前跑的动画,右击“WAIT01”→“Make Transition”→“RUN00_F”,同时添加动作返回的过渡,右击“RUN00_F”→“Make Transition“→“WAIT01”,如图7-10 所示。运行程序,观察状态机会发现,人物执行完站立的动作后,执行向前跑的动作,跑的动作执行完之后又返回执行站立的动作。
(4)使用代码控制角色的动画。用代码控制角色的动画,每种动画状态的转移,都是在一定的条件下被触发的。在默认情况下,它是通过设置该动画播放到某个位置上时触发下一个动画,在Animator窗口中任意选择一个Transition箭头,在Inspector窗口中可以看到动画转移的属性设置,如图7-11 所示。
Transitions:当前状态的过渡列表,可能包含当前动画的上一个动画和过渡的下一个动画。
Has Exit Time:当前的动画过渡不能被中断,即上一个动画没结束之前是不能切换到下一个动画状态。
Conditions:动画过渡条件。一个Condition 包括以下信息:一个事件参数,一个可选的条件,一个可选的参数值。还可以通过拖动该面板的动画剪辑可视化图标即拖动重叠区域的起始值和终止值来调节两个动画的过渡动作情况。每个动画都有自己的属性和状态,单击动画,可以更改它的属性,比如把“Speed”改2,则速度加倍,当然也可以改小,即慢动作。
按下来通过添加自定义变量,并使用代码控制变量值的改变,从而触发下一个动画的效果。
步骤一:在Animator 窗口的左边有一个Parameters 子栏,此子栏可以添加需要的变量,这些变量类型可以是Float、Int、Bool 和Trigger 类型。通过添加属性,为程序脚本提供一个接口,可以通过脚本修改这些变量来控制动画状态的播放和状态的转换。现在,点击Parameters旁边的加号,并选择Float类型,为该状态机添加一个Float类型的变量,并命名为“Speed”,如图7-12 所示。
图7-11 动画状态转移控制面板
图7-12 为状态机添加变量
步骤二:点击WAIT01到RUN00_F的过渡箭头,在Conditions中,添加条件“Speed”,在后面的属性中选择“Greater”,设置它的值为0.1,并取消勾选Has Exit Time,其意思是当Speed>0.1时,立即触发状态转移,无须等待动作执行完,如图7-13所示。同理,点击RUN00_F到WAIT01的过渡箭头,在Conditions中,添加条件“Speed”,在后面的属性中选择“Less”,设置它的值为0.1,并取消勾选Has Exit Time,其意思是当Speed<0.1时,立即触发状态转移,无须等待跑步动作执行完,如图7-14 所示。
图7-13 WAIT01 到RUN00_F 过渡参数
(www.xing528.com)
图7-14 RUN00_F 到WAIT01 过渡参数
步骤三:在Chan 状态机中再拖入WALK00_B 向后走的动画。并设置WAIT01 到WALK00_B的过渡条件为Speed<-0.1,WALK00_B到WAIT01的过渡条件为Speed>-0.1,并都取消勾选Has Exit Time,状态机如图7-15 所示。
图7-15 添加向后走动画
图7-16 变量赋值
步骤四:创建一个脚本“ChanAni”,挂载unitychan游戏对象,具体代码如下:
步骤五:选中unitychan游戏对象,在属性窗口中,将这个对象赋值给Ani变量,如图7-16所示。
步骤六:接下来制作更复杂的动画状态机,使得任何时候只要按下M 键就能激发受伤动作,受伤后执行站立动作。当角色在跑步状态时,按下空格键,角色执行跳跃的动作。在Chan状态机中再拖入JUMP00跳跃的动作。在Parameters面板中添加一个Trigger类型的参数“Jump”,并设置RUN00_F到JUMP00的过渡条件为Jump,并取消勾选Has Exit Time,同时WALK00_B到WAIT01 的过渡无条件。
在Chan状态机中再拖入DAMAGED01受伤的动作,在Parameters面板中添加一个Trigger类型的参数“Damage”,并设置Any State到DAMAGED01的过渡条件为Damage,DAMAGED01到WAIT01 的过渡无条件,如图7-17 所示,修改脚本“ChanAni”,具体代码如下:
图7-17 最终动画状态机
步骤七:将ChanAni脚本挂载给Teddy游戏对象,将Teddy赋值给Ani变量,同时将Chan的状态机赋值给Teddy的Animator组件的Controller属性,如图7-18所示。运行程序,Teddy就拥有了和unitychan一样的动作,如图7-19所示。
图7-18 设置Teddy属性
图7-19 游戏运行结果
图7-20 制作Dead 动画
(5)动画的剪辑。接下来对“DAMAGE01”动作进行剪辑,制作死亡的动作,让角色倒下去后不再起来。
步骤一:点击DAMAGE01 动画,在属性窗口点击“Edit”按钮,在Animations 面板中点击“+”,取名为“Dead”,如图7-20 所示。
步骤二:调整新增动画片段的帧数。预览受伤的动画,死亡的动作发生在47 帧左右,将死亡动作设置为0~47帧,点击“Apply”按钮,死亡动作生成,如图7-21所示。
步骤三:在Chan状态机中拖入Dead死亡的动作,在Parameters面板中添加一个Trigger类型的参数“Dead”,并设置Any State到Dead的过渡条件为Dead,实现任何状态下按下N键时触发死亡动作,如图7-22 所示。修改脚本“ChanAni”,执行程序,当按下N 键执行死亡的动作,角色不再起来,如图7-23 所示。添加代码如下:
图7-21 动画剪辑
图7-22 添加死亡状态
图7-23 执行死亡动作
图7-24 Dead 动画添加销毁事件
(6)给动画添加事件,实现玩家死亡动作播放后,从场景中销毁玩家。修改脚本“ChanAni”,添加如下代码:
接下来,双击动画状态机中Dead,在Events 属性窗口拖动红线,找到需要添加死亡事件的位置,然后点击Events 的“+”按钮,在Function 属性中输入死亡方法“ClearPlayer”,然后点击[Apply]按钮,如图7-24 所示。运行程序,当按下N 键时候,角色执行死亡动作,并在场景中消失。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。