2013-02-26 16:22 2059人阅读 评论(0) 收藏 举报
unity3d 中动画的添加
 
http://unity3d.com/support/documentation/Manual/Character-Animation.html#AnimLayers
 
在unity3d中,我们能很方便的使用4个动画,默认的是走,跑,跳,待机动作,可当我们根据场景需要,添加其他动画时,会遇到一些问题,如动画只播放一帧。
 
附加的动画允许你覆盖其他正在播放的动画。当制作附加动画时,Unity 会计算动画中的第一帧和当前帧的不同。然后,Unity会播放刚刚计算出来的不同的帧。
 
实现方法一:
 
Additive animations allow you to overlay the effects of animation on top of any others that may be playing. When making additive animations, Unity will calculate the difference between the first frame in the animation clip and the current frame. Then it will apply this difference on top of all other playing animations.
 
Now you only have to make a lean-left and lean-right animation. Unity will then layer this animation on top of the walk, idle or run cycle.
 
Here is the code to make that happen:
 
private var leanLeft : AnimationState;private var leanRight : AnimationState;function Start (){   ZJdagou = animation["ZJdagou"];
//动画分层,给设置打狗的动画优先级为 2;
     ZJdagou.layer = 2;
}
function Update (){if(Input.GetKeyDown("p"))   // animation.CrossFade(); 把动画优先级设为最高。   animation.CrossFade("ZJdagou");  else  animation.CrossFade("ZJidle");}
实现方法二:
设置一个boolean变量来控制动画的播放。
var AnimationPlay:boolean=false;
function Update ()
{
if(Input.GetKeyDown("p"))
AnimationPlay=!AnimationPlay;
 
if(AnimationPlay)
animation.Play("ZJdagou"); 
}
总结问题的出现原因:
animation.Play()在播放动画时,是每一帧每一帧播放的,播放一个完整的连贯的动画 ,function Update(){} 函数是每一帧刷新时会自动执行的函数。而在主角上,我们已经拖了一个third person controller,里面也有一个update()函数来控制主角的走、跑、待机,等动作,通常情况下,主角的third person controller 的update()函数里的待机动作是ZJidle. 我们又写了一个代码来控制主角开门、打钩的动作,代码里也有update()函数,这样程序在每次刷新帧的时候就会执行两个update()函数,从第一个update()函数里的play切换到另一个update(){}函数里的play()函数。这就导致了动画的卡帧。
解决方法:
法一:
在另一函数中设置CrossFade,函数,给动画分层,这样在update()函数执行时,会自动的把third person controller 中update(){}函数里的动画淡出,淡入现在的动画。
法二:
在另一个函数中设置一个boolean标志位。third person controller 的update(){}到 我们写的函数的update(){},这样更新每一帧时,就会先触发third person controller()里的update()函数,再触发我们写的函数里的update()函数,由于我们的函数里面用了boolean变量来控制,unity会有记忆功能,先执行我们写的这个函数的update()函数。
Animation Blending
 
动画合成
 
现在的游戏,动画合成是一个必不可少的特征为确保角色有平滑的动画.动画师创建单个动画,如走路循环,跑步循环,空闲动画或射击动画.有些时候你的游戏需要能转换空闲动画到走路循环或反之.当然你不想要在运动中有突然的跳跃,你想要动画平滑转换.
 
就是动画合成到来的原因.在Unity你能在同一个角色身上有任意多个动画播放.所有的动画合成或添加到一起产生最终动画.
 
我们的第一步是使角色平稳合成空闲和走路动画.为了做这个我们使用简单的脚本,我们首先设置卷模式Wrap Mode的动画循环Loop.接着我们关闭自动播放使我们的脚本只有一个正在演奏的动画.
 
我们的第一个角色动画脚本十分简单;我们值需要一些方法知道我们的动画运行的速度,再减退走路和空闲动画.为了这个简单的测试我们使用pre-setup输入轴.
 
function Update ()
 
{ if (Input.GetAxis("Vertical") > 0.2)
 
animation.CrossFade ("walk");
 
else
 
animation.CrossFade ("idle");}
 
Animation Layers
 
动画层次
 
层次是一个令人惊讶的使用观念,允许你分组动画和区分权重.在Unity动画系统,你能混合你想要的任意多的动画片段.你能指定混合权重手动或简单的使用animation.CrossFade(),这是动画的自动权重.
 
混合权重总是正常的在应用之前
 
我们假定你有一个走路循环和一个跑步循环,每个都有权重为1(100%).当Unity产生最终动画他将恢复正常权重,意思是走路贡献为50%动画,跑步也贡献50%.
 
这很好,但是有时你想要区分2个同时演奏的动画那一个有更多的权重.当然你要确保权重之和为100%,但是他使用层次可以很容易的达到这个目的.
 
层次例子
 
一个例子,你可能有一个射击动画,一个空闲和走路循环.你将想要基于玩家的速度逐渐褪去走路和空闲的动画.但是当玩家开火你想要值展示开火动画.因此开火动画本质上有更高的权力.
 
简单的方法是保持走路和空闲动画在开火时.这样我们需要使开火的动画层次高于空闲和走路.意思是射击动画将有最高权重.走路和空闲动画只有在射击动画不使用100%混合权重使才能接收权重.所有当射击动画在CrossFading里,权重将从0开始一会到达100%.开始时走路和空闲层次将任然接收混合权重,知道射击动画完成逐渐增强,他们将不接收权重.我们需要严格执行!
 
function Start ()
 
{ // Set all animations to loop设置所有动画为循环状态
 
animation.wrapMode = WrapMode.Loop;
 
// except shooting除了射击
 
animation["shoot"].wrapMode = WrapMode.Once;
 
// Put idle and walk into lower layers (The default layer is always 0)放置空闲和走路到底层次(缺省为0)
 
// This will do two things这里做2件事
 
// Since shoot and idle/walk are in different layers they will not affect射击和空闲/走路在不同层次没影响
 
// each other's playback when calling CrossFade.当呼叫CrossFade重放每个
 
// Since shoot is in a higher layer, the animation will replace idle/walk射击在高层次,他取代空闲和走路
 
// animations when faded in.动画将逐渐增强
 
animation["shoot"].layer = 1;
 
// Stop animations that are already playing停止动画确实在演奏时
 
//(In case user forgot to disable play automatically)别忘了关闭自动播放
 
animation.Stop();}
 
function Update () {
 
// Based on the key that is pressed,基于按下键
 
// play the walk animation or the idle animation演奏走路或空闲动画
 
if (Mathf.Abs(Input.GetAxis("Vertical"))> 0.1)
 
animation.CrossFade("walk");
 
else
 
animation.CrossFade("idle");
 
// Shoot射击
 
if (Input.GetButtonDown ("Fire1"))
 
animation.CrossFade("shoot");}
 
缺省的animation.Play()和animation.CrossFade() 将停止或减弱动画在相同的层次.你想要避免这是严格的.在我们的射击,空闲,跑步例子,演奏空闲和跑步将不影响射击动画反之也可以(你可以改变行为通过设置一个参数给animation.CrossFade如果你想).
 
Additive Animations and Animation Mixing
 
添加动画和动画混合
 
添加动画和动画混合允许你减少你创建的游戏的动画数量,且很重要的创建面部动
 
我们假设你想要创建一个角色倾向一边当跑步和转弯时. 你已经有了走路和跑步循环,现在你要制作单独的左倾向走,右倾向走,左倾向跑,右倾向跑动画.
 
但是这样意味着你有翻倍数量的动画工作!创建一个庞大的动画数量不是可取的.添加动画和混合能解决
 
添加动画例子
 
添加动画允许你覆盖动画效果到另一个之上演奏.当使用添加动画,Unity将计算动画片段的第一帧和现在帧的不同.接着他将应用这种不同到所有其他动画
 
现在你值有偏左和偏右动画.Unity将放置这个动画层次高于走路,空闲或跑步循环.
 
这是制造这些的代码:
 
private var leanLeft : AnimationState;
 
private var leanRight : AnimationState;
 
function Start ()
 
{leanLeft = animation["leanLeft"];
 
leanRight = animation["leanRigh"];
 
// Put the leaning animation in a seperate layer设置偏向动画在指定层
 
// So that other calls to CrossFade won't affect it.所有呼叫CrossFade不会影响他
 
leanLeft.layer = 10;
 
leanRight.layer = 10;
 
// Set the lean animation to be additive设置偏向动画为添加物
 
leanLeft.blendMode = AnimationBlendMode.Additive;
 
leanRight.blendMode = AnimationBlendMode.Additive;
 
// Set the lean animation ClampForever设置偏向动画ClampForever
 
// With ClampForever animation's will not automatically设置ClampForever动画不自动播放
 
// stop when reaching the end of the clip停止当到片段最后
 
leanLeft.wrapMode = WrapMode.ClampForever;
 
leanRight.wrapMode = WrapMode.ClampForever;
 
// Enable the animation and fade it in completely激活动画和逐渐增强到完全
 
// We don't use animation.Play here because we manually adjust the time我们不使用animation.Play因为要手动调整时间
 
// in the Update function.在Update函数里
 
// Instead we just enable the animation and set it to full weight替代我们激活的动画和设置他为完全权重
 
leanRight.enabled = true;
 
leanLeft.enabled = true;
 
leanRight.weight = 1.0;
 
leanLeft.weight = 1.0;
 
// For testing just play run animation and loop it尝试运行动画和循环他
 
animation["walk"].wrapMode = WrapMode.Loop;
 
animation.Play("walk");}
 
// Every frame just set the normalized time每帧设置为正常时间
 
// based on how much lean we want to apply基于我们要应用的偏向有多少
 
function Update (){
 
var lean = Input.GetAxis("Horizontal");
 
// normalizedTime is 0 at the first frame and 1 at the last frame in the clip 。normalizedTime在片段的第一帧为0和在最后帧为1
 
leanLeft.normalizedTime = -lean;
 
leanRight.normalizedTime = lean;}
 
建议:当使用添加动画,关键是你既要使用没有添加动画在每个改变,又要使用添加动画,不同的是动画将在最后帧的结果上.这必然不是你想要的.
 
程序控制动画角色
 
有时你想要拉动你的角色骨骼通过程序.例如你可能想要你的角色的头看向3D空间的某点.这用脚本很好解决.幸好,Unity做这个很简单.在Unity所有的骨骼是改变驱使表皮网格.因此你能脚本骨骼角色,像其他游戏物体一样
 
要知道的一个很重要的事情是动画系统是在Update()函数之后更新改变,和在LateUpdate()函数之前被呼叫.因此如果你想要使用LookAt()函数,你要让他在LateUpdate()里面,以确保你的动画确实高于一切.
 
玩偶被创建有相同的方式.你直接附上刚体,角色联合和碰撞仓给不同的骨骼.这将为身体动画你的表皮角色.

unity3d 动画卡帧 动画合成 动画层次的更多相关文章

  1. performance面板使用,以及解决动画卡顿

    https://googlechrome.github.io/devtools-samples/jank//    官方案例 https://juejin.im/post/5b65105f518825 ...

  2. CSS3 动画卡顿性能优化解决方案--摘抄

    最近在开发小程序,与vue类似,它们都有生命周期这回事. onLoad 监听页面加载 onReady 监听页面初次渲染完成 onShow 监听页面显示 到底是什么意思? 所以这又触碰到了我的知识盲区, ...

  3. [工具] GIF 动画每帧合并到一张 PNG

    功能:将 GIF 动画每帧合并到一张 PNG 需求:配合 ImageMagick 图像处理软件. 下载:[工具]Gif2Png_Aone_1.0.0.zip 使用方法: 请到 ImageMagick  ...

  4. Android动画主要包含补间动画(Tween)View Animation、帧动画(Frame)Drawable Animation、以及属性动画Property Animation

    程序运行效果图: Android动画主要包含补间动画(Tween)View Animation.帧动画(Frame)Drawable Animation.以及属性动画Property Animatio ...

  5. Chrome 下动画卡顿问题的另一种可能

    [现象] 动画出现了明显的卡顿,且仅仅出现在 chrome 中. [原因排查] 一开始使用了css动画的时候已经出现了卡顿.找到如下的文章:CSS3 动画卡顿解决方案.深入浏览器理解CSS anima ...

  6. Android动画(一)-视图动画与帧动画

    项目中好久没用过动画了,所以关于动画的知识都忘光了.知识总是不用则忘.正好最近的版本要添加比较炫酷的动画效果,所以也借着这个机会,写博客来整理和总结关于动画的一些知识.也方便自己今后的查阅. Andr ...

  7. javascript 手势(swipeLeft,swipeRight)滑动中使用css3动画卡顿,开启硬件加速

    今天,在做一个移动端项目,遇到了css3动画卡顿的现象. 例图: 在手势滑动中(swipeLeft,swipeRight)遇到了动画卡顿的现象,最后使用了css3动画-webkit-transform ...

  8. Android开发——View动画、帧动画和属性动画详解

    0. 前言   Android动画是面试的时候经常被问到的话题.我们都知道Android动画分为三类:View动画.帧动画和属性动画. 先对这三种动画做一个概述: View动画是一种渐进式动画,通过图 ...

  9. CSS动画-step()帧动画

    Twitter使用了一种新的动画形式,使用一系列的图片来创建帧动画. 下面是一个❤动画,鼠标移动到上面开始绽放. .heart { width: 100px; height: 100px; backg ...

随机推荐

  1. [BZOJ1559]密码

    数据范围特别小,考虑状压DP 因为要求给定的字符串在母串中出现,所以可以用AC自动机辅助DP 因为AC自动机不能处理模式串互相包含的情况,所以先把互相包含的串去掉(暴力就行,数据范围太小) 因为要状压 ...

  2. 【指数型母函数】hdu1521 排列组合

    #include<cstdio> #include<cstring> using namespace std; int n,m,jiecheng[11]; double a[1 ...

  3. Delphi 7生成XML

    文件格式为: Day 制1課 U12 ASSY01 Wrist 1009 0 2018/05/18 09:35:59 Day 制1課 U12 ASSY02 Wrist 1010 0 2018/05/1 ...

  4. 使用IDEA创建package

    1)使用IDEA创建java工程 什么也不选,直接点击Next 无脑继续下一步 点击“Finish”完成工程的创建. 2)在使用IDEA创建了工程之后,首先选中“src”文件夹,然后 紧接着输入包名 ...

  5. 【转载】Mini2440启动配置文件说明

    对于mini2440,虽然root_qtopia这个文件系统的GUI是基于Qtopia的,但其初始化启动过程却是由大部分由busybox完成,Qtopia(qpe)只是在启动的最后阶段被开启. 由于默 ...

  6. 手把手教你使用FineUI开发一个b/s结构的取送货管理信息系统系列博文索引

    近阶段接到一些b/s类型的软件项目,但是团队成员之前大部分没有这方面的开发经验,于是自己选择了一套目前网上比较容易上手的开发框架(FineUI),计划录制一套视频讲座,来讲解如何利用FineUI快速开 ...

  7. String的解析

    String作为Java中最常用的引用类型,相对来说基本上都比较熟悉,无论在平时的编码过程中还是在笔试面试中,String都很受到青睐,然而,在使用String过程中,又有较多需要注意的细节之处. 1 ...

  8. 剪切Postscript图片中的多余边框

    最近用plplot画图,其cairo ps库生成的ps图片总是不能合理地剪切掉多余的边框,于是乎自己写了一个小脚本epscrop,用修改ps图的BoundingBox. #!/bin/bash # c ...

  9. Listener监听器之HttpSessionListener

    编写一个OnlineUserListener. package anni; import java.util.List; import javax.servlet.ServletContext; im ...

  10. Vue组件基础知识总结

    组件系统是Vue.js其中一个重要的概念,它提供了一种抽象,让我们可以使用独立可复用的小组件来构建大型应用,任意类型的应用界面都可以抽象为一个组件树. 那么什么是组件呢?组件可以扩展HTML元素,封装 ...