毕业设计的坑--关于动作游戏的mecanim动画系统详细设计(4)

来源:互联网 发布:知乎 扶她出去吧 编辑:程序博客网 时间:2024/06/01 10:26

习惯性吐槽一下,上一篇的mvc设计模式的背包文章感觉自己写的太水了,其中的缺陷是没有用到委托,而且写的不详细

==========上面都是吐槽下================

加下来讲讲我花了很多时间研究的mecanim动画系统的设计


现在分开3部分详细说下动画系统的设计

1、行走与静止不动的情况(默认状态)

行走状态是途中的NewWalk。是用blendtree实现的。其中改变的条件是根据speed的转变而混合过度到其他种动画状态。跑动与动画的站立状态的动画通过speed控制。


附送上代码上的控制,利用M按钮键提高速度动画的播放速度也会变快(这里的代码我删减的了很多,主要是说明下speed控制blend tree的变化)

    public void Control_pc() {        if (animator)        {            //=================进行run动画播放===================            float curSpeed;            float vv = vertical * vertical;            float hh = horizontal * horizontal;            if (vv > hh)            {                curSpeed = vv;            }            else            {                curSpeed = hh;            }            animator.SetFloat("WalkSpeed", (curSpeed * runSpeedAni));//主要是这样设置速度然后控制动画            if (animator.GetCurrentAnimatorStateInfo(0).IsName("NewWalk"))            {                //只在能默认的状态下才进行实际的移动                //Debug.Log("oula角:" + camera.transform.rotation.eulerAngles.y);                this.transform.LookAt(this.transform.position + targetDir);                //Vector3 playerPostion = this.transform.position + targetDir;                //Vector3 camarePostion = camera.transform.forward;                //this.transform.LookAt(new Vector3(camarePostion.x, playerPostion.y, camarePostion.y));                cc.SimpleMove(transform.forward * Time.deltaTime * animator.GetFloat("WalkSpeed") * speed);            }            //=================控制是否跑动的状态===================            if (Input.GetKey(KeyCode.M))            {                runSpeedAni = runSpeedAniMax;            }            else            {                runSpeedAni = 1f;            }        }    }


2、攻击重击与三连击 (按钮触发下的状态,由默认状态转过去的)


其中值的说明的是三连攻击的做法是利用到动画时间了event时间做到的


在里面那段时间内才可以触发下一个trigger。


还有一个值的注意的是,这里有几个配置很重要值的去看下

exit time打断时间(从哪一帧开始逐渐降低当前动画的权重)(exitTime 是百分比 0.9播放到90%的时候跳到下一个动作)

fixed duration固定持续时间(这其实是一个切换开关,切换是按照秒显示还是按照百分比显示)

transition duration过度持续时间 (过度有多长)

transitionoffset过度抵消(从下一个动画的什么位置开始播放)

interruption source中断来源。


附上代码

    public void OnAttackA() {        if (animator.GetCurrentAnimatorStateInfo(0).IsName("Sword-Attack1") && attackBCombo == true)        {            animator.SetTrigger("Attack2");        }        else if (animator.GetCurrentAnimatorStateInfo(0).IsName("Sword-Attack2") && attackCCombo == true)        {            animator.SetTrigger("Attack3");        }        else{            animator.SetTrigger("Attack1");        }    }


3、受伤动画与死亡动画(特殊状态下的转换,可打破前两种动画状态)


这种状态下的其实跟上个差不多 ,我就不详细介绍了


=====至此,mecanim还有一个强大的功能(上半身体与下半身体动画分开播放)==========

这个功能就是Cs走动+换枪的动画播放。别跟我说你没玩过CS


创建Avater Mask就可以了,操作跟那个什么的一毛一样,

animator.layerCount >= 2 //就这个很值的去看看

            if (Input.GetKeyDown(KeyCode.N) && animator.layerCount >= 2 && isCodingSkill1 == false)            {                //存在两个层的情况下                isCodingSkill1 = true;                animator.SetTrigger("Skill1");            }


===========零散的注意下===========

apply root motion可以允许人物动画调节


这些设置都是关于动画状态是否控制transfrom的旋转个坐标的影响。

===================呼!一气呵成===================

0 0