习惯性吐槽一下,上一篇的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的旋转个坐标的影响。
===================呼!一气呵成===================