也许这一篇文章的内容有点枯燥,但我要说的是如果你想深入的了解游戏引擎是如何处理动画片断或者素材并

让玩家操控的角色动起来栩栩如生,那么这真是一篇好文章(当然我仅仅是翻译了一下)
 

动画脚本 Animation Scripting

Unity's 动画系统允许你创建一个漂亮的动画蒙皮角色. 动画系统支持动画融合,混合,添加动画,步调周期时间同步.动画层.控制动画回放的所有方面(时间,速度,混合权重) 每个顶点有1.2.4个骨骼影响的mesh,基于物理系统的布娃娃系统,另外还有程序动画.为了获得最佳效果推荐您在制作模型和动画绑定前阅读一下 Modeling Optimized Characters 章节.

制作一个动画角色主要包括两个方面; 在世界中移动  由此产生的动画. 如果你想了解角色移动相关的更多内容, 请参阅Character Controller page.   实际上角色动画是由Unity's 脚本界面完成的 .

你可以下载 example demos 中预设置好的动画角色. 当你学完本页的基础部分你还可以看一看 animation script interface.

如果需要你可以点击并快速转到以下主题:

·         Animation Blending    动画融合

·         Animation Layers      动画层

·         Animation Mixing       动画混合

·         Additive Animation      附加动画

·         Procedural Animation    程序动画

·         Animation Playback 和 Sampling   动画重放和取样

Animation Blending 动画融合

在现今的游戏中Animation Blending是一项保证游戏动画顺畅过渡的基本的特性.动画师创建的动画例如: walk循环, run 循环, idle原地空闲动画 或射击动画.在游戏的任何时间点你都有可能从空闲站立转换到走动,反之亦然. 当然你不希望两个不同的动作之间突然跳转, 你需要动画平滑过渡.

而这个问题的解决就依赖动画融合技术. 在Unity中你可以让同一个角色拥有任意数量的动画.所有这些动画融合添加成为一个总的动画.

首先我们来为一个角色添加两个动画原地空闲站立和走动并平滑的使这两个动画过渡. 为了使我们在写脚本时简单些, 首先我们设置动画的 Wrap Mode为 Loop. 然后关闭 Play Automatically来让我们的脚本来独占动画的播放.

我们第一个动画脚本很简单; 我们需要一些方法来探查角色移动的有多快, 然后在走和站立之间淡入淡出. 在这个简单的测试中我们使用 pre-setup input axes.

function Update () {

if (Input.GetAxis("Vertical") > 0.2)

animation.CrossFade ("walk");

else

animation.CrossFade ("idle");

}

下面我们来让这个脚本运行:

1.       创建一个js脚本 Assets->Create Other->Javascript.

2.       把代码拷贝进去

3.       把脚本拖拽给角色 character (It needs to be the same GameObject as the animation)

点击Play 按钮, 当你按上下键时角色会走动,松开上下键时角色站立不动.

动画层Animation Layers

层是一个非常有用的概念它可以让你将动画片段任意成组并且区分优先顺序.

在Unity's动画系统中, 你可以混合任意数量的动画片段. 你可以手工分配权重或者直接使用animation.CrossFade(),来自动分配权重.

混合权重混合权重总是在应用前被规格化 normalized

比如说我们现在有一个 walk cycle 和一个run cycle, 权重都是1 (100%).当unity计算最终动画时会规格化权重, 这意味着walk占50% 权重,   run cycle占50% 权重.

这在大多数情况下都是不错的, 但当两个动画片段同时运行而其中一个权重明显大于另外一个. 那么你需要手动调整权重值,但如果你使用动画层来解决这个问题过程会容易得多.

制作动画层的范例Layering Example

例如现在你有一个射击动画, 一个空闲站立,一个走动循环  . 你需要在走和站两个动作间持续的淡入淡出(在玩家走动速度的基础上) 但当玩家射击时我们只想展示射击动画. 因而射击动画此时的优先度最高.

为了达到这一目的最简单的方法是在射击时简单的保持 walk 和 idle动画. 接下来需要确定shoot animation在一个比idle 和walk更高的层. 这意味着shoot animation 将首先收到混合权重.   walk 和idle 只有在 shoot animation不使用 100% 混合权重的情况下接收权重. 所以当 CrossFading the shoot animation in, 权重将从0开始很短时间内到达 100%. 在开始阶段 walk 和idle 层将依然可以收到混合权重 但当 shoot animation 完全切入时, 他们就收不到权重了.  这才是我们需要的!

