闲置动画是一个非常常用的一个动画,单一的闲置动画会让人物动作显得僵硬,所以一个随机的闲置动画系统可以改变这一个情况。
用到的资源是Unity Asset Store中的Unity Chan,Chan是酱的意思,这里是Unity酱!!!
Unity酱,有5个闲置动画,导入到项目中可以看到。
我们将使用这5个动画构成一个完整的闲置系统。
其中HashIDs这个脚本不是必须的,制作随机系统的时候也没有用到。
Character Controller相当于Capsule Collider + Rigidbody,这里不做过多介绍。
接下来进入正题从Animator Controller开始制作。
我们这里会用到RandomIdle变量(int类型),Speed可以作为控制退出闲置的一个条件。我们首先创建的是Sub-State Machine
这个创建出来的就是一个六边形的State,然后我们Make Transition连接到这个六边形的State,并且将这个六边形State重命名为IdleSM,然后双击打开这个IdleSM。然后将我们的闲置动画全部添加到IdleSM中,整理后,得到下图。
接下来连接transition,先不要急着设置每一个transition,这个我们之后再来处理,连接好之后如下所示。
首先对这些蓝色的transition进行设置,将Has Exit Time取消勾选。
这里主要是为了能够随时退出这个子系统。接下来给这些退出,添加一个条件进行触发,将Speed设置为大于0.1,也就是希望人物只要处于移动状态就不会进入到我们的闲置系统中。
接下来对这四个transition进行设置。
我们使用RandomIdle来控制这些transition。
最后记着将默认的RandomIdle随机值设置为-1。
接下来需要设置一个脚本来控制这个随机数值。这个脚本是挂载在一个State上的,继承的是StateMachineBehaviour。选中WAIT00这个是最常用的闲置状态,点击Add Behavior,添加一个脚本,我们命名为RandomIdleState。
接下来对这个RandomIdleState的脚本内容进行编写。
我们编写两个部分的内容,一个是OnStateEnter,一个是OnStateUpdate。
首先我们先声明几个变量
numberOfStates表示有几个可以转换的闲置动画,这里我们有四个可以切换的。
minNormTime表示最小的在WAIT00停留的时间,用于随机。
maxNormTime表示最大的在WAIT00停留的时间,用于随机。
m_RandomNormTime表示在WAIT00停留的时间,是随机的结果。
m_HashRandomIdle是RandomIdle的HashID,用来代替String的设置提高运行效率的。
首先是OnStateEnter,当我们进入到WAIT00状态的时候,我们要随机一个在这个状态维持的时间出来,便于我们记录什么经过多少时间切换。
这个函数中只写了一个在最大最小值之间随机的一个函数。
这里可以直接照抄,第一个if主要是判断动画离开WAIT00时,将RandomIdle设置回-1,以方便下次进入这个状态时使用,这里的离开包括进入到其他WAIT状态和直接退出整个随机闲置系统。
第二个if就是用来随机我们的RandomIdle的值的。当在WAIT00待的时间>随机的维持时间,随机一个值,切换到其他的WAIT状态。
至此整个随机闲置的系统都完成了,效果可以看视频,压缩成gif分辨率太低了。
看完文章和视频后给个三连哦!!!
彩紫睨羽