查看: 4271|回复: 2
打印 上一主题 下一主题

[教程] Unity3D中角色的动画脚本的编写(三)

[复制链接]

21

主题

7

听众

651

积分

初级设计师

Rank: 3Rank: 3

纳金币
0
精华
3

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

跳转到指定楼层
楼主
发表于 2012-11-11 15:06:31 |只看该作者 |倒序浏览
          在上一篇,我们具体的讲解了有关动画的融合,也提到了有关动画状态的权重问题。那么这次,我来以一个例子的形式来向大家讲解动画的叠加,或许会涉及到多方面的知识,我力求一次讲清。好了,我们开始吧!

        首先我们必须新建一个工程,我取名为:AnimaitonTestTuriol。我们需要一个模型,这里我刚好从从官方的
CharacterAnimation这个工程中抠出了一个:Soldier。然后我将其导入到了次工程文件夹下面的,然后简单的错了一个场景,取名为:AnimationAdditive,下图就是我们的工程预览:



然后我们新建一个名为CustomScripts的文件夹,用于存放我们接下来要建立的脚本文件。
        我们此次的目的是要能够在脚本中熟练运用动画的叠加方法。那么什么是动画的叠加呢?所谓动画的叠加,就是指我们可以在任意动画上面来叠加动画效果。这就非常棒了,因为这项功能可以削减美术为游戏角色创建的动画片段的数量,既减小了工程所占用空间的大小,又对简化了我们的代码编写。官方举了一个例子,大体上是这样的:加入我们有一个角色,具备基本的“站立”,“跑步”,“左倾”,“右倾”的动画,我们还想让其在跑步图中转身时有一种倾斜的效果,比如左转弯时不只是播放跑步的动画,而且还叠加了一个左倾的(或者右倾的)动画。如果我们不用叠加,那么我们势必会多创建两个动画效果:“跑步时左倾”,“跑步时右倾”。一旦有了动画的叠加,我们根本就不需要去做这两个动画片段,厉害吧!那么我们该怎么去实现这个呢?
        我们首先要知道怎么去叠加动画,为此,我们必须了解一下这个属性:AnimationState.blendMode,即混合模式。此属性的返回值类型为AnimationBlendMode ,我们看文档:


这里只有两个变量:Blend和Additive。在默认状态下,Animation组件所管理的每个动画状态的混合模式都是:
AnimationBlendMode.Blend,即融合模式,我们只有在程序中才能对其进行相应的修改。如果你将此动画模式修改成了Additive,那么你的这个动画状态就具备叠加到其他动画上的功能了,此时你只需动态的调节这两个动画状态之间的权重就可以产生相应的叠加动画了。下面我来编写一个试验性的脚本来证明我们的猜想,我为这个脚本取名为:
AdditiveAnimaitonTest1,代码如下:

using UnityEngine;
using System.Collections;
public class AdditiveAnimaitonTest1 : MonoBehaviour {

        private AnimationState***n;
        private AnimationState leanLeft;
        
void Start () {
        animation.wrapMode = WrapMode.Loop;//声明各动画状态的播放方式为循环模式

       ***n = animation["***nSlow"];//实例化成员变量
        leanLeft = animation["leanLeft"];

        if ***n)
        {
           ***n.weight = 1f;//设定动画状***n的混合权重为1
           ***n.layer = 10;//让这个动画状态的layer为最高层10
           ***n.enabled = ***e;//启用此动画状态
        }

        if (leanLeft)
        {
            leanLeft.weight = 1f;
            leanLeft.layer = 10;//让此动画状态***n为同一层,又由于此动画状体的混合权重也为1,那么其获得动画混合权重的几率***n一样
            leanLeft.enabled = ***e;//启用此动画状态
            leanLeft.blendMode = AnimationBlendMode.Additive;//将此动画状态设定为叠加模式
        }
      }
   
    void OnGUI()
    {

        GUILayout.BeginHorizontal();//利用拖动条来控制每种动画状体的权重

       ***n.weight = GUILayout.VerticalSlider***n.weight,1.0f,0.0f);
        
        leanLeft.weight = GUILayout.VerticalSlider(leanLeft.weight, 1.0f, 0.0f);

        GUILayout.EndHorizontal();
      
    }
}

上面的代码比较少,可是里面所涉及到的内容却并不那么容易理解。因为这次我们不是靠明显代码来播放动画,而是依靠调节权重来实现的。为了理解这个方法的原理,我们必须明白一个结论:假如一个动画状态被激活了,例如:animation["idle"].enable = ***e ,那么此动画就会处于播放状态(此时没有执行类似:
animation.Play或者animation.CrossFade之类的语句)。不信的话你可以在上面的Start()函数中写下以下语句:

if(animation.IsPlaying("idle")){
       Debug.Log("idle is***nning!");
}


if(animation.IsPlaying("leanLeft ")){
       Debug.Log(" leanLeft  is***nning!");
}

我相信第二个if语句中的Debug会被打印出来,而第一个则不会,不信你试试。
好了,我们运行一下游戏吧!


我们试着调节一下Game视图中的垂直滚动条,可以发现,动画的效果改变了:



我想读者一定按捺不住现在的心情了。我们成功的将左倾动画与跑步动画给叠加起来了,虽然例子很简单,但是我想我们应该可以叠加更多的动画了。希望读者能够认真体会。还有一点,官方CharacterAnimation工程中的第四个场景中的代码完整的展现了动画叠加的精髓,我的这个Solider就是从这个场景中抠出来的,感兴趣的读者不妨分析一下里面的代码,保证获益颇丰。如对本篇难以理解的不让留个言,或者加qq:1597725465,本人一定亲囊相受。下一篇,我准备介绍一下“动画混合”,他是可以将某个动画片段加到角色的某个部位的,非常神奇,但也有一些限制因素。敬请期待我的下一篇文章!

分享到: QQ好友和群QQ好友和群 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
转播转播0 分享淘帖0 收藏收藏0 支持支持0 反对反对0
回复

使用道具 举报

may    

8830

主题

81

听众

7万

积分

首席设计师

Rank: 8Rank: 8

纳金币
52352
精华
343

最佳新人 热心会员 灌水之王 活跃会员 突出贡献 荣誉管理 论坛元老

沙发
发表于 2012-11-30 03:58:50 |只看该作者
支持一下楼主
回复

使用道具 举报

0

主题

1

听众

329

积分

设计实习生

Rank: 2

纳金币
2
精华
0

最佳新人

板凳
发表于 2013-12-28 23:25:33 |只看该作者
学习了,呵呵!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

手机版|纳金网 ( 闽ICP备2021016425号-2/3

GMT+8, 2025-8-8 10:13 , Processed in 0.067112 second(s), 30 queries .

Powered by Discuz!-创意设计 X2.5

© 2008-2019 Narkii Inc.

回顶部