function Start () {

// Set all animations to loop 设置所有动画为循环

animation.wrapMode = WrapMode.Loop;

// except shooting 除了射击(不循环)

animation["shoot"].wrapMode = WrapMode.Once;

//放置idle 和 walk 进低一级别的 layers  (默认 layer 总是 0)

// This will do two things这将作两件事情

// - 当 calling CrossFade时,

Unity3d动画脚本 Animation Scripting(深入了解游戏引擎中的动画处理原理)的更多相关文章

  1. 游戏引擎中三大及时光照渲染方法介绍(以unity3d为例)

    (转)游戏引擎中三大及时光照渲染方法介绍(以unity3d为例)   重要:在目前市面上常见的游戏引擎中,主要采用以下三种灯光实现方式: 顶点照明渲染路径细节 Vertex Lit Rendering ...

  2. (转)游戏引擎中三大及时光照渲染方法介绍(以unity3d为例)

    重要:在目前市面上常见的游戏引擎中,主要采用以下三种灯光实现方式: 顶点照明渲染路径细节 Vertex Lit Rendering Path Details 正向渲染路径细节 Forward Rend ...

  3. 安卓开发20:动画之Animation 详细使用-主要通过java代码实现动画效果

    AlphaAnimation 透明效果实现: activity_main.xml中仅仅是一个简单的图片,下面的例子都会使用这个xml: <RelativeLayout xmlns:android ...

  4. 3D游戏引擎中常见的三维场景管理方法

    对于一个有很多物体的3D场景来说,渲染这个场景最简单的方式就是用一个List将这些物体进行存储,并送入GPU进行渲染.当然,这种做法在效率上来说是相当低下的,因为真正需要渲染的物体应该是视椎体内的物体 ...

  5. 《Genesis-3D开源游戏引擎--横版格斗游戏制作教程02:关键帧动画导入与切割》

    2. 关键帧动画导入与切割 动画的分割与导入概述: 在游戏当中,游戏角色在不同状态下会有不同的动作,这些动作在引擎里相当于一段段的动画片段.当导入模型资源的时候,连同模型动画都会一并导入到引擎中.开发 ...

  6. unity从模型中抽取动画文件(animation)

    http://www.cnblogs.com/leng-yuye/archive/2013/01/11/2856144.html 由于模型是由第三方的软件制作的,用unity不能直接编辑模型里的动画文 ...

  7. 第一章-第二题Unity3D游戏引擎相关--By林培文

    1) 此类软件是什么时候开始出现的, 这些软件是怎么说服你(陌生人)成为他们的用户的?  他们的目标都是盈利么?  他们的目标都是赚取用户的现金么?还是别的? 2004年,Unity3D诞生于丹麦哥本 ...

  8. 微信小程序:动画(Animation)

    简单总结一下微信动画的实现及执行步骤. 一.实现方式 官方文档是这样说的:①创建一个动画实例 animation.②调用实例的方法来描述动画.③最后通过动画实例的 export 方法导出动画数据传递给 ...

  9. .net mvc 站点自带简易SSL加密传输 Word报告自动生成(例如 导出数据库结构) 微信小程序:动画(Animation) SignalR 设计理念(一) ASP.NET -- WebForm -- ViewState ASP.NET -- 一般处理程序ashx 常用到的一些js方法,记录一下 CryptoJS与C#AES加解密互转

    .net mvc 站点自带简易SSL加密传输   因项目需要,传输数据需要加密,因此有了一些经验,现简易抽出来分享! 请求:前端cryptojs用rsa/aes 或 rsa/des加密,后端.net ...

随机推荐

  1. JS适配问题。

    动画requestAnimFrame + cancelAnimationFrame window.requestAnimFrame = (function(){ return window.reque ...

  2. Mysql数据库的使用经验总结

    1. 对mysql插入中文的时候显示乱码,搞了很多天,把服务端.客户端和数据库的编码全改为u8了又重新创建数据库和表还是不行,到最后却发现没有乱码!原来只是windows的cmd没有支持u8,换个客户 ...

  3. apache相关

    http://hw1287789687.iteye.com/blog/2212292 http://enable-cors.org/server_apache.html http://blog.sin ...

  4. web语义化与h5新增标签

    Web语义化就是html告诉我们也告诉机器这一块是什么内容,例如:“这行是一个标题,这几行组成一个段落,这是一个列表,那是一个链接.”   Web语义化有三个阶段: 1.h1~h6.thead.ul. ...

  5. Add Binary <leetcode>

    Given two binary strings, return their sum (also a binary string). For example,a = "11"b = ...

  6. PHP基本问题

    WampServer修改端口及菜单Localhost http://www.wuwenhui.cn/3047.html WAMPServer默认配置更改-web根目录 http://blog.csdn ...

  7. swift 取出中间文本

    func  stringmid (wholestring:String,front:String,behind:String)->String { if wholestring.isEmpty ...

  8. android 编译错误 com/android/dx/command/dexer/Main : Unsupported major.minor version 52.0

    解决方案一: JDK版本不一致造成的,指的是高版本的JDK编译的class不能放在低版本的JDK上运行. 如果是Version 52,就表示JDK8编译的class不能运行在JDK7上,所以需要在本地 ...

  9. 02-JAVA中的基本语法

    第一个动手动脑: 首先用枚举类型定义两个变量,然后判断两个变量是否引用同一对象,在判断枚举类型是否是原始数据类型,再从字符串中转换,最后列出所有的对象. 很明显,这两个变量都是枚举类型,但是这两个变量 ...

  10. mysql的一个特殊问题 you can't specify target table 'cpn_regist' for update in FROM clause

    今天在操作数据库的时候遇到了一个问题,sql语句如下: UPDATE cpn_yogurt_registration SET dep1Name = '1' WHERE `key` in  (SELEC ...